当前位置: 首页 > news >正文

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解析

  1. wdk-sys:提供Windows开发工具包(WDK) API的直接FFI绑定。这包括由bindgen自动生成的FFI绑定,以及bindgen无法生成的宏的手动重新实现。

  2. wdk:提供WDK API的安全惯用绑定,使开发者能够以更符合Rust风格的方式使用Windows驱动API。

  3. wdk-build:一个用于配置Cargo构建脚本的库,用于绑定生成和WDK的下游链接。虽然这个crate被设计为对不同的WDK版本和不同的WDF版本具有灵活性,但目前仅针对NI eWDK、KMDF 1.33、UMDF 2.33和WDM驱动程序进行了测试。

  4. wdk-panic:为使用WDK构建的程序提供默认的panic处理程序实现。

  5. wdk-alloc:为使用Windows开发工具包(WDK)编译的二进制文件提供alloc支持。

  6. 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:用于执行构建后任务(如inf2catinfverif等):

    cargo install --locked cargo-make --no-default-features --features tls-native
  • WDK环境:使用WDK构建程序还需要在有效的WDK环境中。推荐的方法是进入eWDK开发者命令提示符。

基本使用步骤

  1. 创建一个新的Cargo包:

    cargo new <driver_name> --lib
  2. 添加依赖:

    cd <driver_name> cargo add --build wdk-build cargo add wdk wdk-sys wdk-alloc wdk-panic
  3. 设置 crate 类型为cdylib

    [lib] crate-type = ["cdylib"]
  4. 添加wdk元数据部分并配置wdk:

    [package.metadata.wdk.driver-model] driver-type = "UMDF" umdf-version-major = 1 target-umdf-version-minor = 33
  5. 对于内核模式crates,设置crate panic策略为abort

    [profile.dev] panic = "abort" [profile.release] panic = "abort"
  6. 创建build.rs

    fn main() -> Result<(), wdk_build::ConfigError> { wdk_build::configure_wdk_binary_build() }
  7. 对于内核模式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 }
  8. 添加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()? '''
  9. 添加与cdylibcrate名称匹配的inx文件。

  10. 启用静态crt链接,例如添加到.cargo/config.toml

    [build] rustflags = ["-C", "target-feature=+crt-static"]
  11. 构建驱动:

    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 --releasecargo 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目录中可以找到WDMKMDFUMDF驱动程序的最小示例,包括:

  • 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),仅供参考

http://www.jsqmd.com/news/862206/

相关文章:

  • xfce-winxp-tc部署与打包指南:支持APK、DEB、RPM等多种格式
  • Bpmn Process Designer扩展开发实战:如何自定义流程元素与规则
  • OpenISP 模块拆解 · 第12讲:双边滤波降噪 (BNF)
  • Octopress草稿管理终极指南:如何高效使用publish和unpublish命令
  • 如何快速上手Supersonic:10个新手必学的音乐管理技巧
  • 社群运营必备工具推荐私域大师
  • 如何快速上手 wechatferry:5分钟搭建你的第一个微信机器人
  • Stylis插件开发完全指南:如何扩展CSS预处理功能
  • AI Scientist-v2容器化部署终极指南:使用Docker简化安装与配置的完整教程
  • 终极Node.js日志解决方案:Pino框架在企业环境中的最佳实践
  • Kirikiri游戏开发终极指南:开源工具集完整解决方案
  • Netlify CLI 开发环境配置:如何搭建高效的本地开发工作流
  • 0x.Tools安全最佳实践:如何在非root权限下运行高性能监控
  • node-ar-drone:终极Node.js无人机控制指南 - 从零开始掌握Parrot AR Drone编程
  • Kalliope核心架构深度解析:信号、神经元与突触的完美结合
  • 快速搭建CPS返利小程序教程
  • Legba性能优化技巧:10个实用方法提升暴力破解效率 [特殊字符]
  • 10个Minimal主题实用技巧:从基础配置到高级定制
  • 终极awesome-made-by-brazilians使用手册:从入门到精通
  • CANN/pypto共享内存视图
  • 终极GTA5安全防护菜单:YimMenu新手完整使用指南
  • Elasticsearch动态模板配置:自动化字段映射的智能解决方案
  • Angular ESLint与TypeScript ESLint完美集成:完整配置指南
  • CANN/asc-devkit int64转int32向量转换
  • 易魔声:2000+音色免费开源TTS引擎完全指南
  • MediaCrawler:企业级社交媒体数据采集的终极架构实践
  • CANN/pypto one_hot操作文档
  • 终极搜索动画指南:ENSearchView如何为你的Android应用增添视觉盛宴
  • 终极指南:如何使用nodeenv在CI/CD流水线中快速搭建隔离的Node.js环境
  • 蘑菇博客移动端开发实战:uniapp+ColorUI构建跨平台博客应用