このレポは、開発者が錆の窓ドライバーを開発できるようにする錆びた木箱のコレクションです。 WDMとWDFの両方のドライバー開発モデルをサポートするつもりです。このレポは次の木枠が含まれています。
bindgenからの自動生成FFIバインディングと、BindGenが生成できないマクロの手動の再実装の両方が含まれます。wdk-sysを介して再輸出され、通常はwdk-macrosに直接依存する必要はありませんドライバーの作成に使用されるこのリポジトリの例を見るには、Windows-rust-driver-Samplesを参照してください。
注:このプロジェクトはまだ開発の初期段階にあり、生産の使用にはまだ推奨されていません。コミュニティの実験、提案、議論をお勧めします!私たちは、コミュニティとの関与の主な形として、GitHubディスカッションフォーラムを使用します!
このプロジェクトは、WDM、KMDF、およびUMDFドライバーのサポートを念頭に置いて構築され、Win32サービスを念頭に置いて構築されました。これには、WDK 22H2以降に含まれるWDFのすべてのバージョンのサポートが含まれます。現在、 crates.ioで利用可能な箱はKMDF v1.33のみをサポートしていますが、 windows-drivers-rsをクローニングし、WDK-SYSのbuild.rsで指定された構成を変更することにより、他のすべてのwdk-sysを生成できます。他のWDK構成のcrates.ioサポートは、近い将来に計画されています。
注::ワークスペースレベルの例とテストはさまざまなWDK構成を使用し、WDRはワークスペースごとに1つのWDK構成のみをサポートするため、ワークスペースレベルの例とテストフォルダーはリポジトリルートの貨物マニフェストから除外されます。
bindgen介した結合生成にはlibclangが必要です。これを取得する最も簡単な方法は、 wingetを介してです
winget install -i LLVM.LLVM --version 17.0.6 --forceビルド後のタスク(つまり、 inf2cat 、 infverifなど)を実行するには、 cargo make使用されます
cargo install --locked cargo-make --no-default-features --features tls-nativeWDKを使用したプログラムの構築には、有効なWDK環境にあることも必要です。これを行うための推奨される方法は、EWDK開発者プロンプトを入力することです
このリポジトリのクレートはcrates.ioから入手できますが、サポートされている構成で概説されている現在の制限を考慮してください。別の構成をサポートする必要がある場合は、このレポをクローン化してパス依存関係を使用してみてください
Lib Crateで新しい貨物パッケージを作成します。
cargo new < driver_name > -- lib windows-drivers-rsに依存関係を追加します。
cd < driver_name >
cargo add -- build wdk - build
cargo add wdk wdk - sys wdk - alloc wdk - panic次のスニペットをCargo.tomlに追加して、クレートタイプをcdylibに設定します。
[ lib ]
crate-type = [ " cdylib " ]WDKメタデータセクションを追加し、ユースケースにWDKを構成します。これにより、貨物メーキのタスクは、パッケージがドライバーであり、ドライバーのパッケージステップを実行する必要があることを知ることができます。
umdfの例:
[ package . metadata . wdk . driver-model ]
driver-type = " UMDF "
umdf-version-major = 1
target-umdf-version-minor = 33カーネルモードのクレートの場合(例: KMDFドライバー、 WDMドライバー): Cargo.tomlにabortためにクレートパニック戦略を設定します:toml:
[ profile . dev ]
panic = " abort "
[ profile . release ]
panic = " abort " build.rsを作成し、次のスニペットを追加します。
fn main ( ) -> Result < ( ) , wdk_build :: ConfigError > {
wdk_build :: configure_wdk_binary_build ( )
}カーネルモードのクレート(例: KMDFドライバー、 WDMドライバー): lib.rsのno_stdとしてドライバーのクレートをマークします:
#! [ no_std ]カーネルモードのクレート(例: KMDFドライバー、 WDMドライバー): lib.rsにパニックハンドラーを追加:
# [ cfg ( not ( test ) ) ]
extern crate wdk_panic ;カーネルモードのクレート(例: KMDFドライバー、 WDMドライバー): lib.rsにオプションのグローバルアロケーターを追加します:
# [ cfg ( not ( test ) ) ]
use wdk_alloc :: WdkAllocator ;
# [ cfg ( not ( test ) ) ]
# [ global_allocator ]
static GLOBAL_ALLOCATOR : WdkAllocator = WdkAllocator ;これは、Rust標準ライブラリでallocモジュールを使用できるようにする場合にのみ必要です。
lib.rsにドライバーエントリーを追加します:
use wdk_sys :: {
PDRIVER_OBJECT ,
NTSTATUS ,
PCUNICODE_STRING ,
} ;
# [ export_name = "DriverEntry" ] // WDF expects a symbol with the name DriverEntry
pub unsafe extern "system" fn driver_entry (
driver : PDRIVER_OBJECT ,
registry_path : PCUNICODE_STRING ,
) -> NTSTATUS {
0
}注:カーネルモードクレートでは、ドライバーの代わりにdriver: &mut DRIVER_OBJECTを使用できますdriver: PDRIVER_OBJECT 。
Makefile.tomlを追加:
extend = " target/rust-driver-makefile.toml "
[ config ]
load_script = '''
#!@rust
//! ```cargo
//! [dependencies]
//! wdk-build = "0.3.0"
//! ```
#![allow(unused_doc_comments)]
wdk_build::cargo_make::load_rust_driver_makefile()?
''' cdylibクレートの名前に一致するINXファイルを追加します。
静的CRTリンケージを有効にします。 1つのアプローチは、これを.cargo/config.tomlに追加することです。
[ build ]
rustflags = [ " -C " , " target-feature=+crt-static " ]ドライバーを構築します:
cargo make WDRLocalTestCert.cerファイルを含む署名済みのドライバーパッケージは、 target/<Cargo profile>/packageで生成されます。特定のターゲットアーキテクチャが指定された場合、ドライバーパッケージはtarget/<target architecture>/<Cargo profile>/packageで生成されます
WDM 、 KMDF 、およびUMDFドライバーの最小限の例は、Examples Directoryにあります。
cargo-makeビルド後のドライバーのパッケージング手順を実行するためのwindows-drivers-rsを使用したビルドを容易にするために使用されます。
デフォルトのアクション(ビルドおよびパッケージドライバー)を実行するには:
cargo make default
デフォルトのタスクを実行する場合、 defaultタスクが暗示されているため、 cargo make Makeも機能します。
windows-drivers-rs cargo make基礎となるcargoコマンドに特定の議論を転送するために拡張します。転送する引数を指定するには、 cargo-makeタスク名を明示的に指定した後に提供する必要があります(つまり、 defaultタスクの名前を省略してもサポートされていません)。
特定のターゲットの場合:
cargo make default --target <TARGET TRIPLE>
リリースビルドの場合:
cargo make default --releaseまたはcargo make default --profile release
特定の機能を指定するには:
cargo make default --features <FEATURES>
特定の錆ツールチェーンを指定するには:
cargo make default +<TOOLCHAIN>
ヘルプを表示し、サポートされているCLI Argsの完全なリストを表示して、貨物に転送します。
cargo make help
WDK_BUILD_ENABLE_SIGNTOOL_VERIFY cargo-make環境変数は、生成された.sysおよび.catファイルの署名検証を処理するタスクを有効にするためにtrueに設定できます。 signtool verify 、この検証が機能するために、 Trusted Root Certification Authoritiesのように証明書をインストールすることを要求します。 WDRのデフォルトの動作は生成されたテスト証明書で署名するため、これらのタスクはデフォルトで有効になりません。これらのテスト証明書は、通常、独自のルート証明書をインストールすることのセキュリティの意味を考えると、個人開発マシンではなく、ドライバーをテストするためのコンピューターにTrusted Root Certification Authoritiesにのみインストールされます。
これらの意味を理解し、テスト証明書をインストールした場合は、次のように署名を検証できます。
cargo make --env WDK_BUILD_ENABLE_SIGNTOOL_VERIFY=true
Crates.ioへのリリースは、すべての変更がメインに合流された後に作成されません。リリースは、コミュニティから要求された場合、またはwindows-drivers-rsチームがリリースをプッシュするのに十分な価値があると考えている場合にのみ行われます。
商標このプロジェクトには、プロジェクト、製品、またはサービスの商標またはロゴが含まれる場合があります。 Microsoftの商標またはロゴの承認された使用は、Microsoftの商標およびブランドガイドラインに従うものであり、従わなければなりません。このプロジェクトの変更されたバージョンでのMicrosoft商標またはロゴの使用は、混乱を引き起こしたり、Microsoftのスポンサーシップを暗示したりしてはなりません。サードパーティの商標またはロゴの使用は、これらのサードパーティのポリシーの対象となります。