何时创建 WDM 设备对象?
本部分介绍每种类型的设备对象,并提及创建每种设备对象时。
下图显示了可在设备堆栈中附加的可能类型的设备对象,表示处理设备的 I/O 请求的驱动程序。
从下图底部开始:
总线驱动程序为其在其总线上枚举的每个设备创建 PDO。
总线驱动程序在枚举设备时为子设备创建 PDO。 总线驱动程序枚举设备,以响应来自 PnP 管理器 的BusRelations IRP_MN_QUERY_DEVICE_RELATIONS请求。 如果自上次总线驱动程序响应 BusRelations (查询关系请求以来,已将设备添加到总线,或者这是自计算机) 启动以来的第一个查询关系请求,则总线驱动程序会为子设备创建 PDO。
PDO 表示总线驱动程序以及其他内核模式系统组件(如电源管理器、PnP 管理器和 I/O 管理器)的设备。
设备的其他驱动程序将设备对象附加到 PDO 的顶部,但 PDO 始终位于设备堆栈的底部。
可选的总线筛选器驱动程序为其筛选的每个设备创建筛选器DO。
当 PnP 管理器在 BusRelations 列表中检测到新设备时,它会确定设备是否有任何总线筛选器驱动程序。 如果是这样,则对于每个此类驱动程序,PnP 管理器确保加载它 (在必要时调用 DriverEntry) 并调用驱动程序的 AddDevice 例程。 如果总线筛选器驱动程序筛选此设备的操作,则筛选器驱动程序会创建一个设备对象,并将其附加到其 AddDevice 例程中的设备堆栈。 如果存在多个总线筛选器驱动程序并且与该设备相关,则每个此类筛选器驱动程序都会创建并附加其自己的设备对象。
可选的较低级别的筛选器驱动程序为其筛选的每个设备创建筛选器DO。
如果此设备存在可选的较低级别筛选器驱动程序,则 PnP 管理器可确保在总线驱动程序和任何总线筛选器驱动程序之后加载此类驱动程序。 PnP 管理器调用筛选器驱动程序的 AddDevice 例程。 在其 AddDevice 例程中,较低级别的筛选器驱动程序为设备创建筛选器 DO 并将其附加到设备堆栈。 如果存在多个较低级别的筛选器驱动程序,则每个此类驱动程序将创建并附加自己的筛选器 DO。
函数驱动程序为设备创建 FDO。
PnP 管理器确保加载设备的函数驱动程序并调用函数驱动程序的 AddDevice 例程。 函数驱动程序创建 FDO 并将其附加到设备堆栈。
可选的高级筛选器驱动程序为其筛选的每个设备创建筛选器 DO。
如果设备存在任何可选的高级筛选器驱动程序,则 PnP 管理器将确保在函数驱动程序之后加载这些驱动程序,并调用其 AddDevice 例程。 每个此类筛选器驱动程序将其设备对象附加到设备堆栈。
总之,设备堆栈包含处理特定设备 I/O 所涉及的每个驱动程序的设备对象。 父总线驱动程序具有 PDO,函数驱动程序具有 FDO,每个可选筛选器驱动程序都有一个筛选器 DO。
请注意,所有设备、总线适配器/控制器设备和非总线设备在其设备堆栈中都有 PDO 和 FDO。 总线适配器/控制器的 PDO 由父总线的总线驱动程序创建。 例如,如果 SCSI 适配器插入 PCI 总线,PCI 总线驱动程序会为 SCSI 适配器创建 PDO。
如果在原始模式下使用设备,则没有函数或筛选器驱动程序, (没有 FDO 或筛选器DO) 。 只有一个 PDO 用于父总线驱动程序和零个或多个总线筛选器DO。
有关负责创建和附加 设备对象的 驱动程序例程的信息,请参阅创建设备对象。
设备堆栈和一些附加信息构成了设备的 开发节点 。 PnP 管理器维护设备开发节点中的信息,例如设备是否已启动,以及哪些驱动程序(如果有)已注册以通知设备上的更改。 内核调试器命令 !devnode 显示有关开发节点的信息。