Заменить драйвер класса USB для Windows на собственный драйвер?

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

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

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

Некоторые из устройств запустятся, будут распознаваться окнами, которые будут инициализировать и запускать их корректно, используя универсальный драйвер класса 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 ответ

Решение

Вы используете 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) не так уж сложно.

Другие вопросы по тегам