libusb Access Denied и отладка драйвера WinUSB: права, Zadig, kernel-драйверы и захват интерфейсов
Как отлаживать libusb access denied, неназначение WinUSB-драйвера, проблемы установки Zadig, удержание kernel-драйвером, права и сбои доступа к USB-интерфейсу.
Инструменты разработки USB часто падают с ошибками вроде LIBUSB_ERROR_ACCESS, «access denied», «cannot claim interface», «WinUSB driver not found», «Zadig driver install failed», «resource already exists». Пользователи ищут «libusb access denied», «WinUSB driver not binding», «Zadig failed», «libusb cannot claim interface», «USB permission denied», когда устройство видно ОС, но диагностический или прошивочный инструмент не может его открыть.
Bus Scope полезен тем, что проблемы доступа лежат между USB-дескрипторами, привязкой драйверов ОС и захватом интерфейсов на уровне приложения. Устройство может быть физически подключено и корректно перечисляться, оставаясь недоступным для libusb.
Устройство есть — но интерфейс недоступен
USB-устройство может корректно перечислиться:
- Чтение device descriptor.
- Выбор конфигурации.
- Интерфейсы видны.
- Конечные точки описаны.
- ОС показывает устройство.
Но libusb всё равно не может открыть и захватить нужный интерфейс, потому что другой драйвер его держит, нет прав, WinUSB не привязан, или приложение целится не в тот интерфейс.
Windows и WinUSB
Под Windows доступ в стиле libusb часто требует совместимый драйвер вроде WinUSB, привязанный к целевому интерфейсу. Инструменты типа Zadig обычно используются для замены или установки драйвера под вендорный интерфейс.
Частые проблемы:
- В Zadig выбран не тот интерфейс.
- У составного устройства несколько интерфейсов.
- HID-драйвер уже держит интерфейс.
- Конфликт с существующим пакетом драйвера.
- Установка драйвера блокируется политикой.
- В режиме загрузчика устройство выдаёт другой VID/PID.
- Microsoft OS-дескрипторы указывают не на тот интерфейс.
Для составных устройств замена драйвера на неправильном интерфейсе может сломать другую функцию, не починив целевой инструмент.
Права в Linux
Под Linux LIBUSB_ERROR_ACCESS часто значит, что у пользователя нет права открыть ноду устройства. Устройство есть, но udev-правила или членство в группе не дают доступа.
Трасса может показать, что USB-трафик идёт, но ошибки прав требуют ещё и доказательств на уровне ОС. Различайте:
- Устройство не перечисляется.
- Устройство перечисляется, но нет прав.
- Kernel-драйвер уже привязан.
- Приложение целится не в тот VID/PID или интерфейс.
Kernel-драйвер уже держит интерфейс
Если kernel-драйвер держит интерфейс, libusb может потребоваться его отцепить, либо приложение должно использовать API kernel-драйвера. HID, CDC, storage и audio-интерфейсы обычно заняты inbox-драйверами.
Безопасный ответ зависит от продуктового замысла. Для клавиатуры или накопителя отцепка kernel-драйвера может сломать нормальное поведение системы. Для вендорного диагностического интерфейса привязка WinUSB/libusb может быть корректной.
Чек-лист отладки
Используйте такой сценарий:
- Захватите перечисление и дескрипторы.
- Определите номер целевого интерфейса.
- Проверьте, является ли устройство составным.
- В Windows подтвердите привязку драйвера к этому интерфейсу.
- В Linux проверьте права и udev-правила.
- Проверьте, не держит ли kernel-драйвер интерфейс.
- Сверьте VID/PID в нормальном режиме и режиме загрузчика.
- Подтвердите, что приложение целится в правильный интерфейс.
- Избегайте замены драйверов для не относящихся к делу интерфейсов.
- Сохраните данные дескрипторов до изменения привязки драйвера.
Итоговый диагноз
libusb access denied и сбои привязки WinUSB — обычно не сырые USB-сигнальные проблемы. Это вопрос владения интерфейсом, прав, привязки драйверов или маппинга дескрипторов.
Bus Scope помогает тем, что показывает, какие интерфейсы существуют и как устройство перечисляется, чтобы ошибки доступа отслеживались до нужного слоя, а не решались вслепую переустановкой драйверов.