Сажаем устройство на WinUSB без inf и ZaDig Часть 1 - теория
Совершенно случайно узнал, как сделать, чтобы USB устройство говорило Windows, что для него надо автоматически установить драйвер WinUSB (чтобы с ним работать через libUSB или напрямую через IOCTL запросы). Первая ссылка - https://learn.microsoft.com/en-us/win...
Вторая ссылка: https://github.com/pbatard/libwdi/wik...
Структура элемента дескриптора от ChatGPT: typedef struct __attribute__((packed)){ uint8_t bFirstInterfaceNumber; // номер интерфейса uint8_t reserved; char CompatibleID[8]; // "WINUSB" + нули char SubCompatibleID[8]; // обычно все нули uint8_t reserved2[6]; // зарезервировано, нули } USB_EXT_COMPAT_ID_IF; Структура самого дескриптора от ChatGPT: typedef struct __attribute__((packed)){ uint32_t dwLength; // общая длина дескриптора uint16_t bcdVersion; // 0x0100 uint16_t wIndex; // 0x0004 для Extended Compat ID uint8_t bCount; // число интерфейсов uint8_t reserved[7]; // зарезервировано, нули USB_EXT_COMPAT_ID_IF ifs[USB_IFS_CNT]; // массив интерфейсных блоков, задаётся в свойствах проекта } USB_EXT_COMPAT_ID_DESCR; Пример заполнения дескриптора: static const USB_EXT_COMPAT_ID_DESCR WinUSB_Descr = { .dwLength = sizeof(USB_EXT_COMPAT_ID_DESCR), .bcdVersion = 0x0100, .wIndex = 0x0004, .bCount = USB_IFS_CNT, // Один интерфейс .reserved = {0}, .ifs = { { .bFirstInterfaceNumber = 0, .reserved = 0, .CompatibleID = {'W','I','N','U','S','B',0,0}, .SubCompatibleID = {0}, .reserved2 = {0} } } };