Заменить Windows Class Class Driver на собственный драйвер? - PullRequest
7 голосов
/ 30 января 2012

Интересно, может кто-нибудь вообще помочь, небольшая проблема специалиста в этом.

У меня есть приложение, которое должно считывать и анализировать несколько USB-устройств (не одновременно, каждое из них выполняется в отдельных тестах и ​​теоретически может работать на разных машинах).

Каждое из USB-устройств основано на классе USB HID и производится разными компаниями. Ни одно из этих USB-устройств не предназначено для работы на ПК, но предназначено для другой платформы, однако для целей тестирования. устройства, запрошенные клиентом для запуска тестового приложения с ПК.

Некоторые устройства будут запускаться, распознаваться окнами, которые будут инициализировать и запускать их правильно с помощью встроенного в Windows универсального драйвера класса HID, после чего устройства начнут отправлять правильные пакеты данных проверяемых данных.

Некоторые устройства будут запускаться, распознаваться окнами, которые будут пытаться запустить их, но не смогут полностью инициализировать их, оставляя их в наполовину инициализированном состоянии. Это нормально, так как я могу использовать свой анализатор протокола beagle для захвата пакетов инициализации с подлинной платформы, а затем использовать библиотеку LibUSBDotNet для репликации оставшихся пакетов в последовательности инициализации и заставить их правильно начать отправку пакетов.

Проблема, с которой я столкнулся, связана с одним конкретным устройством (хотя есть еще несколько, которые я еще не тестировал, поэтому вполне возможно, что одно из них также может иметь такую ​​же проблему). Проблема заключается в том, что драйвер класса Windows HID распознает устройство и пытается инициализировать и запустить его, это работает по моде, и устройство начинает отправку данных.

Проблема в том, что отправляемые данные отличаются от отправляемых на подлинную платформу (содержащую только подмножество полных данных). Как будто Windows инициализировала устройство в другом режиме.

Когда я собираю пакеты инициализации как с ПК, так и с подлинной платформы с помощью моего анализатора протокола USB, я вижу, что Windows отправляет несколько отличающиеся пакеты инициализации. Использование LibUSBDotNet для повторной отправки правильных пакетов после того, как Windows уже запустила устройство, похоже, ничего не дает.

Моя проблема в том, что мне нужно, чтобы окна не пытались инициализировать устройство с помощью стандартного драйвера класса HID, я попытался удалить драйвер в диспетчере устройств, но он все равно инициализирует его (и драйвер волшебным образом переназначается в диспетчере устройств ). Я провел некоторое расследование, и есть возможные альтернативы:

  1. Создайте определенный драйвер, который Windows будет назначать конкретному VID / PID устройства, но который ничего не делает, тогда я могу использовать LibUSBDotNet для отправки правильной последовательности инициализации на устройство из моего собственного кода.

  2. Используйте что-то вроде WinUSB для создания подходящего драйвера для устройства (или, возможно, для создания «мертвого» драйвера, например 1.

Будет ли Windows использовать драйвер с определенным идентификатором VID / PID по сравнению со встроенным драйвером класса USB HID? Если нет, то я бы тратил время на то, чтобы идти по этому маршруту?

Обратите внимание, мой Mac правильно инициализирует проблемное устройство, и я задал вопрос клиенту, можно ли разработать приложение для Mac, и его ответ разочаровал только Windows.

У меня нет опыта в написании правильных драйверов для Windows, хотя у меня есть опыт общения с USB на относительно низком уровне (так что эта часть не слишком беспокоится). Может ли кто-нибудь предложить хороший курс действий (прежде чем я потрачу недели на изучение того, как писать драйверы для ПК, только чтобы найти, что выбранный мной курс действий не может обеспечить то, что мне нужно).

Любая помощь или предложение высоко ценится.

Спасибо, Рич


Добавлено после попытки предложения ниже:

Я попытался с помощью мастера libUsbDotNet inf создать необходимые файлы и установить их, и это, похоже, сработало - определенно устройство теперь отображалось в диспетчере устройств как устройство libusb-win32 - не устройство HID, а связанный драйвер был драйвером libusb , Даже после этого устройство по-прежнему инициализируется и начинает отправлять пакеты данных неправильного типа, хотя теперь эти пакеты больше не обрабатываются драйвером класса и просто теряются.

Я также натолкнулся на Zadig, у которого есть аналогичный мастер создания inf для WinUSB, и это имело точно такой же результат.

Коллега предположил, что это может быть не сама Windows, которая переключает устройство в этот режим, а устройство, которое идентифицирует, что оно подключено к машине с Windows, и переключается в этот режим. Я подозреваю, что это тот случай, и в этом случае я застреваю - время поговорить с клиентом еще раз.

Большое спасибо за помощь.

1 Ответ

5 голосов
/ 30 января 2012

Вы используете libusb-win32 в качестве драйвера фильтра;то есть драйвер устройства HidUsb назначается и загружается для вашего устройства, но затем драйвер libusb-win32 загружается сверху и обеспечивает беспрепятственный доступ к оборудованию.

Если вы не хотите HidUsb (или любой другой драйвер класса), чтобы выполнить любое взаимодействие «от вашего имени», просто свяжите libusb-win32 как драйвер устройства с вашим оборудованием.Для этого вам нужно создать файл .INF, связывающий его с VID / PID / Revision каждого USB-устройства.Если я правильно помню, libusb-win32 даже поставляется с утилитой для создания таких файлов .INF.

Если вы установите этот файл .INF, например, с PnpUtil.exe (доступно в Vista или выше), вы все равно можете запуститьв проблемах, когда, хотя вы лучше подходите, чем универсальный драйвер HID, драйвер HID по-прежнему выбран.

Общий драйвер HID сопоставляет устройства по их совместимым идентификаторам (то есть по классу интерфейса USB), пока выбудет соответствовать идентификаторам оборудования (которые имеют более высокий приоритет).Тем не менее, Windows может отдавать приоритет другим аспектам, таким как ваш драйвер не подписан.Читайте: Как Windows выбирает драйверы

К счастью, даже в этом сценарии подписывание драйверов с помощью самостоятельно созданного сертификата (используйте CertUtil.exe, MakeCat.exe и SignTool.exe) не слишкомтрудно.

...