设备堆栈实例
来源:互联网 发布:怎么查网站域名老旧 编辑:程序博客网 时间:2024/05/11 19:27
为了详细说明WDM设备对象以及这些设备对象是如何分层的。本文以针对USB硬件的驱动为例,看看设备对象是如何创建的。下图表明了设备对象是如何被一个驱动程序创建的。
我们从最底下开始探讨,该设备栈中设备对象如下所示:
1:针对PCI 总线创建的PDO(PhysicDevice Object)和FDO (FunctionDevice Object)
根总线驱动首先会枚举内部系统总线(根总线)并为每一个找到的设备创建一个PDO。PDO中的一个就是为PCI总线创建的(根总线的PDO和FDO没有在图中标出)。
PnP管理器把PCI驱动当做PCI总线的功能驱动,并把该驱动加载进来(如果没有加载的话),然后把PDO传递给PCI驱动。PCI驱动会在它的AddDevice例程里面为PCI总线创建一个FDO(IoCreateDevice)并把FDO挂载到设备栈上(IoAttachDeviceToDeviceStack)。该例中没有针对PCI总线的过滤程序。
2:针对USB主控制器创建的PDO和FDO
PnP管理器指挥PCI驱动开始它的设备(IRP_MN_START_DEVICE)并且查询他们的子设备,PCI驱动枚举它总线上所有的设备。比如说:PCI驱动找到一个USB主控制器然后为该设备创建一个PDO,图中宽箭头表示USB主控制器是PCI总线的一个子设备。PCI驱动有责任为它的子设备创建PDO,关系类似于总线驱动与PCI总线。
针对该USB主控制器,PnP管理器为它指定小驱动(miniclass driver)/类驱动(class driver)来当做它的功能驱动,然后把该对驱动加载进来。PnP管理器在合适的时间调用该驱动组合并为该USB主控制器挂载一个FDO。该例中没有针对USB主控制器的过滤程序。
3:针对USB hub创建的PDO和FDO
USB主控制器枚举总线上的设备,定位单独端口中的USB hub,并为该hub创建一个PDO,USB hub 驱动为该hub创建并挂载FDO。该例中没有针对USB hub的过滤程序。
4:针对操纵杆设备创建饿PDO,FDO,以及两个过滤器
USB hub枚举总线上的设备,定位HID 设备(本例为游戏操纵杆设备),并为该设备创建一个PDO。
值得注意的是:对通常设备的来说,上游总线创建的PDO总是在设备栈的最底层。当驱动程序处理PnP或者电源IRP时,必须把这些IRP通过设备栈传递给与总线驱动相关的PDO。
下图描述的和上一个图描述的是同一个设备栈。我们重点关注哪一个设备对象被创建以及被哪一个驱动管理。
总线驱动跨越的不单单是一个设备栈,总线驱动为它的每一个总线适配器/控制器创建一个FDO,并且为他的每一个子设备创建一个PDO。
注: 该文章原文出自MSDN
- 设备堆栈实例
- 设备节点和设备堆栈
- 测试堆栈的实例
- Java堆栈测试实例
- java堆栈分析实例
- 堆栈队列实例
- 用结构模仿堆栈实例
- 测试链式堆栈的实例
- C 语言堆栈的实例
- 关于文件系统设备堆栈的说明
- 关于文件系统设备堆栈的说明
- 关于文件系统设备堆栈的说明
- 关于文件系统设备堆栈的说明
- 字符设备学习实例
- 设备驱动实例
- 字符设备驱动实例
- Linux设备驱动实例
- 块设备驱动实例
- Tracker--追踪者
- message sent to deallocated instance 除錯
- 解释 网络字节顺序与主机字节顺序
- Hibernate面试要点 Hibernate
- Zend Framework 中 MVC 异常的捕获与处理
- 设备堆栈实例
- 关于B/S和C/S架构的探析
- ios storyboard学习
- 第十三周任务1
- C#与Fortran混合编程
- VS2008中OpenDialog的使用
- new pcb
- [软件人生]有什么办法摆脱人生低潮之讨论
- JVM分析命令全