我正在尝试在Windows系统上唯一地标识USB设备。由于序列号是可选的(在大多数设备上为空),因此我正在查看实例ID。类似于USB\VID_03F0&PID_094A\6&24b73976&0&2
的字段。
我已经知道如果将同一设备插入不同的端口,此ID会更改,但是我可以。问题是:如果我使用相同的设备(在本例中为鼠标)并将其插入,它将获得相同或不同的实例ID?
我已经做过一些研究,似乎没人完全知道VID和PID背后的部分是什么。它们似乎确实标识了端口和/或集线器,但是如果将不同的设备插入同一插槽,则不仅会看到不同的VID和PID,而且还会看到不同的垃圾。例如,这是一个插入相同端口的键盘:USB\VID_046D&PID_C328&MI_00\7&3f9ff46&0&0000
Microsoft文档或此处的相关问题都无法回答此问题。
如果我有两只相似的鼠标(或键盘,或其他任何东西),即同一制造商和型号,如果将它们插入相同的端口,它们会得到相同或不同的实例ID吗?
我是否有机会唯一地标识特定的设备(而不仅仅是型号)?
答案 0 :(得分:1)
如果我使用相同的设备(在本例中为鼠标)并将其插入,它将获得相同或不同的实例ID?
除非原始设备仍处于连接状态,否则它将获得相同的ID。没有唯一的序列号字符串,操作系统就无法分辨差异。
答案 1 :(得分:1)
如果您查看Windows在使用USB协议分析器插入USB设备时所执行的操作,则可以看到它通过读取USB描述符而启动。这些是二进制数据,如设备描述符(具有供应商ID,产品ID和版本),配置描述符(表明设备支持的接口以及设备使用的端点),字符串描述符(如制造商名称,产品名称)和序列号),以及在USB协议的各种扩展中添加的其他USB描述符。
我不知道Windows是如何选择设备实例ID的,但ID很有可能是这些描述符中的字节,您将设备插入的端口以及其他所有函数的函数。 Windows不太可能使用任何高级指纹技术来尝试嗅探不同USB设备之间的细微差别,因为这似乎是在浪费精力。我推测设备实例ID的要点是,Windows可以找到一个注册表项(在HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Enum \ USB内),该注册表项指示上次插入设备时决定使用哪些驱动程序,以及这些驱动程序使用了什么设置。
设备的型号与其USB描述符之间没有普遍的关联。您可能有两个外观相似的键盘,它们具有完全不同的固件和USB描述符,只是因为制造商选择升级固件。您可能有两个使用相同固件的不同颜色的键盘,因此它们看起来与计算机相同,因为它们对所有可能的USB消息都具有相同的响应(这不仅仅是Star Trek的幻想)。
答案 2 :(得分:0)
关于第一个问题(标题中):
Windows上的USB实例ID对于设备是唯一的吗?
摘录自Microsoft Device Instance ID page:
设备实例ID是系统提供的设备标识字符串,用于唯一标识系统中的设备。
和
设备实例ID在系统重新启动后保持不变。
因此,回答您的问题:
系统设备ID唯一地标识特定Windows系统中的设备。
请注意:其任务是识别本机中的设备。从设备中删除设备后,该设备不再是该计算机的一部分。
因此,现在,如果您从系统中删除设备并重新插入设备,则不能确定设备实例ID是否相同。 BUT :
如果重新启动系统,则可以确保设备实例ID相同。
让我们继续,检查您的下一个问题。
关于第二个问题:
如果我使用相同的设备(在我的示例中为鼠标)并将其插入,它将获得相同或不同的实例ID?
让我们再次看看Microsoft Device Instance ID page:
此字符串的格式由连接到设备ID的实例ID组成,如下所示:
<device-ID>\<instance-specific-ID>
和
以下是实例ID(“ 1&08”)与PCI设备的设备ID串联的示例:
PCI\VEN_1000&DEV_0001&SUBSYS_00000000&REV_02\1&08
因此,在USB\VID_xxx&PID_xxx\
部分之后,您看到的是Instance ID
(名称与System Device ID
的微小区别)
让我们看一下Microsoft Instance ID page:
实例ID是设备标识字符串,用于将设备与计算机上其他相同类型的设备区分开。实例ID包含序列号信息(如果基础总线支持)或某种位置信息
和
设备DEVICE_CAPABILITIES结构的UniqueID成员指示总线提供的实例ID在整个系统中是否唯一,如下所示:
- 如果UniqueID为FALSE,则设备的总线提供的实例ID仅对设备的总线唯一。即插即用(PnP)管理器修改总线提供的实例ID,并将其与相应的设备ID组合在一起,以创建系统中唯一的设备实例ID。
- 如果UniqueID为TRUE,则由总线提供的设备ID和实例ID组成的设备实例ID将唯一标识系统中的设备。
因此,回答您的问题:
UniqueID
为TRUE
,则即使您将设备移至其他USB端口,设备实例ID也会相同(我补充道:当USB设备提供序列号)UniqueID
是FALSE
,则不能确保总线提供的实例ID相同,因此不能确保整个设备实例ID都相同。 (但是,在系统重新启动时,实例ID应该相同,因此,如果您的device1和device2相同,并且在系统重新启动期间交换它们,则我认为实例ID相同,因此设备实例ID也将相同!扩展此范围,如果device1和device2是同一设备,则只需删除device1并在系统重启期间将其重新插入即可,并且设备实例ID应该相同!)这是因为系统设备ID的任务是识别系统中的设备,而不是整个世界(因此,与系统分离的设备)。
这也回答了您的第三个问题:
如果我有两只相似的鼠标(或键盘,或其他任何东西),即同一制造商和型号,如果将它们插入相同的端口,它们会得到相同或不同的实例ID吗?
关于您的最后一个问题:
我是否有机会唯一地标识特定的设备(而不仅仅是型号)?
是的,并且(再次谈到USB),即使在整个世界中,您也可以唯一地标识特定的设备,如果,制造商会在USB总线上提供序列号, AND 可以确保您的序列号对于该特定(VID,PID)对是唯一的。这是一个非常困难的约束,但是例如考虑一个USB WiFi卡(我在这里有一个Netgear):
由于按照定义,MAC地址是唯一的,因此即使将其插入另一台计算机,也可以确保唯一地标识该设备。
但是,您不能唯一地标识所有设备或您选择的特定设备。它必须满足这些要求。
我测试了上述Netgear USB WiFi卡,即使插入不同的端口,甚至插入不同的计算机,它也具有相同的设备实例ID。
我测试了提供USB序列号的通用USB密钥,其行为与USB WiFi卡相同。
在这些情况下,设备实例ID将类似于:
USB\VID_1221&PID_3234\00004700356
我测试了两个相同的通用USB键盘,并将它们(一次一个)插入了相同的USB集线器端口。设备实例ID保持不变(此外,当我插入第二个键盘时,Windows并没有显示“正在安装硬件”弹出窗口。设备实例ID为:
USB\VID_1C4F&PID_0002\7&15cdfaa&0&3
然后,我将其中一个键盘插入了另一个USB端口,并且设备实例ID更改为:
USB\VID_1C4F&PID_0002\5&2eab04ab&0&1