WDM 驱动程序设计
一.WDM 简介
微软不断推出新的操作系统,现在 Windows98 和 Windows2000 已经成了主流,原先用来实现驱动程序的 VxD 技术随着 Win95 的淡出也慢慢地
将退出历史舞台,在 Windows98 和 Windows2000 中设备驱动程序将根据 Windows 驱动程序模型(WDM)来设计。WDM 通过提供一种灵活的方式
来简化驱动程序的开发,在实现对新硬件支持的基础上减少并降低所必须开发的驱动程序的数量和复杂性。
Windows 驱动程序模型分两个方面,除了核心模型描述设备驱动程序的标准结构外,WDM 还为常见类型的设备实现了一个模块化的、分层次
类型的总线驱动程序和类驱动程序。总线驱动程序实现了支持通用串行总线(USB)、IEEE1394(FireWire)协议等。类驱动程序是为实现标准 Windo
ws 功能提供条件。WDM 对标准类接口的支持减少了 Windows 95 和 Windows NT 所需的设备驱动程序的数量和复杂性。在 Windows 平台上,WDM
将成为 21 世纪主流的驱动模式。
WDM 支持 USB、IEEE 1394、ACPI 等全新的硬件标准。而且以往在两个平台上同时运行时需要编写两个截然不同的驱动程序,现在只需要编
写一个 WDM 驱动程序就可以了。WDM 驱动程序也是分层的,即不同层上的驱动程序有着不同的优先级,而 Windows 9x 下的 VxD 则没有此结构。
WDM 还引入了功能设备对象 FDO(Functional Device Object)与物理设备对象 PDO(Physical Device Object)两个新类来描述硬件,一个
PDO 对应一个真实硬件。一个硬件只允许有一个 PDO,却可以拥有多个 FDO,在驱动程序中直接操作的不是硬件而是相应的 PDO 与 FDO。在用
户态和内核态通讯方面,系统为每一个用户请求打包形成一个 IRP 结构,将其发送至驱动程序,并通过识别 IRP 中的 PDO 来区别是发送给哪一个
设备的。另外,在驱动程序的加载方面,WDM 不通过驱动程序名称识别,而是通过一个 128 位的全局唯一标识符 GUID 来实现驱动程序的识别。
我们用上图来说明设备驱动程序的分层及调用。
写 WDM 和其它模式驱动程序基本上是相同的,代码中的主要区别在于如何创建设备。
在 WDM 驱动程序中,即插即用(PnP)管理器告知何时向系统添加一个设备,或者从系统删除设备。PnP 管理器使用安装的 INF 文件查找新
设备的正确驱动程序;而其它模式驱动程序必须发现它自己的设备,使用专门的安装程序安装。
另外在细节上也存在很多区别,其它模式驱动程序参数一般由注册表提供,在 DriverEntry 里调用读注册表的函数,然后根据注册表再调用 CreateDevi
ce,但是 WDM 一般不是这样,这是由于 Windows 2000 下支持 PnP,在加载的时候 PnP 管理器调用 AddDevice 入口点创建设备。一般在 DriverEntry
里创建的是一个与设备或者对象毫无关系的虚拟设备,用于管理与 Win32 的通讯。如果不想对该设备做什么特别的处理,或者设备不复杂,AddDevice
可以简单返回 Nt_Success,不用调用 CreateDevice。
另外整个设备驱动树也发生了改变,从而使安装程序发生了很大的改变。WDM 本身的 PNP 管理器被抽象地提升到了 ROOT 的地位。PNP 管
理器负责所有的总线驱动程序的加载。总线驱动程序则负责遍历所有位于总线上的设备,并且为每个设备创建相应的设备对象。当 PNP 管理器发现
一个设备对象,就查找该对象对应的 Driver。并调用该 Driver 的 ADD DEVICE 例程。如果 Driver 不在内存中,就先加载,然后调用 ADD DEVICE
例程。
当然,总线本身并没有发出任何信号告诉 PNP 管理器自己的存在,所以,总线 Driver 是在 NT 的安装时设定的。而 ISA 设备并没有规范,因为
需要 KMD 自己检查硬件存在及状态,所以它是老式 KMD 存在的惟一理由。这也是微软极力在新规范里取消 ISA 总线的理由之一。WDM 支持 PNP
协议和 PM 协议,而且实现时仅仅需要在 MAJOR FUNCTION 里加入一些对 PNP 和 PM 事件响应的例程即可。
一个完整的驱动程序要完成以下工作:初始化;创建与删除设备;处理应用层程序的打开和关闭句柄的请求;处理应用层程序的输入/输出请求;
串行化对设备的访问;访问硬件;调用其他驱动程序;取消 I/O 请求;超时 I/O 请求;处理可热插拔设备的加入和删除事件;电源管理和 WMI。
评论0