Windows驱动开发新时代:windows-drivers-rs项目架构深度解析
Windows驱动开发新时代:windows-drivers-rs项目架构深度解析
【免费下载链接】windows-drivers-rsPlatform that enables Windows driver development in Rust项目地址: https://gitcode.com/gh_mirrors/wi/windows-drivers-rs
windows-drivers-rs是一个创新的Rust crate集合,它彻底改变了Windows驱动开发的方式,使开发者能够使用Rust语言开发Windows驱动程序。该项目支持WDM和WDF驱动开发模型,为驱动开发带来了Rust语言的安全性和现代性。
项目核心价值与优势 🚀
Rust语言以其内存安全和高性能特性,为Windows驱动开发带来了革命性的变化。windows-drivers-rs项目充分利用了Rust的优势,解决了传统C/C++驱动开发中常见的内存安全问题,同时保持了驱动程序所需的高性能。
对于新手开发者而言,这个项目提供了友好的入门体验和完善的文档支持;对于经验丰富的开发者,它则提供了强大的工具集和灵活的配置选项,大大提高了开发效率。
项目架构概览 🏗️
windows-drivers-rs采用模块化设计,主要包含以下几个核心组件:
核心Crates解析
wdk-sys:提供Windows开发工具包(WDK) API的直接FFI绑定。这包括由
bindgen自动生成的FFI绑定,以及bindgen无法生成的宏的手动重新实现。wdk:提供WDK API的安全惯用绑定,使开发者能够以更符合Rust风格的方式使用Windows驱动API。
wdk-build:一个用于配置Cargo构建脚本的库,用于绑定生成和WDK的下游链接。虽然这个crate被设计为对不同的WDK版本和不同的WDF版本具有灵活性,但目前仅针对NI eWDK、KMDF 1.33、UMDF 2.33和WDM驱动程序进行了测试。
wdk-panic:为使用WDK构建的程序提供默认的panic处理程序实现。
wdk-alloc:为使用Windows开发工具包(WDK)编译的二进制文件提供alloc支持。
wdk-macros:一组宏,帮助简化与wdk-sys直接绑定的交互。这个crate通过
wdk-sys重新导出,通常不需要直接依赖。
项目目录结构
项目采用清晰的目录结构,便于开发者理解和使用:
- crates:包含Cargo工作区的所有主要crates。
- examples:包含工作区级别的示例,包括不同类型的最小Windows驱动程序(如WDM、KMDF、UMDF)。
- tests:包含工作区级别的测试,包括对包和工作区中基于元数据的wdk配置的测试。
注意:由于工作区级别的示例和测试使用不同的WDK配置,而WDR仅支持每个工作区一个WDK配置,因此工作区级别的示例和测试文件夹被排除在仓库根目录的Cargo清单之外。
快速入门指南 🚀
系统要求
libclang:绑定生成需要
libclang。获取它的最简单方法是通过winget:winget install -i LLVM.LLVM --version 17.0.6 --force确保选择GUI选项将LLVM添加到PATH。注意:LLVM 18存在一个bug,导致ARM64的绑定生成失败,建议使用LLVM 17。
cargo-make:用于执行构建后任务(如
inf2cat、infverif等):cargo install --locked cargo-make --no-default-features --features tls-nativeWDK环境:使用WDK构建程序还需要在有效的WDK环境中。推荐的方法是进入eWDK开发者命令提示符。
基本使用步骤
创建一个新的Cargo包:
cargo new <driver_name> --lib添加依赖:
cd <driver_name> cargo add --build wdk-build cargo add wdk wdk-sys wdk-alloc wdk-panic设置 crate 类型为
cdylib:[lib] crate-type = ["cdylib"]添加wdk元数据部分并配置wdk:
[package.metadata.wdk.driver-model] driver-type = "UMDF" umdf-version-major = 1 target-umdf-version-minor = 33对于内核模式crates,设置crate panic策略为
abort:[profile.dev] panic = "abort" [profile.release] panic = "abort"创建
build.rs:fn main() -> Result<(), wdk_build::ConfigError> { wdk_build::configure_wdk_binary_build() }对于内核模式crates,在
lib.rs中添加必要的代码:#![no_std] #[cfg(not(test))] extern crate wdk_panic; #[cfg(not(test))] use wdk_alloc::WdkAllocator; #[cfg(not(test))] #[global_allocator] static GLOBAL_ALLOCATOR: WdkAllocator = WdkAllocator; use wdk_sys::{ PDRIVER_OBJECT, NTSTATUS, PCUNICODE_STRING, }; #[unsafe(export_name = "DriverEntry")] pub unsafe extern "system" fn driver_entry( driver: PDRIVER_OBJECT, registry_path: PCUNICODE_STRING, ) -> NTSTATUS { 0 }添加
Makefile.toml:extend = "target/rust-driver-makefile.toml" [config] load_script = ''' #!@rust //! ```cargo //! [dependencies] //! wdk-build = "0.5.1" //! ``` #![allow(unused_doc_comments)] wdk_build::cargo_make::load_rust_driver_makefile()? '''添加与
cdylibcrate名称匹配的inx文件。启用静态crt链接,例如添加到
.cargo/config.toml:[build] rustflags = ["-C", "target-feature=+crt-static"]构建驱动:
cargo make
高级功能与用法 🔧
Cargo Make详解
cargo-make用于促进使用windows-drivers-rs的构建,包括执行构建后驱动打包步骤。要执行默认操作(构建和打包驱动):
cargo make default执行默认任务时,只需cargo make也可以,因为default任务是隐含的。
参数转发
windows-drivers-rs扩展了cargo make,以将特定参数转发到底层cargo命令。要指定要转发的参数,必须在显式指定cargo-make任务名称后提供它们。
示例:
- 对于特定目标:
cargo make default --target <TARGET TRIPLE> - 对于发布构建:
cargo make default --release或cargo make default --profile release - 要指定特定功能:
cargo make default --features <FEATURES> - 要指定特定的rust工具链:
cargo make default +<TOOLCHAIN> - 要显示帮助并查看支持的完整CLI参数列表:
cargo make help
驱动包签名验证
可以将WDK_BUILD_ENABLE_SIGNTOOL_VERIFY环境变量设置为true,以启用处理生成的.sys和.cat文件的签名验证的任务。signtool verify要求证书安装在"受信任的根证书颁发机构"中,此验证才能正常工作。这些任务默认不启用,因为WDR的默认行为是使用生成的测试证书进行签名。考虑到安装自己的根证书的安全影响,这些测试证书通常只安装在专门用于测试驱动程序的计算机上,而不是个人开发机器上。
如果您了解这些含义,并且已经安装了测试证书,则可以按如下方式验证签名:
cargo make --env WDK_BUILD_ENABLE_SIGNTOOL_VERIFY=true支持的配置
该项目旨在支持WDM、KMDF和UMDF驱动程序以及Win32服务。这包括支持WDK 22H2及更高版本中包含的所有WDF版本。目前,crates.io中指定的配置,可以为其他所有内容生成绑定。计划在不久的将来支持crates.io上的其他WDK配置。
项目示例
在examples目录中可以找到WDM、KMDF和UMDF驱动程序的最小示例,包括:
- sample-kmdf-driver:KMDF驱动示例
- sample-umdf-driver:UMDF驱动示例
- sample-wdm-driver:WDM驱动示例
这些示例提供了使用windows-drivers-rs开发不同类型Windows驱动程序的起点。
如何获取项目
要开始使用windows-drivers-rs,您可以通过以下方式获取项目:
git clone https://gitcode.com/gh_mirrors/wi/windows-drivers-rs仓库中的crates也可以从crates.io获取,但要考虑支持的配置中概述的当前限制。如果需要支持不同的配置,可以尝试克隆此仓库并使用路径依赖。
结语
windows-drivers-rs项目为Windows驱动开发带来了Rust语言的强大功能,开启了Windows驱动开发的新时代。通过提供安全、高效且易于使用的工具集,它降低了驱动开发的门槛,同时提高了代码质量和安全性。无论您是经验丰富的驱动开发者还是刚入门的新手,这个项目都能为您提供所需的一切,让Windows驱动开发变得更加简单和愉快。
随着项目的不断发展,我们期待看到更多基于windows-drivers-rs的创新驱动程序和应用,为Windows平台带来更安全、更可靠的软件体验。
【免费下载链接】windows-drivers-rsPlatform that enables Windows driver development in Rust项目地址: https://gitcode.com/gh_mirrors/wi/windows-drivers-rs
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
