я получаю имя 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). Спасибо
я поставил usb-monitor (and i know all about her) DCA230360D96EB - device serial number Разница в длинне, теперь тоже понятна. Мне бы как-то еще VendorID, Product ID получить. (и то и другое приходит как WORD)
Тебе они нужны для чего? Если для дальнейшего преобразования в текст, то они уже есть в строчке Даже есть редакция (версия) продукта
Задача такая, мне нужно 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 в чистом виде запрашивая дескрипторы устройства
Способ прост запрашивать дескрипторы устройства с самого устройства. И при помощи них можно получить 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 и реализовывал обмен всеми этими дескрипторами со стороны железа).