设备堆栈实例

来源:互联网 发布:怎么查网站域名老旧 编辑:程序博客网 时间: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

原创粉丝点击