Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.216.190.167] |
|
Сообщ.
#1
,
|
|
|
Разбираюсь с примером Майкрософта (и его переводом от microsin) и не пойму откуда взять guidDeviceInterface.
В примере есть такой код: int _tmain(int argc, _TCHAR* argv[]) { GUID guidDeviceInterface = OSR_DEVICE_INTERFACE; //in the INF file HANDLE hDeviceHandle = INVALID_HANDLE_VALUE; WINUSB_INTERFACE_HANDLE hWinUSBHandle = INVALID_HANDLE_VALUE; ...ещё несколько переменных... bResult = GetDeviceHandle(guidDeviceInterface, &hDeviceHandle); bResult = GetWinUSBHandle(hDeviceHandle, &hWinUSBHandle); ...БАМ-БАМ-БАМ, проворачиваем кучу всего интересного по хэндлу hWinUSBHandle, например... bResult = ReadFromBulkEndpoint(hWinUSBHandle, &PipeID.PipeInId, cbSize); system("PAUSE"); done: CloseHandle(hDeviceHandle); WinUsb_Free(hWinUSBHandle); return 0; } Но константа OSR_DEVICE_INTERFACE встречается в примере всего один раз, с эдакой самоочевидностью "ну вы знаете, этот OSR_DEVICE_INTERFACE - кто его не знает". Вопрос, если я знаю VID/PID моего устройства и нужный мне эндпойнт, как мне выяснить OSR_DEVICE_INTERFACE? Возможно ли его выяснить через последовательность, вроде такой: deviceInfoSet = SetupDiCreateDeviceInfoList(&GUID_DEVCLASS_USB, NULL); allDevices = SetupDiGetClassDevsExA(NULL, NULL, NULL, DIGCF_PRESENT|DIGCF_ALLCLASSES, deviceInfoSet, NULL, NULL); for(devIndex = 0; SetupDiGetDeviceInfo(allDevices, devIndex, &deviceInfo);devIndex++) { SetupDiGetDeviceInstanceIdA(deviceInfoSet, &deviceInfo, devId, 1024, &devIdLen); if(...условие, что в этой итерации просматривается именно нужное мне устройство...) { ...получение OSR_DEVICE_INTERFACE ... } } |
Сообщ.
#2
,
|
|
|
Цитата flammmable @ Вопрос, если я знаю VID/PID моего устройства и нужный мне эндпойнт, как мне выяснить OSR_DEVICE_INTERFACE? Ответ не мой, нейросетка ответила: Для получения OSR_DEVICE_INTERFACE для USB-устройства необходимо сперва получить путь к устройству при помощи функции SetupDiGetDeviceInterfaceDetail() или QueryDosDevice(). Затем используя данный путь, нужно открыть хэндл устройства при помощи функции CreateFile(), после чего получить OSR_DEVICE_INTERFACE при помощи функции DeviceIoControl(). Вот пример шагов, которые необходимо выполнить для получения OSR_DEVICE_INTERFACE на языке C++: GUID guidDevInterface = {...}; // GUID для WinUSB-интерфейса // Шаг 1: Получить путь к устройству. // ... // Шаг 2: Открыть хэндл устройства. HANDLE hDevice = CreateFile(deviceInterfacePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hDevice == INVALID_HANDLE_VALUE) { // Обработка ошибки } // Шаг 3: Получить OSR_DEVICE_INTERFACE. WINUSB_INTERFACE_HANDLE hWinUSB; BOOL result = WinUsb_Initialize(hDevice, &hWinUSB); if (!result) { // Обработка ошибки } OSR_DEVICE_INTERFACE OsrDevInterface; result = DeviceIoControl(hDevice, IOCTL_OSR_GET_DEVICE_INTERFACE, &guidDevInterface, sizeof(guidDevInterface), &OsrDevInterface, sizeof(OsrDevInterface), NULL, NULL); if (!result) { // Обработка ошибки } // Использование OsrDevInterface // ... // Шаг 4: Освобождение ресурсов. WinUsb_Free(hWinUSB); CloseHandle(hDevice); Обратите внимание, что код IOCTL_OSR_GET_DEVICE_INTERFACE определяется в драйвере примера OSRUSBFX2, доступном на GitHub. Вам может потребоваться внести изменения в этот код для его адаптации к вашему устройству. |