2013-12-13 5 views
2

При использовании SetupDiGetDeviceInterfaceDetail для извлечения SP_DEVICE_INTERFACE_DETAIL_DATA, относящегося к подключенному USB-устройству, возвращается строка DevicePath.Извлечение USB PID VID из DevicePath

Строка возвращается отформатирован как в следующем примере:

\ \ USB # vid_abcd & pid_1234 # 000000000 # {хххх-хххх-хххх-хххх-XXXXXXXXXXXX}

Вопрос: Является ли форматирование/синтаксис этой строки, документально зафиксированный где-либо и/или известный как надежный во всех версиях Windows XP/Vista/7/8?

Я экспериментирую с кодом для извлечения значений VID и PID из этой строки, чтобы идентифицировать упомянутое устройство и хотел бы знать, является ли это надежным способом получения значений VID и PID.

+0

Я использовал этот формат в течение многих лет. Я не уверен, где это задокументировано, но могу сказать, что он был надежным для меня в производственном коде. Я добавил несколько тегов, чтобы получить более заметную информацию от разработчиков, которые могут знать. – Preston

+0

Какой API вы используете для доступа к вашему USB-устройству, например WinUSB или libusb? У них есть API, которые вы можете использовать для целевых устройств по своим идентификаторам, или получить дескрипторы, чтобы посмотреть на значения, которые возникают из самого устройства. – Preston

+0

Спасибо за ответ. Я использую функции setupapi.dll, такие как SetupDiEnumDeviceInterfaces, чтобы получить путь к USB-устройству. Затем я использую CreateFile, WriteFile, ReadFile и т. Д. Для связи с этим устройством. – user3099783

ответ

3

Хотя вам может быть легко просто проанализировать путь к устройству для получения этой информации, технически это незаконно, поскольку пути устройств в Windows должны быть непрозрачными.

Взгляните на образец usbview, чтобы увидеть правильный путь для этого.

+0

Эта ссылка usbview относится к личной странице Microsoft. Имеется ли какая-либо общедоступная информация? – user23573

+0

@BogdanWilli Я обновил ссылку, чтобы указать на новую страницу Github. – TripShock

+0

большое спасибо !. Я также нашел страницу [Uwe Sieber] (http://www.uwe-sieber.de/usbtreeview_e.html). Возможно, он автор. – user23573

0

Эта конкретная строка не документирована, поэтому более безопасным вариантом будет использование идентификаторов оборудования USB-устройства. Они документированы Microsoft на странице под названием Standard USB Identifiers, в котором говорится:

Когда новое устройство USB подключено к розетке, система поставляемого драйвер USB хаба сочиняет следующий идентификатор устройства, используя информацию, извлеченную из дескриптора устройства устройства :

USB\VID_v(4)&PID_d(4)&REV_r(4) 

Где:

  • v (4) является 4-значный код поставщика, что комитет USB назначает поставщику.
  • d (4) - это 4-значный код продукта, который поставщик назначает устройству.
  • r (4) - код редакции.

Для получения дополнительной связи смотрите на странице MSDN под названием Device Identification Strings.

0

В отличие от TripShock Я считаю, что вы можете разобраться с путями устройств и вполне законно это сделать.

  1. Microsoft имеет published documentation о путях устройства, как David Grayson указывает в своем ответе.

  2. Код, опубликованный microsoft, делает это именно так. (usbview)

Вероятно, нет ни одного «официальный» способ, как это сделать. ИМХО, надежность этого метода в Windows 7, 8, 8.1 и 10 должна быть в порядке, но я бы не стал делать ставку на всю вечность.

Одним из наиболее ценных источников для USB-устройств является пример usbview, который теперь опубликован Microsoft. Это, вероятно, «самый официальный», который он когда-либо получит, учитывая, что 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; 
+1

Это не похоже на синтаксический анализ той же строки, хотя ... '" PCI ... ' – Timmmm