USB device name

Тема в разделе "WASM.NT.KERNEL", создана пользователем fedotov, 22 сен 2008.

  1. fedotov

    fedotov New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2008
    Сообщения:
    30
    я получаю имя USB устройства при помощи
    SetupDiGetDeviceRegistryProperty(….,SPDRP_PHYSICAL_DEVICE_OBJECT_NAME,…);
    Например в следующей форме:
    DISK&VEN_PRETEC&PROD_04GB&REV2_1\DCA230360D96EB&0
    Могу ли я считать, что DCA230360D96EB&0 уникально определяет это устройство?
    Где можно найти информацию, которая описывает как USB device должен именоваться?
    (для одного устройсва я имею 14 hex digits, для дрогого 16 hex digits).

    Спасибо
     
  2. fedotov

    fedotov New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2008
    Сообщения:
    30
    я поставил usb-monitor (and i know all about her)
    DCA230360D96EB - device serial number
    Разница в длинне, теперь тоже понятна.

    Мне бы как-то еще VendorID, Product ID получить. (и то и другое приходит как WORD)
     
  3. researcher

    researcher New Member

    Публикаций:
    0
    Регистрация:
    18 мар 2005
    Сообщения:
    45
    Адрес:
    Russia
    Тебе они нужны для чего? Если для дальнейшего преобразования в текст, то они уже есть в строчке
    Даже есть редакция (версия) продукта
     
  4. fedotov

    fedotov New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2008
    Сообщения:
    30
    Задача такая, мне нужно vendor as WORD,product as WORD, serial_number as (high\low)DWORD

    В драйвере я распознаю ,что диску J (например) соответствует “Device\\0000005F” (device object of usbstor driver), причем после unplug/plug он меняется.
    Когда мой сервис запрашивает мой же FS driver, то для диска J он получает node = 0x5F. Дальше я делаю цикл используя SetupDiEnumDeviceInfo и сравниваю имя с ““Device\\000000”+”5F” ,кототое я получаю от SetupDiGetDeviceRegistryProperty(..,SPDRP_PHYSICAL_DEVICE_OBJECT_NAME…)
    Используя
    SetupDiGetDeviceInstanceId(..) я получаю “DISK&VEN_PRETEC&PROD_04GB&REV2_1\\DCA230360D96EB&0”

    Проблема состоит в том ,что только из PHYSICAL_DEVICE_OBJECT_NAME= ="\\Device\USBPDO-2" (в моем случае) я могу получить при помощи SetupDiGetDeviceInstanceId(..) такое значение \\USB\\VID_4146&&PID_BA63\\ DCA230360D96EB

    Простейший способ вытащить DCA230360D96EB из “Device\\0000005F” перечислить все "\\Device\USBPDO-X" если в нем найден DCA230360D96EB то вытащить от туда VID/PID и конвертить в WORD.

    Но этот способ мне не очень то нравится.
    Наверное есть способ про мэпить “Device\\0000005F” в "\\Device\USBPDO-2" (частный случай). Или получить VIP/PID каким-то другим способом. Собственно говоря винда получает от usb mass storage device VID/PID/SN в чистом виде запрашивая дескрипторы устройства
     
  5. fedotov

    fedotov New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2008
    Сообщения:
    30
    Способ прост запрашивать дескрипторы устройства с самого устройства. И при помощи них можно получить VIP/PID/SN.
    Девайс получает GET_DESCRIPTOR, и возвращает тип дескриптора,который его запросили.
    VID,PID находятся в Device Descriptor.
    SN находится в String Descriptor, индекс которого находится в Device Descriptor.
    (подробно смотри документ usb_20.pdf, которій можно загрузить с сайта usb.org)

    И что самое хорошее они в виде WORD (VID/PID) и это работает и на XP/Vista (32/64) одинаково хорошо.
    Наверное примерно так делает винда, чтобы знать какой драйвер ей грузить on device arrival.
    (я какое-то время назад писал firmware для usb mass storage device и реализовывал обмен всеми этими дескрипторами со стороны железа).