1.1 WDM 驱动模型概述
WDM(Windows Driver Model)是微软在 Windows 98 和 Windows 2000 时代引入的驱动程序框架,旨在统一 Windows 9x 与 Windows NT 系列的驱动开发模型。它建立在 NT 式驱动的基础上,增加了对即插即用(PnP)、电源管理(PM)以及 Windows 管理规范(WMI)的原生支持。理解 WDM 的历史背景、层次结构及其与 NT 式驱动的区别,是掌握中断处理与 IOCTL 参数配置的前提。
1.1.1 WDM 的历史演进
Windows 驱动模型经历了从 VxD(虚拟设备驱动)到 NT 式驱动,再到 WDM 和 KMDF(内核模式驱动框架)的演进过程。WDM 的出现解决了早期 Windows 驱动模型碎片化的问题。
| 时期 | 驱动模型 | 目标系统 | 核心特点 |
|---|---|---|---|
| 1995-1998 | VxD | Windows 95/98 | 基于汇编和 C,无标准 I/O 模型,无 PnP 支持 |
| 1993-2000 | NT 式驱动 | Windows NT 4.0 | 基于 IRP,分层架构,无 PnP/电源管理 |
| 2000-2006 | WDM | Windows 2000/XP | 统一 9x 与 NT,引入 PnP/PM/WMI |
| 2006 至今 | KMDF | Windows Vista+ | 基于 WDM 的封装,简化开发,默认推荐 |
1.1.2 WDM 的层次结构
WDM 驱动采用分层架构,每个设备对象(DEVICE_OBJECT)可以挂载在设备栈的任意一层。IRP(I/O 请求包)沿着设备栈从上向下传递,每层驱动可以选择处理、转发或完成该 IRP。这种分层设计使得功能扩展和复用变得非常灵活。
设备栈中的三个核心设备对象各有其职责:
- PDO(物理驱动对象):由总线驱动创建,负责枚举设备、分配硬件资源(I/O 端口、中断、内存范围),是设备栈的底层。
- FDO(功能驱动对象):由功能驱动创建,负责设备的主要操作,包括中断处理、IOCTL 分发、读写请求等,是课程实战的核心。
- Filter DO(过滤驱动对象):由过滤驱动创建,位于 FDO 的上层或下层,用于透明地拦截、修改或记录 IRP,无需修改功能驱动代码。
1.1.3 WDM 与 NT 式驱动的核心区别
NT 式驱动是 WDM 的前身,主要运行在 Windows NT 4.0 及更早版本。WDM 在 NT 式驱动的基础上增加了三个关键机制:即插即用(PnP)、电源管理(PM)和 Windows 管理规范(WMI)。这些机制深刻影响了驱动程序的初始化、资源分配和中断处理流程。
| 对比维度 | NT 式驱动 | WDM 驱动 |
|---|---|---|
| 设备枚举 | 手动注册,静态加载 | PnP 管理器自动枚举,动态加载/卸载 |
| 硬件资源分配 | 驱动自行声明固定资源 | PnP 管理器分配 I/O 端口、中断、内存 |
| 中断处理 | 直接连接 ISR,无 DPC 强制要求 | 支持 DIRQL + DPC 延迟调用,中断共享 |
| 电源管理 | 无标准电源回调 | IRP_MJ_POWER 处理,支持设备状态 D0-D3 |
| WMI 支持 | 无 | 内置 WMI 提供者接口,支持性能计数 |
| 设备栈 | 单层驱动对象 | 多层设备栈(PDO/FDO/Filter) |
| IRP 处理 | 驱动自行完成 IRP | 支持 IRP 向下传递,分层协作完成 |
IRP_MN_START_DEVICE 中完成,并在 IRP_MN_STOP_DEVICE 或 IRP_MN_REMOVE_DEVICE 中断开。这与 NT 式驱动在 DriverEntry 中静态连接中断的做法有本质区别。
1.1.4 WDM 驱动程序的入口与初始化流程
WDM 驱动的初始化不再依赖单一的 DriverEntry 完成所有工作,而是采用“入口 + 回调”的延迟初始化模式。DriverEntry 只负责注册分发例程和创建驱动对象,真正的硬件初始化在 AddDevice 和 StartDevice 中完成。
1.1.5 为什么 WDM 对中断处理和 IOCTL 至关重要
WDM 框架对中断处理和 IOCTL 参数配置提出了比 NT 式驱动更严格的要求:
- 中断共享:WDM 支持多个设备共享同一 IRQ 线,ISR 必须首先检查中断是否来自自己的设备,否则返回 FALSE 让下一个 ISR 处理。
- DIRQL + DPC 模型:WDM 强制要求中断服务例程(ISR)在 DIRQL 上执行最小工作,将耗时操作排队到 DPC(延迟过程调用)中执行,避免阻塞高优先级中断。
- IOCTL 参数验证:WDM 驱动在处理 IRP_MJ_DEVICE_CONTROL 时,必须严格验证输入输出缓冲区的大小、类型和访问权限,否则可能导致系统崩溃或安全漏洞。
- PnP 资源重新平衡:当系统添加或移除设备时,PnP 管理器可能重新分配中断资源,驱动必须能够动态断开并重新连接中断。