4

当使用 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 值的可靠方法。

4

3 回答 3

2

虽然您可能会发现只解析设备路径以获取此信息很容易,但从技术上讲,这是非法的,因为 Windows 中的设备路径应该是不透明的。

查看usbview示例,了解执行此操作的正确方法。

于 2013-12-18T07:45:01.110 回答
2

TripShock不同,我相信您可以解析设备路径并且这样做是完全合法的。

  1. 正如大卫格雷森在他的回答中指出的那样,微软已经发布了有关设备路径的文档。

  2. 微软发布的代码就是这样做的。(USB视图

可能没有单一的“官方”方式来做到这一点。恕我直言,这种方法在 Windows 7、8、8.1 和 10 上的稳健性应该没问题,但我不会永远打赌。

USB 东西最有价值的来源之一是现在由 Microsoft 发布的usbview示例。鉴于微软发布了这段代码,这可能是它所获得的“最官方的”。

Uwe Sieber似乎是 usbview 的原作者。在从第 470 行开始的文件 enum.c中,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;
于 2015-09-07T13:38:59.663 回答
2

该特定字符串未记录在案,因此更安全的选择是使用 USB 设备的硬件 ID。微软在题为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 页面。

于 2015-09-06T18:03:03.633 回答