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-1998VxDWindows 95/98基于汇编和 C,无标准 I/O 模型,无 PnP 支持
1993-2000NT 式驱动Windows NT 4.0基于 IRP,分层架构,无 PnP/电源管理
2000-2006WDMWindows 2000/XP统一 9x 与 NT,引入 PnP/PM/WMI
2006 至今KMDFWindows Vista+基于 WDM 的封装,简化开发,默认推荐
关键节点:WDM 是第一个同时支持 Windows 9x 和 Windows NT 内核的驱动模型,使得硬件厂商只需维护一套源代码即可兼容两个系统家族。虽然 Windows 9x 系列已退出历史舞台,但 WDM 架构在 Windows 2000/XP/Vista/7/8/10/11 中持续沿用,是 KMDF 和 UMDF 的基础。

1.1.2 WDM 的层次结构

WDM 驱动采用分层架构,每个设备对象(DEVICE_OBJECT)可以挂载在设备栈的任意一层。IRP(I/O 请求包)沿着设备栈从上向下传递,每层驱动可以选择处理、转发或完成该 IRP。这种分层设计使得功能扩展和复用变得非常灵活。

WDM 设备栈层次结构 用户态应用程序 I/O 管理器 / 系统服务 功能驱动对象 (FDO) 处理 IOCTL、中断、读写请求 过滤驱动对象 (Filter DO) 日志、加密、重定向、监控 物理驱动对象 (PDO) 总线枚举、硬件资源分配 物理硬件设备 IRP 传递方向 IRP_MJ_xxx IRP_MJ_DEVICE_CONTROL IRP_MJ_PNP / IRP_MJ_POWER 设备对象类型 FDO: 功能驱动 Filter: 过滤驱动 PDO: 物理驱动

设备栈中的三个核心设备对象各有其职责:

  • 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 向下传递,分层协作完成
实战提示:在 WDM 框架下编写中断处理例程时,必须考虑 PnP 管理器可能随时重新分配中断资源(例如在资源重新平衡时)。因此,中断连接(IoConnectInterrupt)通常在 IRP_MN_START_DEVICE 中完成,并在 IRP_MN_STOP_DEVICE 或 IRP_MN_REMOVE_DEVICE 中断开。这与 NT 式驱动在 DriverEntry 中静态连接中断的做法有本质区别。

1.1.4 WDM 驱动程序的入口与初始化流程

WDM 驱动的初始化不再依赖单一的 DriverEntry 完成所有工作,而是采用“入口 + 回调”的延迟初始化模式。DriverEntry 只负责注册分发例程和创建驱动对象,真正的硬件初始化在 AddDevice 和 StartDevice 中完成。

WDM 驱动初始化流程 1. DriverEntry 注册分发例程 2. AddDevice 创建设备对象 3. IRP_MN_START_DEVICE 连接中断、映射内存 4. 中断处理就绪 ISR + DPC 等待硬件中断 关键差异点 NT 式:DriverEntry 中 直接连接中断 WDM:StartDevice 中 动态连接中断 WDM 初始化原则:延迟绑定硬件资源 DriverEntry 只注册回调,不触碰硬件;AddDevice 创建设备对象但不分配资源; StartDevice 在收到 PnP 管理器分配的资源后才连接中断、映射 I/O 端口。

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 管理器可能重新分配中断资源,驱动必须能够动态断开并重新连接中断。
常见误区:初学者容易将 NT 式驱动的中断处理代码直接移植到 WDM 驱动中,忽略 PnP 资源重新平衡和中断共享的检查。这会导致在特定硬件配置下出现蓝屏(BSOD)或设备无法正常工作。本课程后续章节将专门讲解如何在 WDM 框架下正确实现中断连接/断开、ISR/DPC 协作以及 IOCTL 参数的安全校验。

1.1.6 小结