如何从可移动设备功能生成容器 ID

如果总线驱动程序无法为其枚举的设备节点 (devnode) 提供容器 ID,则 即插即用 (PnP) 管理器使用可移动设备功能为设备枚举的所有开发节点生成容器 ID。 有关可移动设备功能的详细信息,请参阅 可移动设备功能概述

以下启发式描述如何从可移动设备功能生成容器 ID:

  1. 如果开发节点的可移动设备功能设置为 TRUE,请为开发节点生成新的容器 ID。

  2. 如果 devnode 的可移动设备功能设置为 FALSE,请从其父 devnode 继承容器 ID。

在初始化其 驱动程序堆栈 之前,开发节点无法枚举子开发节点。 一旦在初始化期间分配了容器 ID,devnode 就可以在枚举容器 ID 时将其容器 ID 向下传播到任何不可移动的子级。

将可移动设备功能设置为 TRUE 的 devnode 被视为设备最顶层 (父) devnode,并为此开发节点生成容器 ID。

此父开发节点的所有子级都继承相同的容器 ID,除非它们自己将其可移动设备功能设置为 TRUE。 在这种情况下,可移动子开发节点将分配不同的容器 ID,并成为此可移动设备的父开发节点。 该开发节点的所有子级都继承相同的容器 ID。

例如,假设单一功能鼠标通过 USB 连接到计算机。 在这种情况下,USB 总线驱动程序会检测新设备,并检测它是 USB 人机接口设备 (HID) 。 然后,USB 总线驱动程序为设备创建 USB HID 开发节点。 HID 开发节点还检测 HID 设备是鼠标,并为符合 HID 的鼠标创建子开发节点

将此启发式应用于此示例会导致以下操作:

  1. 创建 USB HID 开发节点。 可移动设备功能在此开发节点上设置为 TRUE ,因为它的父 USB 中心开发节点识别它已插入面向外部的 USB 端口。

  2. 将为此开发节点创建容器 ID,因为它是可移动设备的最顶层开发节点。 因此,此开发节点被视为可移动设备的父开发节点。

  3. 创建符合 HID 的鼠标开发节点。 可移动设备功能在此开发节点上设置为 FALSE ,因为它的父 USB HID 开发节点将其所有子级报告为不可移动。 在这种情况下,符合 HID 的鼠标开发节点继承父开发节点的容器 ID。

通过此启发式,会将相同的容器 ID 分配给属于鼠标的每个开发节点。 即使设备没有唯一标识符,PnP 管理器也已成功将开发节点分组到逻辑设备中。

注意

此启发式成功依赖于特定总线驱动程序,该驱动程序正确报告它枚举的每个开发节点的可移动设备功能。 总线驱动程序必须确保设备的父开发节点应设置为可移动,并且其子开发节点不应设置为可移动。