Здравствуйте, 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 функций.