Выбор модели драйвера для разработки драйвера USB-клиента
В этой статье приведены рекомендации по выбору оптимальной модели драйверов для разработки драйвера USB-клиента, который выступает в качестве драйвера функции устройства.
Производители USB-устройств часто должны предоставлять приложениям доступ к функциям устройства. Чтобы выбрать лучший механизм доступа к USB-устройству, начните с самого простого подхода и перейдите к более сложным решениям, только если это необходимо. В следующем списке перечислены варианты, описанные в этой статье:
- Если устройство принадлежит классу USB-устройства, для которого Windows включает драйвер папки "Входящие", вам не нужно писать драйвер.
- Если на устройстве нет драйвера класса, предоставленного корпорацией Майкрософт, и только одно приложение обращается к устройству, загрузите WinUSB в качестве драйвера функции.
- Если устройство обращается к параллельным приложениям, а устройство не имеет изохронных конечных точек, напишите драйвер клиента на основе UMDF.
- Если драйвер класса, WinUSB или решения UMDF не являются вариантами, которые работают для вас, напишите драйвер клиента на основе KMDF.
- Если определенная функция не поддерживается KMDF, напишите гибридный драйвер, вызывающий подпрограммы WDM.
Наиболее распространенным подходом является реализация драйвера устройства (называемого драйвером USB-клиента в этом наборе документации) и предоставление пакета установки, который устанавливает драйвер в качестве драйвера функции в стеке устройств над стеком USB-драйверов, предоставленным Корпорацией Майкрософт. Драйвер клиента предоставляет интерфейс устройства, который приложения могут использовать для получения дескриптора файла устройства. Затем приложения могут использовать этот дескриптор файла для взаимодействия с драйвером, вызвав API Windows.
Написание драйвера, настроенного в соответствии с требованиями устройства, является наиболее гибким способом предоставления доступа к USB-устройству. Однако реализация драйвера требует много работы. Драйвер должен выполнять сложные задачи, такие как:
- Инициализация драйвера при обнаружении новых устройств
- Управление питанием
- Операции ввода-вывода
- Неожиданное удаление устройства
- Управление данными о состоянии
- Очистка при удалении устройства
Прежде чем написать драйвер, задайте следующие вопросы:
- Можно ли использовать драйвер, предоставленный корпорацией Майкрософт?
- Если вы напишете 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 включает шаблоны драйверов в режиме пользователя 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 11 | Да | Да | Да |
Windows 10 | Да | Да | Да |
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 (SP2) поддерживают WinUSB. WinUSB не является собственным для Windows XP, он должен быть установлен с монетами WinUSB. Все номера SKU Windows Vista и более поздние версии Windows поддерживают WinUSB.