Извлечение USB PID VID из DevicePath
При использовании SetupDiGetDeviceInterfaceDetail для извлечения SP_DEVICE_INTERFACE_DETAIL_DATA, относящегося к подключенному USB-устройству, возвращается строка с именем DevicePath.
Возвращаемая строка форматируется как в следующем примере:
\? \ USB #vid_abcd&pid_1234#000000000#{хххх-хххх-хххх-хххх-XXXXXXXXXXXX}
Вопрос: документировано ли где-либо и / или известно ли форматирование / синтаксис этой строки надежным во всех версиях Windows XP/Vista/7/8?
Я экспериментирую с кодом для извлечения значений VID и PID из этой строки, чтобы идентифицировать упомянутое устройство, и хотел бы знать, является ли это надежным способом получения значений VID и PID.
3 ответа
Хотя вам может показаться, что просто разобрать путь к устройству, чтобы получить эту информацию, технически это незаконно, поскольку пути к устройствам в Windows должны быть непрозрачными.
Взгляните на образец usbview, чтобы увидеть правильный способ сделать это.
В отличие от TripShock, я считаю, что вы можете анализировать пути к устройствам, и это совершенно законно.
Microsoft опубликовала документацию о путях устройства, как указывает David Grayson в своем ответе.
Код, опубликованный Microsoft, делает это именно так. ( usbview)
Вероятно, нет единого "официального" способа сделать это. ИМХО, надежность этого метода для Windows 7, 8, 8.1 и 10 должна быть в порядке, но я бы не стал делать ставку на всю вечность.
Одним из наиболее ценных источников для USB-устройств является пример usbview, который сейчас публикуется Microsoft. Это, вероятно, "самый официальный", который он когда-либо получит, учитывая, что Microsoft публикует этот код.
Уве Зибер, кажется, является первоначальным автором usbview. В файле enum.c, начиная со строки 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;
Эта конкретная строка не задокументирована, поэтому безопаснее было бы использовать идентификаторы оборудования USB-устройства. Они задокументированы Microsoft на странице под названием " Стандартные USB-идентификаторы", которая гласит:
Когда подключено новое USB-устройство, системный драйвер USB-концентратора, поставляемый системой, создает следующий идентификатор устройства, используя информацию, извлеченную из дескриптора устройства:
USB\VID_v(4)&PID_d(4)&REV_r(4)
Куда:
- v (4) - это 4-значный код поставщика, который USB-комитет назначает поставщику.
- d (4) - это 4-значный код продукта, который поставщик назначает устройству.
- r (4) код ревизии.
Дополнительные сведения см. На странице MSDN, озаглавленной " Строки идентификации устройства".