自2022年3月29日以来,USERMODE支持已被删除。支持USERMODE的最终版本是E2F159F8F。请在Usermode中使用VC-LTL5。
ucxxrt是基于MSVC的开源运行时库。该项目的重点是它在内核模式驱动程序中的可用性,它为您提供了与在C ++中开发用户模式应用程序几乎相同的体验。
在ucxxrt诞生之前,要在内核模式驱动程序中使用C ++ STL,用户必须制作自己的模板库(例如KTL,USTD,...)。仍然有几个问题。就像它不支持C ++异常一样,主要是,当C ++ ISO标准更新时,实现新语言功能的时间很大。
然后ucxxrt出生。
ucxxrt如何工作在开发内核模式驱动程序时,使用属性表可以禁用内核模式标志,并强行使编译器支持C ++异常。还启用了异常标志( /EHsc )。
实施异常功能,例如throw , catch 。在throw中模拟异常调度程序,并在回调函数中处理异常。
当前不受支持的功能的列表↓
有关更多信息,请参见Unitest项目。
void Test$ThrowUnknow()
{
try
{
try
{
try
{
throw std::wstring ();
}
catch ( int & e)
{
ASSERT ( false );
LOG (DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, " Catch Exception: %d n " , e);
}
}
catch (std::string& e)
{
ASSERT ( false );
LOG (DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, " Catch Exception: %s n " , e. c_str ());
}
}
catch (...)
{
LOG (DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, " Catch Exception: ... n " );
}
}
void Test$HashMap()
{
auto Rand = std::mt19937_64 (:: rand ());
auto Map = std::unordered_map< uint32_t , std::string>();
for ( auto i = 0u ; i < 10 ; ++i)
{
Map[i] = std::to_string ( Rand ());
}
for ( const auto & Item : Map)
{
LOG (DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL,
" map[%ld] = %s n " , Item. first , Item. second . c_str ());
}
}首先,将DriverEntry重命名为DriverMain 。
右键单击该项目,选择“管理Nuget软件包”。搜索ucxxrt ,选择适合您的版本,然后单击“安装”。
从发行版中下载最新的软件包并解压缩。
将属性表ucxxrt.props添加到您的项目中。
IDE:Visual Studio 2022最新版本
和Windows SDK
和Windows驱动程序套件
git clone --recurse-submodules https://github.com/MiroKaku/ucxxrt.git
打开ucxxrt.sln并构建。
对于Clang-CL或LLVM-MSVC,您必须在编译器标志中添加-march=native 。
感谢JetBrains为我的开源项目提供免费许可证,例如Resmanper C ++。
非常感谢这些出色的项目。没有它们的存在,就不会有
ucxxrt。