Пишу драйвер для мышки, реверс-инженерю их протокол отслеживая пакеты между драйвером Windows и мышкой, программкой HHD USB Monitor.
Небольшая часть протокола уже расшифрована. Пытаюсь имитировать пакеты отправляемые оригинальной программкой.
Первый пакет такой: C4 02 00 00 00 00 08 00
Дополнительная информация:
URB_FUNCTION_CLASS_INTERFACE
Recipient: Interface
Request Type: Class
Direction: Host->Device
Request: 0x9 (Unknown)
Value: 0x300
Index: 0x0
Length: 0x8
Pipe Handle: 0x350be40
В ответ должно приходить: 21 09 00 03 00 00 08 00
URB_FUNCTION_CONTROL_TRANSFER
Отправляю так:
int ret;
ret = usb_control_msg(handle, USB_TYPE_CLASS | USB_RECIP_INTERFACE, USB_REQ_SET_CONFIGURATION, 0x300, 0x0, (char *) buf, 0x8, TIMEOUT);
if (ret != 8) {
perror("Error writing to USB device");
printf("%d\n", ret);
return 1;
}
В ответ получаю Device or resource busy (-16).
USB_TYPE_CLASS | USB_RECIP_INTERFACE - этот момент меня смущает, попробовав разные варианты можно получать Broken pipe (-32) или Inappropriate ioctl for device (0).
Но если взять USB_TYPE_STANDARD | USB_RECIP_DEVICE, то проходит без ошибок, но массив байт не меняется.