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


Устройство WinUSB

Узнайте, как Windows распознает устройство WinUSB в этой статье.

Сведения, приведенные в этой статье, относятся к вам, если вы являетесь производителем оригинального оборудования (OEM) или независимым поставщиком оборудования (IHV), разрабатываете устройство для использования Winusb.sys в качестве функционального драйвера. В этой статье показано, как автоматически загружать драйвер без необходимости предоставлять настраиваемый файл информации об установке (INF).

Что такое устройство WinUSB

Устройство WinUSB — это устройство универсальной последовательной шины (USB), встроенное ПО которого определяет некоторые дескрипторы компонентов операционной системы Майкрософт, которые сообщают "WINUSB" в качестве совместимого идентификатора.

Цель устройства WinUSB — разрешить Windows загружать Winusb.sys в качестве драйвера функции устройства без пользовательского INF-файла. Для устройства WinUSB не требуется распространять INF-файлы для устройства, что упрощает процесс установки драйвера для конечных пользователей. И наоборот, если необходимо предоставить пользовательский INF-файл, не следует определять устройство как устройство WinUSB и указать идентификатор оборудования устройства в INF.

Корпорация Майкрософт предоставляет Winusb.inf, содержащую сведения, необходимые для установки Winusb.sys в качестве драйвера устройства для USB-устройства.

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

В Windows 8 обновляется файл Winusb.inf, встроенный в систему, чтобы Windows автоматически связывал INF с устройством WinUSB.

Установка устройства WinUSB с помощью встроенного Winusb.inf

В Windows 8 обновляется встроенный файл Winusb.inf. INF содержит раздел установки, который ссылается на совместимый идентификатор с именем USB\MS_COMP_WINUSB.

[Generic.Section.NTamd64]
%USB\MS_COMP_WINUSB.DeviceDesc%=WINUSB,USB\MS_COMP_WINUSB

Обновленный INF также включает новый класс установки с именем USBDevice.

Класс установки USBDevice доступен для тех устройств, для которых корпорация Майкрософт не предоставляет встроенный драйвер. Как правило, такие устройства не принадлежат к хорошо определенным USB-классам, таким как Audio, Bluetooth и т. д., и требуют пользовательского драйвера. Если устройство является устройством WinUSB, скорее всего, устройство не принадлежит к USB-классу. Поэтому устройство должно быть установлено в классе установки USBDevice. Обновленный Winusb.inf упрощает это требование.

Сведения об использовании класса USBDevice

Не используйте класс установки USB для неклассифицированных устройств. Этот класс зарезервирован для установки контроллеров, концентраторов и составных устройств. Неправильное использованием USB-класса может привести к значительным проблемам надежности и производительности. Используйте USBDevice для неклассифицированных устройств.

В Windows 8 добавьте это определение в INF-файл для использования класса устройства USBDevice:

  [Version]
  ...
  Class=USBDevice
  ClassGuid={88BAE032-5A81-49f0-BC3D-A4FF138216D6}
  ...

В диспетчере устройств смотрите новый узел под названием Устройства USB универсальной последовательной шины, и ваше устройство отображается под этим узлом.

В Windows 7 в дополнение к предыдущим строкам необходимо создать эти параметры реестра в INF:

  ;---------- Add Registry Section ----------
  [USBDeviceClassReg]
  HKR,,,,"Universal Serial Bus devices"
  HKR,,NoInstallClass,,1
  HKR,,SilentInstall,,1
  HKR,,IconPath,%REG_MULTI_SZ%,"%systemroot%\system32\setupapi.dll,-20"

В диспетчере устройств устройство отображается в устройства универсальной последовательной шины USB. Однако описание класса устройства является производным от параметра реестра, указанного в INF.

Класс USBDevice не ограничен только драйвером WinUSB для Windows. Если у вас есть пользовательский драйвер для вашего устройства, вы можете использовать класс установки USBDevice в пользовательском файле INF.

Во время перечисления устройств стек USB-драйверов считывает совместимый идентификатор с устройства. Если "WINUSB" является совместимым идентификатором, Windows использует его в качестве идентификатора устройства и находит совпадение в обновленном in-box Winusb.inf, а затем загружает Winusb.sys в качестве драйвера функции устройства.

Это изображение предназначено для устройства MUTT с одним интерфейсом, которое определяется как устройство WinUSB, и в результате драйвер функции Winusb.sys загружается для устройства.

снимок экрана диспетчера устройств Windows с устройством WinUSB.

Для версий Windows, предшествующих Windows 8, обновленный Winusb.inf доступен через Центр обновления Windows. Если компьютер настроен на автоматическое обновление драйвера, драйвер WinUSB устанавливается без вмешательства пользователя с помощью нового пакета INF.

Как изменить описание устройства для устройства WinUSB

Для устройства WinUSB диспетчер устройств отображает "Устройство WinUsb" в качестве описания устройства. Эта строка является производным от Winusb.inf. При наличии нескольких устройств WinUSB все устройства получают одно и то же описание устройства.

Для уникальной идентификации и различения устройства в Диспетчере устройств Windows 8 предоставляет новое свойство в классе устройств, которое указывает системе отдавать приоритет описанию устройства, сообщаемому устройством (в его дескрипторе строки ), над описанием в INF. Класс USBDevice, определенный в Windows 8, задает это свойство. Если устройство установлено в класс USBDevice, Windows запрашивает описание устройства у устройства и устанавливает строку диспетчера устройств в соответствии с полученным в запросе описанием. В этом случае описание устройства, предоставленное в INF, игнорируется. Обратите внимание на строки описания устройства: MUTT на предыдущем изображении. Строка предоставляется USB-устройством в дескрипторе строки продукта.

Новое свойство класса не поддерживается в более ранних версиях Windows. Чтобы настроить описание устройства в более ранней версии Windows, необходимо написать собственный пользовательский INF-файл.

Настройка устройства WinUSB

Чтобы определить USB-устройство как устройство WinUSB, встроенное ПО устройства должно иметь дескрипторы ОС Майкрософт. Сведения о дескрипторах см. в изложенных здесь спецификациях: Microsoft OS Descriptors.

Поддержка дескрипторов расширенных функций

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

Дескриптор полученной строки имеет значение поля bMS_VendorCode. Значение указывает код производителя, который стек USB-драйверов должен использовать для получения дескриптора расширенной функции.

Сведения о том, как определить дескриптор строки ОС, см. в разделе "Дескриптор строки ОС" в спецификациях, описанных по следующей ссылке: Майкрософт ОС Дескрипторы.

Настройка совместимого идентификатора

Дескриптор функции ОС с расширенным совместимым идентификатором, который необходим для сопоставления с встроенным файлом Winusb.inf и загрузки модуля драйвера WinUSB.

Дескриптор функции ОС с расширенным совместимым идентификатором включает раздел заголовка, за которым следует один или несколько разделов функций в зависимости от того, является ли устройство составным или некомпозитным. Раздел заголовка указывает длину всего дескриптора, количество разделов функций и номер версии. За заголовком для некомпоситового устройства следует один раздел функции, связанный только с интерфейсом устройства. Поле совместимого идентификатора этого раздела должно указывать "WINUSB" в качестве значения. Для составного устройства существует несколько разделов функций. Поле compatibleID каждой секции функции должно указывать "WINUSB".

Регистрация GUID для интерфейса устройства

Дескриптор функции расширенных свойств ОС, необходимый для регистрации GUID интерфейса устройства. Идентификатор GUID необходим для поиска устройства из приложения или службы, настройки устройства и выполнения операций ввода-вывода.

В предыдущих версиях Windows регистрация GUID интерфейса устройства выполняется с помощью настраиваемого INF. Начиная с Windows 8, устройство должно сообщать идентификатор GUID интерфейса, используя дескриптор возможностей ОС для дополнительных свойств.

Дескриптор расширенных свойств ОС содержит раздел заголовка, за которым следует один или несколько разделов настраиваемых свойств. В разделе заголовка описывается весь дескриптор расширенных свойств, включая общую длину, номер версии и количество разделов настраиваемых свойств. Чтобы зарегистрировать GUID интерфейса устройства, добавьте раздел пользовательских свойств, установите для поля bPropertyName значение "DeviceInterfaceGUID", а для wPropertyNameLength установите значение 40 байт. Создайте уникальный GUID интерфейса устройства с помощью генератора GUID и задайте для поля bPropertyData этот GUID, например "{8FE6D4D7-49DD-41E7-9486-49AFC6BFE475}". GUID указывается в виде строки Юникода, а длина строки составляет 78 байт (включая терминатор NULL).

       
bPropertyData 78 байт 7B 00 38 00 46 00 45 00 36 00 44 00 34 00 44 00 37 00 2D 00 34 00 39 00 00 44 00 2D 00 34 00 31 00 45 00 37 00 2D 00 39 00 34 00 38 00 36 00 2D 00 34 00 39 00 41 00 46 00 43 00 36 00 42 00 46 00 45 00 34 00 37 00 35 00 7D 00 00 00 Значение свойства : {8FE6D4D7-49DD-41E7-9486-49AFC6BFE475}.

Во время перечисления устройств стек USB-драйверов извлекает значение DeviceInterfaceGUID из дескриптора функции ОС расширенных свойств и регистрирует устройство в аппаратном ключе устройства. Приложение может получить значение, используя API-интерфейсы SetupDiXxx (см. SetupDiOpenDevRegKey в разделе ). Дополнительные сведения см. в разделе Доступ к USB-устройству с помощью функций WinUSB.

Включение или отключение функций управления питанием WinUSB

До Windows 8, чтобы настроить функции управления питанием WinUSB, вам нужно было написать значения записей реестра в раздел HW.AddReg вашего пользовательского INF.

В Windows 8 и более поздних версиях можно указать параметры питания на устройстве. Вы можете сообщать о значениях с помощью дескриптора расширенных свойств ОС, который включает или отключает функции в WinUSB для этого устройства. Можно настроить две функции: выборочная приостановка и пробуждение системы. Функция выборочного приостановления позволяет устройству переходить в состояние низкого энергопотребления, когда оно не используется. Пробуждение системы относится к возможности устройства вывести систему из режима энергосбережения.

Сведения о функциях управления питанием WinUSB см. в WinUSB Power Management.

Имя свойства Описание
ВключениеРежимаОжиданияУстройства Это значение установлено в 1, чтобы указать, что устройство может отключиться при бездействии (выборочная приостановка).
DefaultIdleState Это значение имеет значение 1, чтобы указать, что устройство может быть приостановлено при простое по умолчанию.
DefaultIdleTimeout Это значение имеет значение 5000 в миллисекундах, чтобы указать время ожидания в миллисекундах перед определением простоя устройства.
ПользовательВключилОжиданиеУстройства Это значение имеет значение 1, чтобы разрешить пользователю управлять возможностью устройства включить или отключить выборочную приостановку USB. Флажок "Разрешить компьютеру отключать это устройство для экономии питания" на странице свойств "Управление питанием" устройства, и пользователь может установить или снять этот флажок, чтобы включить или отключить выборочную приостановку USB.
АктивированоПробуждениеСистемы Это значение имеет значение 1, чтобы разрешить пользователю управлять способностью устройства проснуть систему из состояния низкой мощности. Если этот параметр включен, на странице свойств управления питанием устройства появится флажок Разрешить этому устройству пробуждать компьютер. Пользователь может установить или снять флажок, чтобы включить или отключить пробуждение системы через USB.

Например, чтобы включить выборочную приостановку на устройстве, добавьте раздел настраиваемого свойства, который задает поле bPropertyName строке Юникода "DeviceIdleEnabled", а длину wPropertyNameLength — 36 байт. Задайте для поля bPropertyData значение "0x00000001". Значения свойств хранятся в виде 32-разрядных целых чисел.

Во время перечисления стек драйверов USB считывает дескрипторы функции расширенных свойств и создает записи в реестре по этому ключу.

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Enum\USB\<Идентификатор устройства>\<Идентификатор экземпляра>\Device Parameters

На этом рисунке показаны примеры параметров для устройства WinUSB.

снимок экрана редактора реестра Windows с параметрами для устройства WinUSB.

Для получения дополнительных примеров смотрите спецификации дескрипторов ОС Microsoft .