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