Выбор модели драйвера для разработки драйвера USB-клиента

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

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

  1. Если устройство относится к классу USB-устройств, для которого Windows включает драйвер папки "Входящие", писать драйвер не нужно.
  2. Если на вашем устройстве нет драйвера класса, предоставленного Корпорацией Майкрософт, и к устройству обращается одно приложение, загрузите WinUSB в качестве драйвера функции.
  3. Если к устройству требуется доступ из параллельных приложений, а на устройстве нет изохронных конечных точек, напишите драйвер клиента на основе UMDF.
  4. Если драйвер класса, решения WinUSB или UMDF не являются вариантами, которые вам не подходит, напишите драйвер клиента на основе KMDF.
  5. Если определенная функция не поддерживается KMDF, напишите гибридный драйвер, который вызывает подпрограммы WDM.

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

Написание драйвера, настроенного в соответствии с требованиями устройства, является наиболее гибким способом предоставления доступа к USB-устройству. Однако реализация драйвера требует много работы. Драйвер должен выполнять сложные задачи, такие как инициализация драйвера при обнаружении новых устройств, управление питанием, операции ввода-вывода, неожиданное удаление, управление состоянием и очистка при удалении устройства. Прежде чем написать драйвер, задайте следующие вопросы:

Можно ли использовать драйвер, предоставленный корпорацией Майкрософт?

Возможно, вам не потребуется писать драйвер, если:

  • Ваше устройство относится к классу USB-устройств, поддерживаемому корпорацией Майкрософт.

    В этом случае соответствующий драйвер класса загружается в качестве драйвера устройства. Список классов устройств, для которых Windows включает драйвер для папки "Входящие", см. в статье Драйверы классов usb-устройств, включенные в Windows.

  • Устройство не принадлежит к классу устройства.

    Для таких устройств оцените функции устройства, чтобы определить, можно ли загрузить предоставленный Корпорацией Майкрософт WinUSB (Winusb.sys) в качестве драйвера функции устройства. Использование WinUSB является лучшим решением, если:

    • Доступ к устройству осуществляется одним приложением.

    • Устройство поддерживает массовые, прерывания или изохронные конечные точки.

    • Устройство предназначено для работы с целевым компьютером под управлением Windows XP с пакетом обновления 2 (SP2) и более поздними версиями Windows.

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

      Чтобы приложения легко отправляли запросы в Winusb.sys, мы предоставляем библиотеку DLL в пользовательском режиме Winusb.dll, которая предоставляет функции WinUSB. Приложение может вызывать эти функции для доступа к устройству, его настройки и передачи данных в конечные точки устройства.

      WinUSB не является вариантом, если:

    • Доступ к устройству осуществляется несколькими приложениями.

    • Ваше устройство имеет функции, которые уже поддерживают режим ядра в операционной системе Windows. Например, для функций модема (поддерживаемых TAPI) или функций локальной сети (которые поддерживает NDIS) необходимо использовать интерфейс, поддерживаемый драйвером Usbser.sys для управления модемными устройствами с помощью программного обеспечения в пользовательском режиме.

      В Windows 8 мы добавили новый совместимый идентификатор в inf для установки WinUSB. Если встроенное ПО устройства содержит совместимый идентификатор, WinUSB по умолчанию загружается в качестве драйвера функции для устройства. Это означает, что производители оборудования не обязаны распространять INF-файлы для своих устройств WinUSB. Дополнительные сведения см. в разделе Устройство WinUSB.

Какая модель драйвера лучше всего подходит при написании драйвера USB-клиента?

Ответ зависит от дизайна устройства. Сначала определите, соответствует ли определенная модель драйвера вашим требованиям. Некоторые рекомендации по проектированию зависят от того, хотите ли вы получить доступ к USB-устройству из нескольких параллельных приложений и поддерживать потоковую передачу данных через изохронные конечные точки.

Если вы решили написать драйвер, ниже приведены варианты.

  • среда выполнения платформы драйвера режима пользователя (UMDF)

    UMDF предоставляет интерфейсы драйверов устройств (DIS), которые драйвер клиента может использовать для интеграции с компонентами Windows, такими как Plug and Play Manager и Power Manager. UMDF также предоставляет специализированные целевые объекты для USB-устройств, которые абстрагируют оборудование в пользовательском режиме и упрощают операции ввода-вывода для драйвера. Помимо интерфейсов UMDF, WDF предоставляет расширенные расширения отладчика и средства трассировки для драйверов пользовательского режима. UMDF основан на компонентной объектной модели (COM), а разработка драйвера пользовательского режима упрощается для разработчиков C++.

    Реализуйте драйвер клиента на основе UMDF для USB-устройства в следующих случаях:

    • Доступ к устройству осуществляется одновременно несколькими приложениями.

    • Устройство поддерживает массовую передачу или передачу прерываний.

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

      Еще одним преимуществом драйверов пользовательского режима является то, что они используют все API Win32. Например, драйверы могут вызывать ТАКИЕ API, как Winsock, Сжатие, API шифрования и т. д. Эти API недоступны для драйверов режима ядра.

      Драйвер клиента на основе UMDF не подходит для USB-устройств, поддерживающих изохронные конечные точки.

      Примечание Windows 8.1 представлена версия UMDF 2.0. В UMDF версии 2.0 можно написать драйвер UMDF на языке программирования C, который вызывает многие методы, доступные для драйверов KMDF. Вы не можете использовать UMDF версии 2.0 для записи драйверов более низких фильтров для USB.

  • Платформа драйверов в режиме ядра (KMDF)

    KMDF был разработан, чтобы упростить расширение моделей драйверов для поддержки новых типов оборудования. KMDF предоставляет DDIs и структуры данных, которые упрощают реализацию драйверов USB в режиме ядра, чем более ранние драйверы модели драйверов Windows (WDM). Кроме того, KMDF предоставляет специализированные целевые объекты ввода-вывода, которые можно использовать для написания полностью функционального драйвера клиента, использующего стек usb-драйверов Майкрософт.

    В некоторых случаях, когда определенная функция не предоставляется через KMDF, драйвер должен вызывать подпрограммы WDM. Драйверу не нужно реализовывать всю инфраструктуру WDM, но для доступа к выбранному набору подпрограмм WDM используются методы KMDF. Например, для выполнения изохронной передачи драйвер клиента на основе KMDF может отправлять ВДМ-коды URB, описывающие запрос, в стек usb-драйверов. В этом наборе документации такие драйверы называются гибридными драйверами .

    KMDF также поддерживает модель драйвера port-miniport. Например, драйвер мини-порта потоковой передачи ядра (например, ВЕБ-камера USB), использующий потоковую передачу ядра по верхнему краю, может использовать целевые объекты USB-вывода KMDF для отправки запросов в стек USB-драйверов. Драйверы NDIS также могут быть записаны с помощью KMDF для автобусов на основе протокола, таких как USB.

    Чистые драйверы WDM сложны в написании, сложны и не надежны. С развитием KMDF написание этого типа драйвера больше не требуется.

Microsoft Visual Studio 2012 включает шаблоны USB-User-Mode Driver и USB-Kernel-Mode Driver , которые создают начальный код для драйвера USB-клиента UMDF и KMDF соответственно. Код шаблона инициализирует объект целевого устройства USB для обеспечения связи с оборудованием. Дополнительные сведения см. в следующих разделах:

Сведения о том, как реализовать драйверы UMDF и KMDF, см. в книге Microsoft Press Разработка драйверов с помощью Windows Driver Foundation.

Сравнение функций WinUSB, UMDF, KMDF

В следующей таблице перечислены возможности WinUSB, USB-драйверов на основе UMDF и USB-драйверов на основе KMDF.

Компонент WinUSB UMDF KMDF
Поддержка нескольких параллельных приложений Нет Да Да
Изолирует адресное пространство драйвера от адресного пространства приложения Нет Да Нет
Поддерживает массовую передачу, передачу прерываний и управление. Да Да Да
Поддерживает изохронные передачи Да 4 Нет Да
Поддерживает установку драйверов в режиме ядра, таких как драйверы фильтров, в качестве избыточного слоя в USB-стеке. Нет Нет Да
Поддерживает выборочную приостановку и состояние ожидания и пробуждения Да Да Да

В следующей таблице перечислены параметры WDF, поддерживаемые различными версиями Windows.

Версия Windows WinUSB UMDF KMDF
Windows 8 Да Да Да
Windows 7 Да Да Да
Windows Vista Да1 Да1 Да
Windows Server 2003 Нет Нет Да
Windows XP Да2 Да2 Да
Microsoft Windows 2000 Нет Нет Да3

Да1. WinUSB и UMDF поддерживаются только в версиях Windows на базе x86 и x64.

Да2. WINUSB и UMDF поддерживаются в Windows XP с пакетом обновления 2 (SP2) или более поздними версиями Windows.

Да3. KMDF поддерживается в Windows 2000 с пакетом обновления 4 (SP4) или более поздних версиях Windows.

Да4. Изохронные передачи поддерживаются в Windows 8.1 или более поздних версиях Windows.

Все номера SKU клиента 32-разрядных версий Windows XP с пакетом обновления 2 (SP2) и WinUSB. WinUSB не является собственным для Windows XP; Он должен быть установлен с помощью совместного установщика WinUSB. Все номера SKU Windows Vista и более поздние версии Windows поддерживают WinUSB.