WDM 设备堆栈示例

本部分介绍一组驱动程序可为 USB 硬件创建的设备对象。 它说明了 WDM 设备对象及其分层方式。

下图显示了示例驱动程序创建的设备对象。 有关详细信息,请参阅 WDM 驱动程序层:示例

图示显示了用于 USB 游戏杆的示例 WDM 设备对象层。

从此图底部开始,示例设备堆栈中的设备对象包括:

  1. PCI 总线的 PDO 和 FDO。

    根总线驱动程序枚举内部系统总线(根总线),并为找到的每个设备创建 PDO。 其中一个 PDO 适用于 PCI 总线。 (该图不显示根总线的 PDO 和 FDO。

    PnP 管理器将 PCI 驱动程序标识为 PCI 总线的函数驱动程序,加载驱动程序(如果尚未加载),并将 PDO 传递给 PCI 驱动程序。 在 AddDevice 例程中,PCI 驱动程序为 PCI 总线(IoCreateDevice)创建 FDO,并将 FDO 附加到 PCI 总线的设备堆栈(IoAttachDeviceToDeviceStack)。 PCI 驱动程序作为 PCI 总线的功能驱动程序,负责创建并附加此 FDO。

    此示例不包括 PCI 总线的筛选器驱动程序。

  2. USB 主机控制器的 PDO 和 FDO。

    PnP 管理器指示 PCI 驱动程序启动其设备(IRP_MN_START_DEVICE),然后查询 PCI 驱动程序的子设备(IRP_MN_QUERY_DEVICE_RELATIONS,关系类型为 BusRelations)。 作为响应,PCI 驱动程序在其总线上枚举设备。 在此示例中,PCI 驱动程序查找 USB 主机控制器,并为该设备创建 PDO。 图中的宽箭头表示 USB 主机控制器是 PCI 总线的“子级”。 PCI 驱动程序承担 PCI 总线的总线驱动程序职责,会为其子设备创建 PDO。

    PnP 管理器将 USB 主机控制器微型类/类驱动程序对标识为 USB 主机控制器的函数驱动程序,并加载驱动程序对。 PnP 管理器在适当的时间调用驱动程序对,以便为 USB 主机控制器创建和附加 FDO。

    此示例不包括 USB 主机控制器的筛选器驱动程序。

  3. USB 集线器的 PDO 和 FDO。

    USB 主机控制器枚举其总线,在唯一端口中找到 USB 集线器,并为集线器创建 PDO。 USB 集线器驱动程序为集线器创建并附加 FDO(功能设备对象)。

    此示例不包括 USB 中心的筛选器驱动程序。

  4. 游戏杆设备的 PDO、FDO 和两个筛选器 DO。

    USB 集线器驱动程序枚举其总线,找到 HID 设备(游戏杆),并为游戏杆创建 PDO。

    在此示例中,在游戏杆设备的注册表中设置了较低级别的过滤驱动程序,因此 PnP 管理器加载了过滤驱动程序。 筛选器驱动程序确定它与设备相关,并创建筛选器 DO 并将其附加到设备堆栈。

    PnP 管理器确定操作游戏杆设备的功能驱动程序是 HID 类/微型类驱动程序对,并加载这些驱动程序。 驱动程序对由一个微型驱动程序和一个类驱动程序 DLL 组成,二者相互关联。 它们共同充当设备的一个功能驱动程序。 类/微型类驱动程序对创建一个设备对象(FDO),并将其附加到设备堆栈上。

    上层筛选器驱动程序以类似于较低级别的筛选器的方式创建筛选器 DO 并将其附加到设备堆栈。

父总线驱动程序始终为特定设备创建设备堆栈底部的 PDO。 当驱动程序处理 PnP 或电源 IRP 时,它们必须将每个 IRP 向下传递到设备堆栈的底部,直到到达 PDO 及其关联的总线驱动程序。

下图显示了与上图相同的设备堆栈,但强调每个驱动程序创建和管理的设备对象。

从驱动程序视角展示示例设备对象层的图。

总线驱动程序跨越多个设备堆栈。 总线驱动程序为其总线适配器或控制器创建 FDO,并为其每个子设备创建 PDO。