排查容器 ID 实现问题
如果在“设备和打印机”用户界面 (UI) 中出现多个设备实例,而你期望只有一个实例,则设备无法正确实现容器 ID 要求。 此不正确的实现会导致即插即用 (PnP) 管理器将一个或多个设备节点 (开发节点) 分组到设备的其他设备容器中。
在这种情况下,应检查以下内容:
是否为设备枚举的每个开发节点正确设置了可移动设备功能?
这是设备和打印机 UI 中多个设备实例的最常见原因。 确保设备的每个开发节点都相应地设置了可移动设备功能。 设备的顶层或 父级开发节点应报告为可移动,其所有子级应报告为不可移动。 自定义总线驱动程序实现必须为它们枚举的 devnode 正确分配可移动关系。
设备管理器是诊断这些问题的宝贵工具。 可以按照以下步骤检查完整的开发节点层次结构:
- 右键单击“ 我的电脑” 图标,然后单击“ 管理 ”。 ,然后从结果显示中列出的“系统工具”中选择“设备管理器”。
- 在下拉菜单中单击“ 按连接查看 ”。
- 找到构成设备的开发节点。 对于每个开发节点,右键单击该节点,然后单击“ 属性”。
- 在“ 详细信息 ”选项卡上的 “属性” 下拉列表中,单击“ 功能”。
如果 devnode 的功能值列表包含 CM_DEVCAP_REMOVABLE 标志,则 devnode 将标记为可移动。 然后,即插即用 (PnP) 管理器为开发节点及其子级创建一个无法删除的新设备容器。
有关可移动设备功能的详细信息,请参阅 从可移动设备功能生成的容器 ID。
有关设备管理器的详细信息,请参阅使用设备管理器。
设备是否在硬件中包含容器 ID 或其他唯一标识符?
确保硬件中容器 ID 或唯一标识符的格式符合给定总线的格式要求。 有关详细信息,请参阅 从Bus-Specific唯一 ID 生成的容器 ID。
如果设备的开发节点由自定义总线驱动程序枚举,检查总线驱动程序正确响应 BusQueryContainerID的IRP_MN_QUERY_ID请求。
设备是否同时通过多个总线连接到计算机?
如果设备通过两个或多个总线同时连接到计算机,则设备和打印机 UI 中会显示两个或更多个设备实例。 对于设备连接到的每个总线,这些实例可以有一个或多个设备实例。 若要解决此问题,请确保设备报告容器 ID 或特定于设备的唯一标识符,并在每个总线上报告相同的值。