Поделиться через


Выбор модели драйвера для разработки драйвера 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 предоставляет интерфейсы драйверов устройств (DDIs), которые драйвер клиента может использовать для интеграции с компонентами Windows, такими как диспетчер самонастраивающийся и Power Manager. UMDF также предоставляет специализированные целевые объекты для USB-устройств, которые абстрагируют оборудование в пользовательском режиме и упрощают операции ввода-вывода для драйвера. Помимо интерфейсов UMDF WDF предоставляет расширенные расширения отладчика и средства трассировки для драйверов пользовательского режима. UMDF основан на объектной модели компонента (COM) и разработке драйвера пользовательского режима проще для разработчика C++.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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