尝试使用DeviceID字段从WMI查询中唯一地标识USB设备

时间:2014-05-29 17:01:14

标签: windows c#-4.0 usb wmi-query

当查询WMI并返回设备列表时,我在DeviceID字符串的END处注意到了一些信息,这些信息在我到目前为止看不到任何地方。以下是从WMI查询返回的DeviceID字符串示例,该查询位于 Win32_PnPEntity

USB \ VID_046D&安培; PID_082D&安培; MI_00 \ 7和; 3538A2BF&安培0安培; 0000

现在,前两个部分 - 'USB'和VID和PID都有很好的文档记录,'接口编号' - & MI_XX。但是,在我看过的任何地方都没有记录字符串的最后部分(如下所示)。我甚至不知道该怎么称呼这部分DeviceID字符串:

\ 7和; 3538A2BF&安培0安培; 0000

奇怪的是,它有几种口味。我已经注意到,如果我将两个相同的设备插入PC,我会得到不同的值,我因为缺乏更好的文档参考信息而默认为“实例ID”。当我将两个相同的USB网络摄像头插入我的电脑时,我就看到了这一点:

USB \ VID_046D&安培; PID_082D&安培; MI_00 \ 6和; DB509D0&安培0安培; 0000 USB \ VID_046D&安培; PID_082D&安培; MI_00 \ 7和; 3538A2BF&安培0安培; 0000

到目前为止,这么好。我可以看出,我有两个插入PC的相同设备,可以解析这些独特的值。可是等等!当操作系统看到这些设备时,它还会加载驱动程序为不同的“接口”或操作模式提供的任何内容,因此当我针对 Win32_PnPEntity 进行WMI查询时,除了上述条目之外,我还会得到这些DeviceID字段中的好条目:

USB \ VID_046D&安培; PID_082D \ 195825EF

USB \ VID_046D&安培; PID_082D \ 36149BBF

所以问题在于,如果没有描述DeviceID的最后部分的文档,我不知道,并且不能在查询结果中将这些“重复”条目与其兄弟关联或分离。

目标 是能够扫描WMI结果,识别给定设备的ONE'主要'条目并丢弃其他任何内容。我可能通过在描述字段中查找“USB复合设备”来进行过滤,但这相当丑陋并且会丢弃一些没有适当或供应商指定的“描述”的设备。

MSDN仅提供DeviceID是“USB控制器的唯一标识符。此属性继承自CIM_LogicalDevice”。 - 并且CIM_LogicalDevice也没有详细说明该字段的构成。

任何人都沿着这条路走下去或知道要看哪个洞?此处和其他论坛中的类似问题仍未得到答复。 (嘿M $,为什么这个%$ @#!mystical ???)

1 个答案:

答案 0 :(得分:2)

看起来这个网络摄像头是一个复合设备。

我认为ID为 USB \ VID_046D& PID_082D \ 36149BBF 的节点是父设备。在这种情况下,第二次斜杠之后的部分很可能是设备的序列号。 (我已经为复合设备制作了多年的Windows软件,我们总是通过解析该部分获得序列号)。此节点可能使用usbccgp.sys作为驱动程序,它允许它解析设备的接口描述符并生成子节点。

ID USB \ VID_046D& PID_082D& MI_00 \ 6& DB509D0& 0& 0000 的节点是与USB接口0对应的子节点。根据我的经验,我相信该部分之后的部分第二个斜杠是某种独特的标识符,取决于设备插入的USB端口。

对于WMI查询,您可能应该完全忽略子节点。在第二个斜杠之前,只丢弃MI_中的任何内容。父节点会告诉您需要了解的有关设备身份的所有信息。