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

поэтому, проблема сейчас закрыта.