Universal C++ RunTime (UCXXRT)
July 12, 2024 · View on GitHub
----
Musa.Runtime is available, ucxxrt is no longer providing support!!!
Musa.Runtime is the implementation of the new architecture of ucxxrt.
Fewer changes, more features and standard libraries support.
UserMode support has been removed since March 29th, 2022. The final version known to support UserMode is e2f159f8f. Please use VC-LTL5 instead in UserMode.
1. About
ucxxrt is an open source runtime library based on MSVC. The highlight of this project is its usability in kernel-mode drivers, and it provides you nearly the same experience as developing user-mode applications in C++.
Before ucxxrt was born, in order to use C++ STL in kernel-mode drivers, users have to craft their own template libraries (eg. KTL, ustd, ...).
There are still several problems. Like it does not support C++ exceptions, and mainly, it costs very much time to implement new language features when C++ ISO standard updates.
Then ucxxrt was born.
1.1 How ucxxrt works
-
When developing kernel-mode drivers, kernel-mode flag is disabled by using property sheets, forcibly making the compiler support C++ exceptions. Exception flag(
/EHsc) is also enabled. -
Implements exception functions like
throw,catch. Simulates the exception dispatcher inthrowand handles the exception in callback functions.
1.2 Features
- support x86, x64, ARM(experimental), ARM64(experimental).
- support new/delete operators.
- support C++ exception (/EHa, /EHsc).
- support SAFESEH、GS (Buffer Security Check).
- support STL (not fully).
- support static objects.
List of currently unsupported features ↓
1.3 Example
See project unittest for more information.
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());
}
}
2. How to use
First, rename DriverEntry to DriverMain.
2.1 Method 1 (recommended)
Right click on the project, select "Manage NuGet Packages".
Search for ucxxrt, choose the version that suits you, and then click "Install".

2.2 Method 2
-
Download the latest package from Releases and unzip it.
-
Add the property sheet
ucxxrt.propsto your project.

3. How to build
IDE:Visual Studio 2022 latest version
and Windows SDK
and Windows Driver Kits
-
git clone --recurse-submodules https://github.com/MiroKaku/ucxxrt.git -
Open
ucxxrt.slnand build. -
For clang-cl or llvm-msvc, you will have to add
-march=nativein the compiler flags.
4. Acknowledgements
Thanks to JetBrains for providing free licenses such as Resharper C++ for my open-source projects.
5. References
Great thanks to these excellent projects. Without their existence, there would be no
ucxxrtthen.
6. List of currently unsupported features
- Thread Local Storage (TLS): thread_local、TlsAlloc ...
- std::filesystem
- std::chrono
- std::stacktrace_entry
- std::locale
- std::stream (std::fstream、std::iostream、std::cin、std::cout、std::cerr)
- std::future
- std::latch
- std::semaphore (std::counting_semaphore、std::binary_semaphore)
- ...