Skip to content

Latest commit

 

History

History
140 lines (102 loc) · 5.31 KB

README.md

File metadata and controls

140 lines (102 loc) · 5.31 KB

Actions Status LICENSE Windows Visual Studio nuget

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 in throw and 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".

nuget

2.2 Method 2

  1. Download the latest package from Releases and unzip it.

  2. Add the property sheet ucxxrt.props to your project.

usage

3. How to build

IDE:Visual Studio 2022 latest version

  • git clone --recurse-submodules https://github.com/MiroKaku/ucxxrt.git
  • Open ucxxrt.sln and build.

4. Acknowledgements

Thanks to JetBrains for providing free licenses such as Resharper C++ for my open-source projects.

ReSharper C++ logo.

5. References

Great thanks to these excellent projects. Without their existence, there would be no ucxxrt then.

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)
  • ...