该存储库是一组锈蚀箱,使开发人员能够开发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赞助。任何使用第三方商标或徽标都遵守这些第三方政策。