在 Windows 驱动程序开发中,Windows Driver Frameworks (WDF) 是一次重大的范式转变。它极大地简化了驱动程序的创建过程,降低了开发门槛,并显著提高了系统的稳定性和安全性。WDF 的核心思想是让驱动程序开发者从繁琐的底层细节中解放出来,更多地关注于设备本身的业务逻辑。
WDF 包含两个主要变体:
本文将重点介绍如何使用 WDF(主要是 KMDF)来编写驱动程序应用程序。
与传统 WDM (Windows Driver Model) 相比,WDF 具有压倒性优势:
WDFDEVICE
, WDFQUEUE
, WDFREQUEST
)。开发者通过操作这些对象的方法和属性来编写驱动,无需直接与复杂的 WDM 结构体打交道。一个典型的 WDF 驱动程序包含以下几个关键部分:
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); }
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; }
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); }
DriverEntry
, EvtDriverDeviceAdd
以及各种 I/O 和 PnP 回调函数。.sys
驱动文件和相关 .inf
安装文件。DevCon
工具或设备管理器安装驱动。
bash
复制
下载
devcon install MyDevice.inf *<硬件ID>
CreateFile
, ReadFile
, WriteFile
, DeviceIoControl
等 API 与驱动程序进行通信。WDF 是现代 Windows 驱动程序开发的基石和首选框架。它通过其高层次的抽象、自动化的状态管理和面向对象的设计,将开发者从 WDM 的复杂性中拯救出来。虽然学习驱动开发仍然具有挑战性(需要深入理解操作系统和硬件知识),但 WDF 无疑使得这个过程更加平滑、高效,并最终能生产出更高质量的驱动程序。
对于新手而言,从 WDF 开始是进入 Windows 内核世界最明智的途径。建议从微软官方的 WDK 示例代码开始,先理解一个简单的“Hello World”驱动(如 echo
驱动)是如何工作的,再逐步扩展功能,最终开发出功能完整的驱动程序。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。