Замените драйвер USB Windows с помощью специального драйвера?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Спасибо, Рич


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

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

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

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

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

+6
30 янв. '12 в 9:42
источник поделиться
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) не слишком сложно.

+4
30 янв. '12 в 12:22
источник

Посмотрите другие вопросы по меткам или Задайте вопрос