Цитата(DeNi @ Feb 12 2017, 13:32)

Как раз драйвер CDC очень даже причем. ST драйвера никогда не писала, их драйвер для CDC это только цифровая подпись для stmcdc.inf,
чтоб с их VID PID установить usbser.sys который уже имеется в Windows.
Всем спасибо за помощь! Отдельное спасибо уважаемому
DeNi за подробное объяснение проблем с usbser.sys и советы по использованию WinAPI.
Не написал в первом посте - ОС действительно старая WinXP/Win7. При включении-выключении, перзагрузке, выдергивании и т.д. устройств использующих виндовый драйвер usbser.sys все-таки приходят сообщения с событиями DBT_DEVICEARRIVAL и DBT_DEVICEREMOVECOMPLETE и типом DBT_DEVTYP_DEVICEINTERFACE. Из них уже можно получить путь к устройству и реализовать автоматическое закрывание порта, а в будущем и автоматическое переподключение.
А вот возник такой, непонятный для меня вопрос при перечислении портов имеющихся в системе:
Примерная рыба кода:
Код
hDevInfo = SetupDiGetClassDevs(&ClassGuid, NULL, NULL, /*DIGCF_DEVICEINTERFACE |*/ DIGCF_PRESENT); // Получаю хендл на список устройств имеющихся в системе
for(int n = 0; SetupDiEnumDeviceInfo(hDevInfo, n, &DevInfoData); n++) // Перечисляю устройства
{
.......
for(int m = 0; SetupDiEnumDeviceInterfaces(hDevInfo, &DevInfoData, &ClassGuid, m, &DeviceInterfaceData); m++) // Перечисляю интерфейсы для устройства
{
........
}
}
И вот если в функции SetupDiGetClassDevs указан только флаг DIGCF_PRESENT то определяются все порты имеющиеся в системе (в том числе и использующие usbser.sys), но функция SetupDiEnumDeviceInterfaces возвращает ошибку ERROR_NO_MORE_ITEMS для любого порта. Если я добавляю флаг DIGCF_DEVICEINTERFACE, то интерфейсы находятся, но из списка устройств исчезают порты как раз использующие usbser.sys. Вот логи небольшой программки, набросанной для лучшего понимания работы с винайпишными функциями Практической пользы в получении интерфейсов при перечислении портов я пока не вижу, это скорее тренировка инженера-железячника.
Флага DIGCF_DEVICEINTERFACE нет:
Описание класса: Порты (COM и LPT)
====================================================
Порт Найден: Последовательный порт (COM1)
Поиск Интерфейсов закончен!
====================================================
Порт Найден: PCI Serial Port (COM22)
Поиск Интерфейсов закончен!
====================================================
Порт Найден: PCI Serial Port (COM21)
Поиск Интерфейсов закончен!
====================================================
Порт Найден: PCI Parallel Port (LPT1)
Поиск Интерфейсов закончен!
====================================================
Порт Найден: AT91 USB to Serial Converter (COM15)
Поиск Интерфейсов закончен!
====================================================
Порт Найден: STMicroelectronics Virtual COM Port (COM4)
Поиск Интерфейсов закончен!
Поиск Устройств закончен!
Флаг DIGCF_DEVICEINTERFACE добавлен:
Описание класса: Порты (COM и LPT)
====================================================
Порт Найден: Последовательный порт (COM1)
Интерфейс Найден: Порядковый номер: 0
\\?\acpi#pnp0501#1#{4d36e978-e325-11ce-bfc1-08002be10318}
Имя порта из Реестра (SetupDiOpenDevRegKey/RegQueryValueEx): COM1
Поиск Интерфейсов закончен!
====================================================
Порт Найден: PCI Serial Port (COM22)
Интерфейс Найден: Порядковый номер: 0
\\?\mf#pci#ven_9710&dev_9835&subsys_00121000&rev_01#6&8e99d9a&0&0000e6#child0000#{4d36e978-e325-11ce-bfc1-08002be10318}
Имя порта из Реестра (SetupDiOpenDevRegKey/RegQueryValueEx): COM22
Поиск Интерфейсов закончен!
====================================================
Порт Найден: PCI Serial Port (COM21)
Интерфейс Найден: Порядковый номер: 0
\\?\mf#pci#ven_9710&dev_9835&subsys_00121000&rev_01#6&8e99d9a&0&0000e6#child0001#{4d36e978-e325-11ce-bfc1-08002be10318}
Имя порта из Реестра (SetupDiOpenDevRegKey/RegQueryValueEx): COM21
Поиск Интерфейсов закончен!
Поиск Устройств закончен!