Собрали USB девайс. Работаю с ним через драйвера производителя USB контроллера (cypress).
Встала задача определить ID (номер или другую информацию, к которой можно сделать привязку) хаба, к которому подключен наш USB-девайс, а также номер порта. В API драйвера производителя таких функций нет. Единственное, что я могу узнать, это device handle (скорее всего тот, который возвращает CreateFile) и несколько структур USB_DEVICE_DESCRIPTOR, USB_CONFIGURATION_DESCRIPTOR, USB_INTERFACE_DESCRIPTOR.
Насколько я понял, номер порта можно узнать из symbolic name моего устройства. Но я не знаю как его получить, имея на руках только device handle. Скорее всего надо на этот хендл натравить DeviceIoControl с какими-то IOCTL_XXX, но какими никак не могу разобраться.
Построение дерева USB (перечисление всех устройств как в утилите usbview) думаю не подойдет, по причине того, что одновременно к компьютеру будет подключен десяток наших USB девайсов, т.е. сравнение по VID и PID не прокатит. А сравнивать по device handle (одно открыто в драйвере, другое мной в user mode) наверное нет смысла, т.к. скорее всего они будут разные.
Подскажите направление, какую информацию можно извлечь о устройстве имея на руках только этот device handle ?
Здравствуйте, jonnybbs, Вы писали:
J>Здравствуйте,
J>Собрали USB девайс. Работаю с ним через драйвера производителя USB контроллера (cypress).
J>Встала задача определить ID (номер или другую информацию, к которой можно сделать привязку) хаба, к которому подключен наш USB-девайс, а также номер порта. В API драйвера производителя таких функций нет. Единственное, что я могу узнать, это device handle (скорее всего тот, который возвращает CreateFile) и несколько структур USB_DEVICE_DESCRIPTOR, USB_CONFIGURATION_DESCRIPTOR, USB_INTERFACE_DESCRIPTOR.
J>Насколько я понял, номер порта можно узнать из symbolic name моего устройства. Но я не знаю как его получить, имея на руках только device handle. Скорее всего надо на этот хендл натравить DeviceIoControl с какими-то IOCTL_XXX, но какими никак не могу разобраться.
J>Построение дерева USB (перечисление всех устройств как в утилите usbview) думаю не подойдет, по причине того, что одновременно к компьютеру будет подключен десяток наших USB девайсов, т.е. сравнение по VID и PID не прокатит. А сравнивать по device handle (одно открыто в драйвере, другое мной в user mode) наверное нет смысла, т.к. скорее всего они будут разные.
Как это usbview не подойдет? собственно она это и делает, разливает девайсы воткнутые в разные порты на разных usb-hub. Все что нужно сделать это разобраться с алгоритмом энумерации девайсов в usbview. Также смотреть в сторону IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX.
Связать device handle через symlink можно с помощью CM_XXX функций.
Здравствуйте, _f_b_i_, Вы писали:
___>Как это usbview не подойдет? собственно она это и делает, разливает девайсы воткнутые в разные порты на разных usb-hub. Все что нужно сделать это разобраться с алгоритмом энумерации девайсов в usbview. Также смотреть в сторону IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX.
Используя в качестве примера usbview, я смогу построить дерево USB устройств и узнать к каким хабам и портам подключены мои USB-девайсы. Я смогу узнать из symlink'и. Потом смогу натравить на них CreateFile и получить device handle, но полученный хендл не будет равен тому, который возвратит API драйвера производителя. Я не знаю как можно их связать.
По-моему надо действовать от обратного, получить из device handle его symlink и найти его в дереве USB устройств. Но я не знаю как.
___>Связать device handle через symlink можно с помощью CM_XXX функций.
Я не смог найти функцию из списка CM_XXX в которую можно засунуть device handle и что-то получить
Буду благодарен, если пнете в нужном направлении.
Я сам недавно столкнулся с похожей проблемой. Кстати сами микрософтовцы не рекомендуют использовать рилейт имена.
Связать с помощью стандартной апи хэндл с айди видимо не получиться.
DeviceIoControl не подойдет, сам не до конца разобрался, но получение айди можно реализовать, насколько понял, только для накопителей (IOCTL_STORAGE...).
Может оказаться весьма полезным, в том плане, что построено на событиях. Его будет удобно использовать, ессли программа создает дополнительные трэды (отпадают вопросы приостановки работы драйвера и т.п.). Вроди бы как оно должно принимать значение истины, когда устройство с указанным айди подключено, или используется и там еще есть параметры.
По поводу привязки к хэндлу, думаю попробовать пойти обратным путем — по айди получить хэндл. Возможно запросить логическое имя порта и тот же CreateFile использовать. Еще пока не уверен точно.
Пишу на ASM-е, поэтому еще не уверен, что такие вещи есть в библиотеке (в крайнем случае придется переписать). Если у Вас что-нибудь получиться — отпишите тут пожалуйста, как говорится одна голова хорошо, а две — лучше. =)
Здравствуйте,
R>Пишу на ASM-е, поэтому еще не уверен, что такие вещи есть в библиотеке (в крайнем случае придется переписать). Если у Вас что-нибудь получиться — отпишите тут пожалуйста, как говорится одна голова хорошо, а две — лучше. =)
У меня в итоге было сделано так:
1) Запрашивал список серийных номеров у API закрытого драйвера устройства.
2) С помощью SetupDiGetClassDevs получал список всех "моих устройств" по их GUID
hDI = SetupDiGetClassDevs(&GUID_PIK, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);
3) В цикле for(DWORD i = 0; SetupDiEnumDeviceInfo(hDI, i, &dd); i++) просматривал каждое устройство.
3.1) Получал серийный номер устройства с помощью SetupDiGetDeviceInstanceId и сравнивал с пунктом 1 (на всякий случай еще и VID/PID).
3.2) Получал номер порт хаба, к которому подключено устройство (из п.3.1) с помощью SetupDiGetDeviceRegistryProperty с константой SPDRP_ADDRESS. Т.е. у USB-хаба все порты пронумерованы и можно узнать в какой порт подключили наш девайс.
3.3) Получал ИД хаба (за его основу взял device id, который возвращает CM_Get_Parent) и группировал свои устройства.
В данном варианте у нас возникла только одна небольшая проблема. Закупили несколько одинаковых хабов в одном магазине, но в каких-то хабах стояла 1 микросхема для подключения 8 устройств, а в каких-то было две 4-х портовых микросхемы (два разных хаба получалось).
p.s. в конечном итоге меня вообще попросили в программе сделать жесткую привязку к серийным номерам и портам поэтому, проблема сейчас закрыта.