示例 WDM 设备堆栈

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

下图显示了由 WDM 驱动程序层中描述的示例驱动程序创建的设备对象:示例。

diagram illustrating sample wdm device object layers for a usb joystick.

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

  1. PCI 总线的 PDO 和 FDO。

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

    PnP 管理器将 PCI 驱动程序标识为 PCI 总线的功能驱动程序,如果驱动程序尚未加载) ,则加载驱动程序 (,并将 PDO 传递给 PCI 驱动程序。 在 AddDevice 例程中,PCI 驱动程序为 PCI 总线创建 FDO (IoCreateDevice) ,并将 FDO 附加到 IOAttachDeviceToDeviceStack (IoAttachDeviceToDeviceStack) 。 PCI 驱动程序创建并附加此 FDO 作为 PCI 总线的功能驱动程序的责任的一部分。

    此示例中没有 PCI 总线的筛选器驱动程序。

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

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

    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 及其关联的总线驱动程序。

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

diagram illustrating sample device object layers from the driver perspective.

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