Драйверы на стороне USB в Windows

В этой статье представлен обзор архитектуры стека драйверов универсальной последовательной шины (USB).

На следующем рисунке показана схема архитектурного блока стека USB-драйверов для Windows. На схеме показаны отдельные стеки USB-драйверов для USB 2.0 и USB 3.0. Windows загружает стек драйверов USB 3.0 при подключении устройства к контроллеру xHCI.

Схема блоков архитектуры для стеков драйверов USB 2.0 и 3.0.

Windows загружает стек драйверов USB 2.0 для устройств, подключенных к контроллерам eHCI, oHCI или uHCI. Стек драйверов USB 2.0 поставляется в Windows XP с пакетом обновления 1 (SP1) и более поздними версиями операционной системы Windows.

Стек драйверов USB 3.0

Корпорация Майкрософт создала драйверы USB 3.0 с помощью интерфейсов Driver Framework (KMDF). Модель драйвера KMDF снижает сложность и повышает стабильность.

Драйвер контроллера узла USB 3.0 (Usbxhci.sys)

Драйвер xHCI — это драйвер контроллера узла USB 3.0. Обязанности драйвера xHCI включают инициализацию регистров MMIO и структур данных на основе памяти узла для оборудования контроллера xHCI, сопоставления запросов на передачу драйверов верхнего слоя на блоки запросов и отправку запросов на оборудование. После завершения передачи драйвер обрабатывает события завершения передачи из оборудования и распространяет события по стеку драйверов. Он также управляет слотами устройств контроллера xHCI и контекстами конечных точек.

Windows загружает драйвер xHCI в качестве объекта устройства-функции (FDO) в стеке устройств для контроллера узла.

Расширение контроллера USB -узла (Ucx01000.sys)

Драйвер расширения контроллера USB -узла (расширение для KMDF) — это новое расширение для драйвера контроллера узла для конкретного класса, например драйвера xHCI. Новый драйвер расширяем и предназначен для поддержки других типов драйверов контроллера узла, которые, как ожидается, будут разработаны в будущем. Расширение контроллера USB-узла служит общим абстрактным интерфейсом для драйвера концентратора, предоставляет универсальный механизм для очередей запросов к драйверу контроллера узла и переопределяет определенные выбранные функции. Все запросы ввода-вывода, инициированные верхними драйверами, достигают драйвера расширения контроллера узла до драйвера xHCI. После получения запроса ввода-вывода расширение контроллера узла проверяет запрос, а затем перенаправит запрос в соответствующую очередь KMDF, связанную с целевой конечной точкой. Драйвер xHCI, когда он готов к обработке, извлекает запрос из очереди. Обязанности драйвера расширения контроллера USB-узла:

  • Предоставляет объекты, относящиеся к USB, драйверу xHCI.
  • Предоставляет подпрограммы обратного вызова событий KMDF драйверу xHCI.
  • Управляет операциями корневого концентратора, связанного с контроллером узла, и управляет ими.
  • Реализует функции, которые можно настроить драйвером клиента, например сетевые многомерные выражения, потоки и т. д.

Драйвер USB-концентратора (Usbhub3.sys)

Новый драйвер концентратора в стеке USB-драйверов для устройств 3.0 использует модель драйвера KMDF. Основной драйвер центра выполняет следующие задачи:

  • Управляет USB-концентраторами и их портами.
  • Перечисляет устройства и другие концентраторы, подключенные к их подчиненным портам.
  • Создает объекты физического устройства (PDOS) для перечисленных устройств и центров.

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

Стек драйверов USB 2.0

Windows загружает стек драйверов USB 2.0 для устройств, подключенных к контроллерам eHCI, oHCI или uHCI. Драйверы в стеке драйверов USB 2.0 в Windows XP с пакетом обновления 1 (SP1) и более поздних версиях операционной системы Windows. Стек драйверов USB 2.0 предназначен для упрощения высокоскоростных USB-устройств, как определено в спецификации USB 2.0.

В нижней части стека USB-драйверов находится драйвер контроллера узла. Он состоит из драйвера портов, Usbport.sys и одного или нескольких трех драйверов минипорта, которые выполняются одновременно. Когда система обнаруживает оборудование контроллера узла, он загружает один из этих мини-драйверов. Минипорт-драйвер после загрузки загружает драйвер порта, Usbport.sys. Драйвер порта обрабатывает эти аспекты обязанностей драйвера контроллера узла, которые не зависят от конкретного протокола.

Драйвер минипорта Usbuhci.sys (универсальный интерфейс контроллера узла) заменяет драйвер миникласса Uhcd.sys, который поставляется с Windows 2000. Минипорт-драйвер Usbohci.sys (открытый интерфейс контроллера узла) заменяет Openhci.sys. Драйвер минипорта Usbehci.sys поддерживает высокоскоростные USB-устройства и появился в Windows XP с пакетом обновления 1 (SP1) и более поздних версий, а также операционных систем Windows Server 2003 и более поздних версий.

Во всех версиях Windows, поддерживающих USB 2.0, операционная система может одновременно управлять контроллерами узла USB 1.1 и USB 2.0. Всякий раз, когда операционная система обнаруживает наличие обоих типов контроллера, он создает два отдельных узла устройства, по одному для каждого контроллера узла. Windows впоследствии загружает мини-драйвер Usbehci.sys для оборудования контроллера узла, совместимого с USB 2.0, и либо Usbohci.sys или Openhci.sys для оборудования, совместимого с USB 1.1, в зависимости от конфигурации системы.

Над драйвером порта является драйвер USB-шины, Usbhub.sys, также известный как драйвер концентратора. Это драйвер устройства для каждого концентратора в системе.

Универсальный родительский драйвер общего класса USB (Usbccgp.sys)

Универсальный родительский драйвер общего класса USB — это родительский драйвер, предоставляемый корпорацией Майкрософт для составных устройств. Драйвер концентратора перечисляет и загружает родительский составной драйвер, если deviceClass равен 0 или 0xef и numInterfaces больше 1 в дескрипторе устройства. Драйвер концентратора создает совместимый идентификатор родительского составного драйвера как USB\COMPOSITE. Usbccgp.sys использует подпрограммы модели драйверов Windows (WDM).

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

Usbccgp.sys входит в состав Windows XP с пакетом обновления 1 (SP1) и более поздними версиями операционной системы Windows. В Windows 8 драйвер был обновлен для реализации функций приостановки и удаленного пробуждения, как определено в спецификации USB 3.0.

Дополнительные сведения см. в разделе USB Generic Parent Driver (Usbccgp.sys).

WinUSB (Winusb.sys)

USB-интерфейс Windows (WinUSB) — это универсальный драйвер, предоставляемый корпорацией Майкрософт для USB-устройств. Архитектура WinUSB состоит из драйвера в режиме ядра (Winusb.sys) и библиотеки динамических ссылок в режиме пользователя (Winusb.dll). Для устройств, которые не требуют пользовательского драйвера функций, Winusb.sys можно установить в стеке режима ядра устройства в качестве драйвера функции. Затем процессы пользовательского режима могут взаимодействовать с Winusb.sys с помощью набора запросов управления ввода-вывода устройства или вызова функций WinUsb_Xxx . Дополнительные сведения см. в разделе "Введение в WinUSB для разработчиков".

В Windows 8 предоставленный корпорацией Майкрософт файл сведений (INF) для WinUSB, Winusb.inf содержит USB\MS_COMP_WINUSB в виде строки идентификатора устройства. Это позволяет Winusb.sys автоматически загружаться в качестве драйвера функции для тех устройств, которые имеют соответствующий идентификатор совместимой WinUSB в дескрипторе ОС MS. Такие устройства называются устройствами WinUSB. Производители оборудования не обязаны распространять INF-файл для своего устройства WinUSB, что упрощает процесс установки драйвера для конечного пользователя. Дополнительные сведения см. в разделе "Устройство WinUSB".

USB-драйвер клиента

Каждое USB-устройство, составное или не составное, управляется драйвером клиента. USB-клиент — это класс или драйвер устройства, который является клиентом стека USB-драйверов. К таким драйверам относятся класс и драйверы, относящиеся к устройству, от Корпорации Майкрософт или стороннего поставщика. Список драйверов классов, предоставляемых корпорацией Майкрософт, см. в разделе "Драйверы" для поддерживаемых классов USB-устройств. Драйвер клиента создает запросы для взаимодействия с устройством, вызывая общедоступные интерфейсы, предоставляемые стеком USB-драйверов.

Драйвер клиента для составного устройства не отличается от драйвера клиента для не составного устройства, за исключением его расположения в стеке драйверов.

Клиентский драйвер для не составного устройства находится непосредственно над драйвером концентратора.

Для составного USB-устройства, предоставляющего несколько функций и не имеющих драйвера родительского класса, Windows загружает универсальный родительский драйвер USB (Usbccgp.sys) между драйвером концентратора и уровнем драйвера клиента. Родительский драйвер создает отдельный PDO для каждой функции составного устройства. Клиентские драйверы (FDOs для функций) загружаются над универсальным родительским драйвером. Поставщики могут указать отдельный драйвер клиента для каждой функции.

USB-драйвер клиента может работать в пользовательском режиме или в режиме ядра в зависимости от требований драйвера. Драйверы USB-клиента можно записать с помощью подпрограмм KMDF, UMDF или WDM.

Вспомогательные библиотеки для клиентских драйверов

Корпорация Майкрософт предоставляет следующие вспомогательные библиотеки, помогающие драйверам и приложениям в режиме ядра взаимодействовать с стеком USB-драйверов:

  • Usbd.sys

    Корпорация Майкрософт предоставляет библиотеку Usbd.sys, которая экспортирует подпрограммы для драйверов USB-клиента. Вспомогательные подпрограммы упрощают операционные задачи драйвера клиента. Например, используя вспомогательные подпрограммы, драйвер USB-клиента может создавать блоки ЗАПРОСОВ USB (URBS) для определенных операций, таких как выбор конфигурации и отправка этих URL-адресов в стек USB-драйверов.

  • Usbdex.lib

    Эта вспомогательные библиотеки являются новой для Windows 8. Библиотека экспортирует подпрограммы в первую очередь для выделения и создания URI. Эти подпрограммы заменяют некоторые устаревшие подпрограммы, экспортированные Usbd.sys. Новые подпрограммы требуют, чтобы драйвер клиента зарегистрировал стек USB-драйверов, который поддерживает дескриптор регистрации. Этот дескриптор используется для вызовов других подпрограмм Usbdex.lib. Некоторые URI, выделенные новыми подпрограммами, имеют контекст URB, используемый USB-драйвером для улучшения отслеживания и обработки. Дополнительные сведения см. в разделе "Выделение и создание URI".

  • Winusb.dll

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