Заменить Windows USB Class Driver на пользовательский драйвер?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Спасибо, Rich


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

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

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

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

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

7
задан Richard Baxter 2 February 2012 в 16:42
поделиться