Доступ к устройству WinUSB из режима ядра

У меня есть USB-устройство, которое использует драйвер WinUSB (winusb.sys) в качестве функционального драйвера. Теперь мне нужно написать драйвер видеозахвата (должен быть драйвером режима ядра), который обращается к этому устройству.

У меня вопрос: могу ли я получить доступ к устройству WinUSB и работать с ним из режима ядра? Если да, то есть ли для этого какая-либо документация?

Вся документация, которую я нашел, говорит о доступе к WinUSB из пользовательского режима с помощью WinUSB.dll, но это не вариант для меня. Я уже пытался использовать IoGetDeviceObjectPointer (), чтобы получить необходимый дескриптор файла для USB-каналов, с которыми я общаюсь на USB-устройстве, но вызов всегда терпит неудачу с STATUS_ACCESS_DENIED. Я знаю, что мог бы написать свой собственный драйвер KMDF для USB-устройства, но было бы намного проще использовать уже установленный драйвер WinUSB.

Любая помощь будет очень признательна.


person Titanic    schedule 14.09.2012    source источник


Ответы (1)


Это могло бы сработать ... но сделать это очень сложно.

Вы можете отправлять запросы ввода-вывода на устройство winusb в режиме ядра. Вы не можете использовать функции WinUSB для связи, вы должны использовать фактические запросы ввода-вывода для связи от одного стека ввода-вывода к другому.

Я написал драйвер минипорта AVStream для USB-устройства и могу сказать, что часть USB не самая сложная. Особенно при использовании очереди kmdf USB IO в режиме минипорта.

person Christopher    schedule 14.09.2012
comment
У меня уже есть рабочий драйвер минипорта AVStream для моего USB-устройства, но этот драйвер использует мой старый USB-драйвер WDM для связи с устройством. Проблема с моим старым USB-драйвером WDM заключается в том, что ему около 12 лет, он не работает должным образом с пакетами нулевой длины и не поддерживает USB 3.0. По этой причине я попытался заменить его WinUSB в качестве драйвера USB, потому что WinUSB поддерживает USB 3.0, а также обработку пакетов нулевой длины. - person Titanic; 17.09.2012
comment
Основная проблема с AVStream и WinUSB - это способ взаимодействия друг с другом. Со своим старым драйвером WDM я просто вызвал IoGetDeviceObjectPointer с ключом reg устройства, за которым следует PIPE00, чтобы получить дескриптор файла для канала 0, но это не работает с WinUSB (всегда получаю ошибку STATUS_ACCESS_DENIED, если я пытаюсь открыть канал с разрешением WRITE ). Как я могу получить дескриптор файла для различных каналов моего USB-устройства из WinUSB? Это вопрос. - person Titanic; 17.09.2012
comment
Насколько мне известно, WinUSB не экспортирует свои каналы как дескрипторы файлов. Поэтому вам нужно использовать элементы управления вводом-выводом. - person Christopher; 17.09.2012
comment
Спасибо за помощь. Где я могу найти коды запросов управления вводом-выводом для WinUSB? Кажется, они нигде не задокументированы. У тебя есть идеи, где я могу их достать? - person Titanic; 17.09.2012
comment
Извините, насколько мне известно, они официально не задокументированы, но вы можете перепроектировать их, захватив элементы управления вводом-выводом устройства, отправленные из тестового приложения winusb. - person Christopher; 17.09.2012
comment
Знаете ли вы хороший инструмент для сбора этих запросов ввода-вывода устройств? Я нашел busTRACE 9.0, но не уверен, что это именно то, что мне нужно - person Titanic; 19.09.2012