Извлечение 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, я считаю, что вы можете анализировать пути к устройствам, и это совершенно законно.

  1. Microsoft опубликовала документацию о путях устройства, как указывает David Grayson в своем ответе.

  2. Код, опубликованный 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, озаглавленной " Строки идентификации устройства".

Другие вопросы по тегам