在Windows系统中,USB实例ID对于一个设备来说是唯一的吗?

8
我正在尝试在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?
我有没有机会唯一地识别特定设备(而不仅仅是模型)?

您不能将两个设备插入同一个端口。这意味着您提出的两个设备不会同时插入。此外,如果这些设备是相同的,那么您实际上不需要两个不同的设备,只需使用一个即可。因此,您可以将问题简化为:“如果我拔下 USB 设备并将其重新插入同一个 USB 端口,设备实例 ID 是否有可能发生更改?” - David Grayson
不,我实际上对完全相同的设备(即相同型号)感兴趣。是的,当然可以在不同的时间使用相同的端口。 - Tom
如果您有两个完全相同的设备,但从未同时插入电脑,那么从电脑的角度来看,您可能只有一个设备。由于它们是相同的,电脑永远无法知道它们是不同的物理设备,因此必须将您的两个不同设备视为相同设备进行处理。因此,我的原始观点仍然成立。 - David Grayson
如果它们是完全相同的,它如何区分它们?根据“相同”的定义,相同的设备对所有USB消息的响应方式都是相同的。 - David Grayson
相同的模型,不是像“星际迷航”克隆一样完全相同。例如,即使它们看起来完全相同,我也没有问题区分不同的iPhone,因为它们有唯一的序列号。我还可以通过浏览器指纹识别98%可靠地识别不同的访问者访问我的网站。我想知道是否有类似于USB上的第1或第2个这样的东西。 - Tom
显示剩余2条评论
3个回答

16
关于你的第一个问题(标题中的):
Windows上的USB实例ID对设备是唯一的吗?
摘自Microsoft Device Instance ID page
设备实例ID是系统提供的设备识别字符串,可在系统中唯一标识设备。
还有:
设备实例ID在系统重启后仍然存在。
所以,回答你的问题:
系统设备ID可以唯一标识特定Windows系统中的设备。
请注意:它的任务是在此计算机中标识设备。一旦从计算机中移除设备,那么该设备将不再是此计算机的一部分
因此,现在,如果您从系统中移除设备并重新插入它,您无法确定设备实例ID是否相同,但是:
如果您重新启动系统,则可以确定设备实例ID将保持不变。
让我们继续前进,检查您的下一个问题。
关于你的第二个问题:
如果我插入一个相同的设备(例如鼠标),它会得到相同或不同的实例 ID 吗?
让我们再次查看 Microsoft 设备实例 ID 页面
此字符串的格式由实例 ID 连接到设备 ID,如下所示: \ 以下是用于 PCI 设备的实例 ID(“1&08”)连接到设备 ID 的示例:
PCI\VEN_1000&DEV_0001&SUBSYS_00000000&REV_02\1&08
因此,在 USB\VID_xxx&PID_xxx\ 部分之后,您看到的是实例 ID(名称与系统设备 ID 相比略有不同)
让我们看一下 Microsoft 实例 ID 页面
实例 ID 是区分计算机上同一类型的其他设备的设备标识字符串。如果底层总线支持,实例 ID 包含序列号信息或某种位置信息。
DEVICE_CAPABILITIES结构体的UniqueID成员指示设备的总线提供的实例ID在系统中是否唯一,如下所示:
- 如果UniqueID为FALSE,则设备的总线提供的实例ID仅对该设备的总线唯一。PnP管理器修改总线提供的实例ID,并将其与相应的设备ID组合,以创建在系统中唯一的设备实例ID。 - 如果UniqueID为TRUE,则从总线提供的设备ID和实例ID形成的设备实例ID在系统中唯一标识设备。
因此,回答你的问题:
- 如果UniqueID为TRUE,则即使将设备移动到不同的USB端口(我补充说:这是USB设备提供序列号时发生的情况),设备实例ID也将保持不变。 - 如果UniqueID为FALSE,则不能确定总线提供的实例ID是否相同,因此无法确定整个设备实例ID是否相同。(但是,实例ID应在系统重启时相同,因此如果有相同的device1和device2,并在系统重启期间交换它们,我认为实例ID将相同,因此设备实例ID也将相同!进一步地,如果device1和device2是相同的设备,则可以在系统重启期间简单地删除device1并重新插入它,设备实例ID应该是相同的!)
这是因为系统设备ID的任务是识别系统中的设备,而不是整个世界上的设备(因此,从系统分离的设备除外)。
这也回答了您的第三个问题:
“如果我有两个相似的鼠标(或键盘等),即相同的制造商和型号,如果我将它们插入同一个端口,它们会获得相同的还是不同的实例ID?”
关于您上一个问题:
您是否有任何机会唯一标识特定设备(不仅仅是型号)?
是的,(再次提到USB)如果制造商在USB总线上提供序列号,并保证该序列号对于特定(VID,PID)对是唯一的,那么您甚至可以在全球范围内唯一标识特定设备。这是一个非常严格的限制,但例如考虑一个USB WiFi卡(我这里有一个Netgear):
它提供USB序列号
USB序列号恰好是其MAC地址
由于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

更多参考资料

微软关于USB标识符的页面


@Tom - 你应该考虑将这个答案标记为“最佳答案”。 - GTAE86

2
如果您使用USB协议分析器观察Windows插入USB设备时的操作,您会发现它首先读取USB描述符。这些是二进制数据片段,例如设备描述符(其中包含供应商ID、产品ID和版本信息)、配置描述符(指定设备支持的接口和使用的端点)、字符串描述符(如制造商名称、产品名称和序列号)以及其他在USB协议的各种扩展中添加的USB描述符。
我不确定Windows如何选择设备实例ID,但很可能该ID是这些描述符中的字节、您插入设备的端口以及其他因素的函数。Windows几乎不可能使用任何高级指纹识别技术来嗅探不同USB设备之间微小差异,因为这似乎是浪费精力。我猜测设备实例ID的主要目的是让Windows找到一个注册表键(位于HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB内),该键指示上次插入设备时Windows决定使用哪些驱动程序以及这些驱动程序的设置。
设备型号与其USB描述符之间不存在普遍的关联。您可以拥有两个外观相似但固件和USB描述符完全不同的键盘,仅因制造商选择升级固件。您可以拥有两个不同颜色的键盘,它们使用相同的固件,因此对计算机来说是完全相同的,因为它们会对所有可能的USB消息作出相同的响应(这不仅是《星际迷航》中的幻想)。

1
如果我插入一个相同的设备(以鼠标为例),它会获得相同或不同的实例ID吗?
除非原始设备仍然连接,否则它将获得相同的ID。没有唯一的序列号字符串,操作系统就无法区分它们之间的差异。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接