首页 > 解决方案 > Windows 上的 USB 实例 ID 对设备来说是唯一的吗?

问题描述

我正在尝试在 Windows 系统上唯一识别 USB 设备。由于序列号是可选的(在大多数设备上为空),我正在查看实例 ID。领域就是这样USB\VID_03F0&PID_094A\6&24b73976&0&2

我已经知道如果我将同一个设备插入不同的端口,这个 ID 会发生变化,但这对我来说没问题。问题是:如果我使用相同的设备(在我的示例中为鼠标)并将其插入,它会获得相同还是不同的 Instance ID ?

我做了一些研究,似乎没有人知道 VID 和 PID 背后的部分是什么。它们似乎确实可以识别端口和/或集线器,但如果我将不同的设备插入同一个插槽,我不仅会看到不同的 VID 和 PID,还会看到不同的垃圾。例如,这是一个插入同一端口的键盘:USB\VID_046D&PID_C328&MI_00\7&3f9ff46&0&0000

Microsoft 文档和此处的相关问题均未回答此问题。

如果我有两个类似的鼠标(或键盘,或其他),即相同的制造商和型号,如果我将它们插入同一个端口,它们会得到相同还是不同的实例 ID?

我是否有机会唯一识别特定设备(不仅仅是型号)?

标签: windowsusbdevice-instance-id

解决方案


关于您的第一个问题(在标题中):

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 唯一地标识系统中的一个设备。

所以,回答你的问题:

  • 如果UniqueIDTRUE,设备实例 ID 将是相同的,即使您将设备移动到不同的 USB 端口(我补充说:当 USB 设备提供序列号时会发生这种情况)
  • 如果UniqueIDFALSE,您无法确定总线提供的实例 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 页面


推荐阅读