使用SetupDiGetDeviceInterfaceDetail检索与连接的USB设备相关的SP_DEVICE_INTERFACE_DETAIL_DATA时,会返回一个名为DevicePath的字符串。
返回的字符串格式如下例所示:
\ \ USB#vid_abcd&安培; pid_1234#000000000#{XXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}
问题:此字符串的格式/语法是否记录在所有版本的Windows XP / Vista / 7/8中且/或已知是可靠的?
我正在尝试使用代码从此字符串中提取VID和PID值,以便识别所引用的设备,并且想知道这是否是检索VID和PID值的可靠方法。
答案 0 :(得分:3)
虽然您可能会发现解析设备路径以获取此信息很容易,但从技术上讲,这是非法的,因为Windows中的设备路径应该是不透明的。
查看usbview示例,了解正确的方法。
答案 1 :(得分:0)
没有记录该特定字符串,因此更安全的选择是使用USB设备的硬件ID。 Microsoft在一个名为Standard USB Identifiers的页面中记录了这些内容,其中包含:
当插入新的USB设备时,系统提供的USB集线器驱动程序使用从设备的设备描述符中提取的信息组成以下设备ID:
USB\VID_v(4)&PID_d(4)&REV_r(4)
其中:
- v(4)是USB委员会分配给供应商的4位供应商代码。
- d(4)是供应商分配给设备的4位数产品代码。
- r(4)是修订代码。
有关更多上下文,请参阅标题为Device Identification Strings的MSDN页面。
答案 2 :(得分:0)
与TripShock不同,我认为您可以解析设备路径,并且完全合法。
Microsoft在published documentation的答案中指出设备路径为David Grayson。
microsoft发布的代码就是这样做的。 (usbview)
可能没有单一的“官方”方式如何做到这一点。恕我直言,这种方法在Windows 7,8,8.1和10中的稳健性应该没问题,但我不会永远打赌。
最有价值的USB资源之一是usbview示例,现在由Microsoft发布。鉴于微软发布了这段代码,这可能是它将获得的“最官方”。
Uwe Sieber似乎是usbview的原创作者。在文件enum.c starting at line 470中,VID,PID,SUBSYS和RevID值的提取方式如下:
ULONG ven, dev, subsys, rev;
ven = dev = subsys = rev = 0;
if (sscanf_s(DevProps->DeviceId,
"PCI\\VEN_%x&DEV_%x&SUBSYS_%x&REV_%x",
&ven, &dev, &subsys, &rev) != 4)
{
OOPS();
}
hcInfo->VendorID = ven;
hcInfo->DeviceID = dev;
hcInfo->SubSysID = subsys;
hcInfo->Revision = rev;
hcInfo->UsbDeviceProperties = DevProps;