USERMODEサポートは、2022年3月29日から削除されました。USERMODEをサポートすることが知られている最終バージョンはE2F159F8Fです。 Usermodeで代わりにVC-LTL5を使用してください。
ucxxrt 、MSVCに基づくオープンソースのランタイムライブラリです。このプロジェクトのハイライトは、カーネルモードドライバーでのユーザビリティであり、C ++でユーザーモードアプリケーションの開発とほぼ同じエクスペリエンスを提供します。
ucxxrtが生まれる前に、カーネルモードドライバーでC ++ STLを使用するために、ユーザーは独自のテンプレートライブラリ(例えばKTL、USTD、...)を作成する必要があります。まだいくつかの問題があります。 C ++の例外をサポートしていないように、主に、C ++ ISO標準の更新時に新しい言語機能を実装するのに非常に多くの時間がかかります。
その後、 ucxxrtが生まれました。
ucxxrt仕組みカーネルモードドライバーを開発するとき、カーネルモードフラグはプロパティシートを使用して無効になり、コンパイラサポートC ++例外を強制的に作成します。例外フラグ( /EHsc )も有効です。
throw 、 catchなどの例外関数を実装します。 throwの例外ディスパッチャーをシミュレートし、コールバック関数の例外を処理します。
現在サポートされていない機能のリスト↓
詳細については、プロジェクトUnittestを参照してください。
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を追加する必要があります。
オープンソースプロジェクトにResharper C ++などの無料ライセンスを提供してくれたJetBrainsに感謝します。
これらの優れたプロジェクトに感謝します。彼らの存在がなければ、
ucxxrtはありません。