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

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

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

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

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

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

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

Проблема в том, что отправляемые данные отличаются от данных, отправляемых на подлинную платформу (содержащую только подмножество полных данных). Как будто 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 на относительно низком уровне (так что эта часть не слишком беспокоит). Может ли кто-нибудь предложить хороший план действий (прежде чем я потенциально потрачу несколько недель на изучение того, как писать драйверы для ПК, только чтобы обнаружить, что выбранный мной курс действий не может обеспечить то, что мне нужно).

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

Спасибо, Рич


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

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

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

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

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


person Richard Baxter    schedule 30.01.2012    source источник
comment
Можете ли вы сделать этот вопрос более кратким? Я сомневаюсь, что многие люди все это прочтут.   -  person Bali C    schedule 30.01.2012


Ответы (1)


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

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

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

Универсальный драйвер HID сопоставляет устройства по их совместимым идентификаторам (то есть по классу интерфейса USB), в то время как вы должны сопоставлять устройства по идентификаторам оборудования (которые имеют более высокий приоритет). Однако Windows может отдавать приоритет другим аспектам, таким как неподписанный драйвер. Прочтите: Как Windows выбирает драйверы < / а>

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

person Ilya    schedule 30.01.2012
comment
Спасибо, там много действительно полезной информации. Да, я использую фильтр, который установил через LibUSBDotNet. Я попробую, как вы предлагаете, и установлю через файл inf. Я исследую все ваши предложения и расскажу, как у меня дела. - person Richard Baxter; 02.02.2012
comment
См. Добавленный комментарий выше, ваше решение работает тем, что предотвращает загрузку драйвера класса и останавливает последующую обработку драйвером класса, к сожалению, минимального минимума, который требуется Windows для идентификации устройства и загрузки альтернативного драйвера, по-прежнему достаточно, чтобы вызвать проблему. Спасибо за помощь, это было очень полезное упражнение в изучении драйверов устройств и т. Д. - person Richard Baxter; 02.02.2012
comment
На простом устройстве Windows только банально получает дескриптор устройства и получает дескриптор конфигурации. Если это составное устройство, будут получены еще несколько дескрипторов. Ни при каких обстоятельствах Windows не выполняет чтение / запись в конечные точки и не выполняет странные запросы управления на этом этапе. Когда вы говорите «альтернативный драйвер», действительно ли альтернативный драйвер загружается для устройства, и если да, то какой именно драйвер? - person Ilya; 08.02.2012