該存儲庫是一組鏽蝕箱,使開發人員能夠開發Rust的Windows驅動程序。它的目的是支持WDM和WDF驅動程序開發模型。此存儲庫包含以下板條箱:
bindgen的自動烯烯的FFI結合物,又包括結合基因無法產生的宏的手動重新實現。wdk-sys重新出口,板條箱通常永遠不需要直接依賴wdk-macros要查看用於創建驅動程序的此存儲庫的示例,請參見Windows-Rust-driver-Shamples。
注意:該項目仍處於開發的早期階段,尚未建議用於生產。我們鼓勵社區實驗,建議和討論!我們將使用我們的GitHub討論論壇作為與社區互動的主要形式!
該項目是在WDM,KMDF和UMDF驅動程序以及Win32服務的支持下建立的。這包括對WDK 22H2中包含的所有版本的WDF和較新版本的支持。當前, crates.io上可用的板條箱僅支持KMDF V1.33,但是可以通過克隆windows-drivers-rs並修改wdk-sys build.rs中指定的配置。 Crates.IO對其他WDK配置的支持計劃在不久的將來進行。
注意::由於工作區級別的示例和測試使用不同的WDK配置,WDR僅支持每個工作區的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通過將以下片段cdylib到Cargo.toml :
[ lib ]
crate-type = [ " cdylib " ]添加WDK元數據部分,並為您的用例配置WDK。這也使貨物製造任務知道該軟件包是驅動程序,並且驅動程序包裝步驟需要運行。
UMDF示例:
[ package . metadata . wdk . driver-model ]
driver-type = " UMDF "
umdf-version-major = 1
target-umdf-version-minor = 33對於內核模式板條箱(Ex。KMDF KMDF程序, WDM驅動程序):將板條板策略設置為Cargo.toml中abort 。
[ profile . dev ]
panic = " abort "
[ profile . release ]
panic = " abort "創建一個build.rs並添加以下片段:
fn main ( ) -> Result < ( ) , wdk_build :: ConfigError > {
wdk_build :: configure_wdk_binary_build ( )
}對於內核模式板條箱(Ex。KMDF KMDF程序, WDM驅動程序):將您的駕駛員板條板標記為lib.rs中的no_std :
#! [ no_std ]對於內核模式板條箱(Ex。KMDF KMDF程序, WDM驅動程序):在lib.rs中添加一個恐慌處理程序:
# [ cfg ( not ( test ) ) ]
extern crate wdk_panic ;對於內核模式板條箱(Ex。KMDF KMDF程序, WDM驅動程序):在lib.rs中添加可選的全局分配器:
# [ cfg ( not ( test ) ) ]
use wdk_alloc :: WdkAllocator ;
# [ cfg ( not ( test ) ) ]
# [ global_allocator ]
static GLOBAL_ALLOCATOR : WdkAllocator = WdkAllocator ;僅當您希望能夠使用Rust Standard庫中的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鏈接。一種方法是將其添加到您的.cargo/config.toml :
[ build ]
rustflags = [ " -C " , " target-feature=+crt-static " ]構建驅動程序:
cargo make將在target/<Cargo profile>/package中生成一個簽名的驅動程序包,包括WDRLocalTestCert.cer文件。如果指定了特定的目標體系結構,則將在target/<target architecture>/<Cargo profile>/package中生成驅動程序包
在示例目錄中可以找到WDM , KMDF和UMDF驅動程序的最小示例。
cargo-make用於使用windows-drivers-rs來促進構建,包括執行後駕駛員包裝步驟。
執行默認操作(構建和包裝驅動程序):
cargo make default
執行默認任務時,僅由於隱含default任務,因此僅cargo 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 ARG的完整列表,以轉發到貨物:
cargo make help
WDK_BUILD_ENABLE_SIGNTOOL_VERIFY貨物環境變量可以設置為true ,以啟用處理生成的.sys和.cat文件的簽名驗證的任務。 signtool verify需要像在Trusted Root Certification Authorities中安裝證書以進行此驗證。默認情況下,這些任務未啟用,因為WDR的默認行為是用生成的測試證書籤名。考慮到安裝自己的根證書的安全含義,這些測試證書通常僅安裝在用於測試驅動程序而不是個人開發機的計算機上的Trusted Root Certification Authorities中。
如果您了解這些含義並已安裝了測試證書,則可以驗證以下簽名:
cargo make --env WDK_BUILD_ENABLE_SIGNTOOL_VERIFY=true
釋放到板條箱。只有在社區要求時,或者當windows-drivers-rs團隊認為推動發布有足夠的價值時,才會發行。
該項目的商標可能包含項目,產品或服務的商標或徽標。 Microsoft商標或徽標的授權使用受到了Microsoft的商標和品牌準則的約束。在此項目的修改版本中使用Microsoft商標或徽標不得引起混亂或暗示Microsoft贊助。任何使用第三方商標或徽標都遵守這些第三方政策。