新的 Windows 驱动框架 WDF (Windows Driver Foundation)
Posted on 2004-07-08 11:59 Flier Lu 阅读(6562) 评论(2) 编辑 收藏 举报
http://www.blogcn.com/user8/flier_lu/index.html?id=2507847&run=.0FB98AB
WDM (Windows Driver Model) 都还没有完全弄明白,M$ 居然在 WinHEC 上又推出了将全面取代 WDM 的 WDF (Windows Driver Foundation)。OSR Online 上几篇文章简要地介绍了 WDF 的一些新特性,并在 A New Framework 一文中给出了一个实际的 WDF 例子。
因为没有开发环境,只能粗略看了一下文章,感觉对我的需求来说结构上调整不算很大。亮点主要是针对新的 PnP/Power 模型的进一步优化和调整、可放弃的驱动创建(例如在 Longhorn 中可以中断并放弃 IRP_MJ_CREATE 操作)、新的存储架构(不明白 :()、灵活的任务请求队列(支持串行、并行和定制任务分发)、以及一些其他细节方面的改进。
在驱动模型方面,WDF 使用一些新的类型驱动 WDM 的相应类型,并做了一定的扩展:
WDF 类型 WDM 类型
WDFDRIVER DRIVER_OBJECT
WDFDEVICE DEVICE_OBJECT
WDFREQUEST IRP
WDFQUEUE DPC 队列
WDFINTERRUPT ISR & DPCforISR
DriverEntry 在 WDF 中只负责 WDFDRIVER 类型对象的初始化和构造工作,将设备的管理完全丢到 DioEvtDeviceAdd 函数中,由 WDF 框架在合适的时候调用。
而 DioEvtDeviceAdd 函数则首先初始化 PnP 和电源管理相关结构。
然后初始化并构造设备对象,类似以前 WDM 中的 CreateDevice 和 IoCreateSymbolicLink 调用。
比较有趣的是,WDF 直接提供了请求队列的概念。一个设备可以有多个请求队列,每个请求队列可以有一种模式,如最简单的 WdfIoQueueDispatchSerial 模式下,请求队列将请求串行化后进行处理;而 WdfIoQueueDispatchParallel 模式则自动在每个请求到来时调用 IO 回调函数;最后也可以通过 WdfIoQueueDispatchManual 模式,在请求到来时调用 EvtIoStart 事件处理函数来手工分发请求,类似现在 WDM 的工作方式。而请求队列更是提供了在 Power down 时对请求队列当前请求的自动保存和恢复机制。这样一来驱动的开发又可以剩一些事情了,呵呵。
A New Framework 一文中过于队列有较为广泛的讨论,这儿就不罗嗦了。
对中断的处理,WDF 也使用 OO 思想将 WDM 中的几个回调函数组织了起来,但功能上还是类似的。
最后,WDF 中为了支持电源管理的多种状态切换,提供了一些辅助的状态变迁时的回调函数,简化了驱动中的管理代码实现。
因为还没有拿到开发调试环境,连 OSR 的例子都下载不下来,只能泛泛而谈。等弄到实际东西再详细讨论吧,呵呵,有兴趣的朋友可以先看看 OSR Online 上几篇相关文章,讲的还是比较详细的。
WDM (Windows Driver Model) 都还没有完全弄明白,M$ 居然在 WinHEC 上又推出了将全面取代 WDM 的 WDF (Windows Driver Foundation)。OSR Online 上几篇文章简要地介绍了 WDF 的一些新特性,并在 A New Framework 一文中给出了一个实际的 WDF 例子。
因为没有开发环境,只能粗略看了一下文章,感觉对我的需求来说结构上调整不算很大。亮点主要是针对新的 PnP/Power 模型的进一步优化和调整、可放弃的驱动创建(例如在 Longhorn 中可以中断并放弃 IRP_MJ_CREATE 操作)、新的存储架构(不明白 :()、灵活的任务请求队列(支持串行、并行和定制任务分发)、以及一些其他细节方面的改进。
在驱动模型方面,WDF 使用一些新的类型驱动 WDM 的相应类型,并做了一定的扩展:
WDF 类型 WDM 类型
WDFDRIVER DRIVER_OBJECT
WDFDEVICE DEVICE_OBJECT
WDFREQUEST IRP
WDFQUEUE DPC 队列
WDFINTERRUPT ISR & DPCforISR
DriverEntry 在 WDF 中只负责 WDFDRIVER 类型对象的初始化和构造工作,将设备的管理完全丢到 DioEvtDeviceAdd 函数中,由 WDF 框架在合适的时候调用。
|
而 DioEvtDeviceAdd 函数则首先初始化 PnP 和电源管理相关结构。
|
然后初始化并构造设备对象,类似以前 WDM 中的 CreateDevice 和 IoCreateSymbolicLink 调用。
|
比较有趣的是,WDF 直接提供了请求队列的概念。一个设备可以有多个请求队列,每个请求队列可以有一种模式,如最简单的 WdfIoQueueDispatchSerial 模式下,请求队列将请求串行化后进行处理;而 WdfIoQueueDispatchParallel 模式则自动在每个请求到来时调用 IO 回调函数;最后也可以通过 WdfIoQueueDispatchManual 模式,在请求到来时调用 EvtIoStart 事件处理函数来手工分发请求,类似现在 WDM 的工作方式。而请求队列更是提供了在 Power down 时对请求队列当前请求的自动保存和恢复机制。这样一来驱动的开发又可以剩一些事情了,呵呵。
A New Framework 一文中过于队列有较为广泛的讨论,这儿就不罗嗦了。
|
对中断的处理,WDF 也使用 OO 思想将 WDM 中的几个回调函数组织了起来,但功能上还是类似的。
|
最后,WDF 中为了支持电源管理的多种状态切换,提供了一些辅助的状态变迁时的回调函数,简化了驱动中的管理代码实现。
|
因为还没有拿到开发调试环境,连 OSR 的例子都下载不下来,只能泛泛而谈。等弄到实际东西再详细讨论吧,呵呵,有兴趣的朋友可以先看看 OSR Online 上几篇相关文章,讲的还是比较详细的。