首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Windows驱动程序开发:WDF应用程序编写

Windows驱动程序开发:WDF应用程序编写

原创
作者头像
幽默的地球-itkf2015
发布2025-09-15 10:23:45
发布2025-09-15 10:23:45
1640
举报

引言

在 Windows 驱动程序开发中,Windows Driver Frameworks (WDF) 是一次重大的范式转变。它极大地简化了驱动程序的创建过程,降低了开发门槛,并显著提高了系统的稳定性和安全性。WDF 的核心思想是让驱动程序开发者从繁琐的底层细节中解放出来,更多地关注于设备本身的业务逻辑。

WDF 包含两个主要变体:

  1. KMDF (Kernel-Mode Driver Framework):用于开发运行在内核模式的驱动程序。
  2. UMDF (User-Mode Driver Framework):用于开发可以运行在用户模式的驱动程序(通常用于协议设备或不需要直接访问内核硬件的设备)。

本文将重点介绍如何使用 WDF(主要是 KMDF)来编写驱动程序应用程序。

一、WDF 的核心优势

与传统 WDM (Windows Driver Model) 相比,WDF 具有压倒性优势:

  1. 面向对象模型:WDF 提供了一个面向对象的抽象层,将设备、队列、请求等概念封装成对象(如 WDFDEVICE, WDFQUEUE, WDFREQUEST)。开发者通过操作这些对象的方法和属性来编写驱动,无需直接与复杂的 WDM 结构体打交道。
  2. 自动化的电源和即插即用 (PnP) 管理:在 WDM 中,正确处理设备的启动、停止、休眠、唤醒等状态是极其复杂且容易出错的。WDF 内置了这些状态的默认处理逻辑,开发者只需在相应的回调函数中实现设备特定的行为即可,框架会确保状态转换的正确顺序。
  3. 增强的I/O模型:WDF 引入了I/O队列对象,可以轻松地配置请求的处理方式(并行、顺序、手动),并自动处理请求的取消和超时,大大简化了并发编程。
  4. 内置的安全性和可靠性:框架自动处理许多常见的错误场景,如引用计数、对象生命周期管理、内存泄漏预防等,使得驱动程序更加健壮。
  5. 更少的代码量:通常,一个功能相同的驱动程序,用 WDF 实现的代码量仅为 WDM 的 1/2 到 1/3。
二、WDF 驱动程序的基本结构

一个典型的 WDF 驱动程序包含以下几个关键部分:

  1. DriverEntry 例程
    • 这是驱动程序的入口点,相当于 main() 函数。
    • 其主要职责是初始化一个 WDF_DRIVER_CONFIG 结构体,并指定 EvtDriverDeviceAdd 回调函数。
    • 然后调用 WdfDriverCreate 来创建驱动程序对象。

    c 复制 下载 NTSTATUS DriverEntry(_In_ PDRIVER_OBJECT DriverObject, _In_ PUNICODE_STRING RegistryPath) { WDF_DRIVER_CONFIG config; WDF_DRIVER_CONFIG_INIT(&config, EvtDriverDeviceAdd); return WdfDriverCreate(DriverObject, RegistryPath, WDF_NO_OBJECT_ATTRIBUTES, &config, WDF_NO_HANDLE); }

  2. EvtDriverDeviceAdd 回调函数
    • 这是驱动程序中最重要的回调函数之一。每当系统检测到一个该驱动程序需要管理的设备时(无论是物理硬件还是虚拟设备),都会调用此函数。
    • 其核心任务是创建设备对象 (WDFDEVICE) 并配置设备的属性和其他回调函数。

    c 复制 下载 NTSTATUS EvtDriverDeviceAdd(_In_ WDFDRIVER Driver, _Inout_ PWDFDEVICE_INIT DeviceInit) { NTSTATUS status; WDFDEVICE hDevice; // 配置设备信息(名称、类型等)... status = WdfDeviceCreate(&DeviceInit, &WDF_NO_OBJECT_ATTRIBUTES, &hDevice); if (!NT_SUCCESS(status)) { return status; } // 创建并配置一个默认的I/O队列来处理读写请求 WDF_IO_QUEUE_CONFIG queueConfig; WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE(&queueConfig, WdfIoQueueDispatchParallel); queueConfig.EvtIoRead = EvtIoRead; // 指定读请求的处理函数 queueConfig.EvtIoWrite = EvtIoWrite; // 指定写请求的处理函数 WDFQUEUE queue; status = WdfIoQueueCreate(hDevice, &queueConfig, WDF_NO_OBJECT_ATTRIBUTES, &queue); return status; }

  3. I/O 请求处理回调函数 (如 EvtIoRead, EvtIoWrite)
    • 当应用程序对设备发出读写等操作请求时,这些函数会被框架调用。
    • 开发者在这里实现与设备交互的实际逻辑。函数会接收到一个 WDFREQUEST 对象,其中包含了请求的所有信息(如缓冲区、长度等)。

    c 复制 下载 VOID EvtIoRead(_In_ WDFQUEUE Queue, _In_ WDFREQUEST Request, _In_ size_t Length) { // 1. 获取与这个队列关联的设备对象 WDFDEVICE hDevice = WdfIoQueueGetDevice(Queue); // 2. 从WDFREQUEST中获取输出缓冲区 PVOID buffer; size_t bufferLength; WdfRequestRetrieveOutputBuffer(Request, Length, &buffer, &bufferLength); // 3. 模拟或从硬件读取数据到 buffer 中 // 例如:memcpy(buffer, myData, min(Length, sizeof(myData))); // 4. 完成请求,告知系统实际读取了多少字节 WdfRequestCompleteWithInformation(Request, STATUS_SUCCESS, bytesRead); }

  4. 电源和 PnP 回调函数 (如 EvtD0Entry, EvtD0Exit)
    • 这些函数用于处理设备电源状态的变化(例如,从工作状态 D0 进入睡眠状态 D3)。
    • 开发者需要在设备进入或离开某个状态时,执行特定的硬件操作(如保存/恢复寄存器状态)。
三、开发环境与工具
  1. Visual Studio:从 Visual Studio 2019 开始,微软提供了官方的“Windows Driver Development”工作负载,可以直接在 VS 中创建、构建、调试和部署 WDF 驱动程序项目,体验与普通应用程序开发无异。
  2. Windows WDK (Windows Driver Kit):WDK 包含了编译驱动所需的所有头文件、库、工具和文档。它已集成到 Visual Studio 中。
  3. Debugging Tools for Windows:用于调试驱动程序,通常通过串口、网络(KDNet)或 USB 与目标测试机(Target Machine)连接。
  4. OSR Driver LoaderDevCon:用于在测试机上手动安装、加载、卸载驱动程序。
四、开发流程简述
  1. 创建项目:在 VS 中选择 "Kernel Mode Driver, Empty (KMDF)" 模板。
  2. 编写代码:实现 DriverEntry, EvtDriverDeviceAdd 以及各种 I/O 和 PnP 回调函数。
  3. 构建:生成 .sys 驱动文件和相关 .inf 安装文件。
  4. 部署:将文件拷贝到目标测试机(通常需要开启测试签名模式或使用测试证书签名)。
  5. 安装:使用 DevCon 工具或设备管理器安装驱动。 bash 复制 下载 devcon install MyDevice.inf *<硬件ID>
  6. 调试:配置 VS 与目标测试机进行内核调试,可以设置断点、查看变量、单步执行,就像调试本地应用程序一样。
  7. 测试:编写简单的用户模式测试应用程序,使用 CreateFile, ReadFile, WriteFile, DeviceIoControl 等 API 与驱动程序进行通信。
五、总结

WDF 是现代 Windows 驱动程序开发的基石和首选框架。它通过其高层次的抽象、自动化的状态管理和面向对象的设计,将开发者从 WDM 的复杂性中拯救出来。虽然学习驱动开发仍然具有挑战性(需要深入理解操作系统和硬件知识),但 WDF 无疑使得这个过程更加平滑、高效,并最终能生产出更高质量的驱动程序。

对于新手而言,从 WDF 开始是进入 Windows 内核世界最明智的途径。建议从微软官方的 WDK 示例代码开始,先理解一个简单的“Hello World”驱动(如 echo 驱动)是如何工作的,再逐步扩展功能,最终开发出功能完整的驱动程序。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引言
    • 一、WDF 的核心优势
    • 二、WDF 驱动程序的基本结构
    • 三、开发环境与工具
    • 四、开发流程简述
    • 五、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档