Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
f2065
11 / 1 / 1
Регистрация: 30.05.2018
Сообщений: 8
1

Не получается найти WinUSB-устройство: SetupDiEnumDeviceInterfaces его не видит

30.05.2018, 00:57. Просмотров 718. Ответов 0
Метки нет (Все метки)

Итак, есть WinUSB устройство (китайский телефон, на самом деле это COM-порты, и в линуксе можно одной строчкой форсировать ему serial-драйвер (пробовал - работает), но в винде не получается это сделать - в винде приходится искать решение на базе WinUSB API).

Устройство составное - USB Composite Device, и у него два дочерних WinUSB-устройства (к которым мне и надо как-то добраться).
В свойствах в диспетчере устройств у них GUID класса {88bae032-5a81-49f0-bc3d-a4ff138216d6} - судя по гуглу это GUID_DEVCLASS_WINUSB

И вот проблема в том что я не могу пронумеровать этот класс (чтобы найти DevicePath для CreateFile).
Хотя с другими классами у меня проблем нет - всё получалось. А с этим - облом непонятный.

C++
1
2
3
4
5
6
7
8
9
    HANDLE DeviceHandle;
    GUID usbdev_guid = { 0xA5DCBF10L, 0x6530, 0x11D2, 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED }; // GUID_USB_DEVICE
    GUID winusb_guid = { 0x88bae032L, 0x5a81, 0x49f0, 0xbc, 0x3d, 0xa4, 0xff, 0x13, 0x82, 0x16, 0xd6 }; // GUID_DEVCLASS_WINUSB
    HDEVINFO deviceInfo;
    SP_DEVICE_INTERFACE_DATA interfaceData;
    PSP_DEVICE_INTERFACE_DETAIL_DATA detailData = NULL;
    DWORD GLE_result;
    SP_DEVINFO_DATA devinfo;
    BYTE devdetailbuffer[4096];
Вот пробую пронумеровать GUID_DEVCLASS_WINUSB - ошибка 0x103 ERROR_NO_MORE_ITEMS
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        deviceInfo = SetupDiGetClassDevs(&winusb_guid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
        if (deviceInfo == INVALID_HANDLE_VALUE) { return false; }
        for (UINT n = 0;; n++)
        {
            interfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
            if (!SetupDiEnumDeviceInterfaces(deviceInfo, NULL, &winusb_guid, n, &interfaceData))
            {
                GLE_result = GetLastError(); // <-- тут оно и встаёт сразу, с ошибкой 0x103 - ERROR_NO_MORE_ITEMS
                break;
            }
            detailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)devdetailbuffer;
            detailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
            devinfo.cbSize = sizeof(devinfo);
            SetupDiGetDeviceInterfaceDetail(deviceInfo, &interfaceData, detailData, sizeof(devdetailbuffer), NULL, &devinfo);
        }
Меняю GUID на GUID_USB_DEVICE - и успешно нахожу корневое композитное устройство (но дочерних WinUSB-устройств - нету):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        deviceInfo = SetupDiGetClassDevs(&usbdev_guid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
        if (deviceInfo == INVALID_HANDLE_VALUE) { return false; }
        for (UINT n = 0;; n++)
        {
            interfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
            if (!SetupDiEnumDeviceInterfaces(deviceInfo, NULL, &usbdev_guid, n, &interfaceData))
            {
                GLE_result = GetLastError();
                break;
            }
            detailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)devdetailbuffer;
            detailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
            devinfo.cbSize = sizeof(devinfo);
            SetupDiGetDeviceInterfaceDetail(deviceInfo, &interfaceData, detailData, sizeof(devdetailbuffer), NULL, &devinfo);
    // ошибки нет, однако находится только корневое устройство:
    // detailData->DevicePath \\\\?\\usb#vid_0421&pid_069a#5&13a74b18&0&2#{a5dcbf10-6530-11d2-901f-00c04fb951ed}
    // весь цикл перебираю - дочерних устройств там нету…
        }
И как мне добраться до его дочерних устройств? Как пронумеровать их или как в итоге получить хэндл для WinUSB API?


Смотрел в реестре HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB - композитное устройство там есть и у него SymbolicName = \??\USB#VID_0421&PID_069A#5&13a74b18&0&2#{a5dcbf10-6530-11d2-901f-00c04fb951ed}
Его дочерние устройства тоже есть, однако у них нет SymbolicName и ничего похожего. Можно по веткам реестра понять что имена у них должны быть такие:
\\\\?\\USB#VID_0421&PID_069A&MI_00#6&7a466bf&0&0000
\\\\?\\USB#VID_0421&PID_069A&MI_01#6&7a466bf&0&0001
Однако они не открываются (ERROR_FILE_NOT_FOUND)… Приделать к ним ещё GUID (GUID_USB_DEVICE или GUID_DEVCLASS_WINUSB) ?
"\\\\?\\usb#vid_0421&pid_069a&mi_01#6&7a466bf&0&0001#{88bae032-5a81-49f0-bc3d-a4ff138216d6}"
"\\\\?\\usb#vid_0421&pid_069a&mi_01#6&7a466bf&0&0001#{a5dcbf10-6530-11d2-901f-00c04fb951ed}"
- но с GUID тоже не открывается - ERROR_FILE_NOT_FOUND


Попытка хоть как-то открыть композитный девайс (для которого есть DevicePath) в WinUSB - обламывается очень неожиданной ошибкой ERROR_NOT_ENOUGH_MEMORY
C++
1
2
3
4
5
6
7
8
9
10
11
        DeviceHandle = CreateFile("\\\\?\\usb#vid_0421&pid_069a#5&13a74b18&0&2#{a5dcbf10-6530-11d2-901f-00c04fb951ed}", GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);
        if (INVALID_HANDLE_VALUE == DeviceHandle) {
            GLE_result = GetLastError();
                    return false;
        }
        if (!WinUsb_Initialize(DeviceHandle, &WinusbHandle))
        {
            GLE_result = GetLastError(); // <-- ошибка 0x8 - ERROR_NOT_ENOUGH_MEMORY
            CloseHandle(DeviceHandle);
            return false;
        }
Я абсолютно не представляю где тут памяти не хватает. Вот реально такой простой код с подставленным уникальным именем девайса в CreateFile - девайс открывается нормально. Но WinUsb_Initialize очевидно его не признаёт - потому что это как-бы хаб, а не WinUSB-девайс.


Причём несколько дней копаю гугл - все эти проблемы с WinUSB встречаются у людей - и пронумеровать WinUSB-девайсы не получается, и ошибки ERROR_NOT_ENOUGH_MEMORY в WinUsb_Initialize. Но никаких решений нет. Есть заведомо рабочие примеры (с другими GUID/PID/VID - для конкретных девайсов), но при попытке очевидным образом адаптировать их под свои GUID/PID/VID - такие же проблемы…

Краткий итог:
Стандартным образом (SetupDiGetClassDevs - SetupDiEnumDeviceInterfaces - SetupDiGetDeviceInterfaceDetail - DevicePath) найти WinUSB-девайсы не могу: их похоже там нет, только их корневой хаб виден.
Найти и открыть хаб могу, однако WinUsb_Initialize с ним работать не хочет.
Что делать?
Такое впечатление что тут какой-то совсем другой алгоритм работы нужен, либо это неполноценные WinUSB которые умышленно таким образом не хотят работать.
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.05.2018, 00:57
Ответы с готовыми решениями:

HDD самсунг в BIOSе определяется, система его видит просто как устройство/диск
Добрый день! Прошу помощи. Проблема такая: HDD самсунг в BIOSе определяется, система его видит...

ADB не видит устройство
Здравствуйте. Вот решил протестировать приложение на реальном устройстве. Но как в большинстве...

Не видит звуковое устройство.
У меня проблемка. Подключил к компьютеру колонки от монитора а звука нету, ставил на полную...

Драйвер не видит устройство
Доброго времени суток, господа программисты!) Суть проблемы: Есть ноутбук, asus x551c, на него...

Ноутбук не видит зарядно устройство
Когда ноутбук выключен показует что он заряжается, но как тока его включаеш он незаряжается.Что...

0
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.05.2018, 00:57

Android SDK не видит устройство
Пытаюсь запустить проект на своем китайском планшете (Go clever insigma 800m), возможно ли что это...

Android Studio не видит устройство
Всем привет. Есть проблема: не получается подключить свой телефон для отладки. в Android Studio в...

гипертерминал не видит устройство cisco 2800
Привет всем. Пытаюсь подключиться к сиська2800, но гипертерминал не видит устройство. Настройки...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru