Устройство WinUSB

Из этой статьи вы узнаете, как устройство WinUSB распознается Windows.

Сведения, приведенные в этой статье, относятся к вам, если вы являетесь изготовителем оборудования или независимым поставщиком оборудования (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, чтобы использовать класс устройства "USBDevice", просто добавьте в inf::

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

В диспетчер устройств вы увидите новый узел USB Universal Serial Bus devices и ваше устройство появится под этим узлом.

В 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 Universal Serial Bus devices (Устройства универсальной последовательной шины USB). Однако описание класса устройства является производным от параметра реестра, указанного в inf.

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

Во время перечисления устройств стек usb-драйвера считывает совместимый идентификатор с устройства. Если совместимым идентификатором является WINUSB, Windows использует его в качестве идентификатора устройства и находит совпадение в обновленном встроенном файле 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 предоставляет новое свойство класса устройства, которое предписывает системе присвоить приоритет описанию устройства, переданному устройством (в его дескрипторе строки iProduct), над описанием в INF. Класс USBDevice, определенный в Windows 8 задает это свойство. Другими словами, если устройство установлено в классе USBDevice, система запрашивает у устройства описание устройства и задает строке диспетчер устройств значение , полученное в запросе. В этом случае описание устройства, указанное в inf-файле, игнорируется. Обратите внимание на строки описания устройства: "MUTT" на предыдущем изображении. Строка предоставляется USB-устройством в дескрипторове строки продукта.

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

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

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

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

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

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

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

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

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

Дескриптор функций ОС с расширенным совместимым идентификатором включает раздел заголовка, за которым следует один или несколько разделов функций в зависимости от того, является ли устройство составным или не составным устройством. В разделе заголовка указывается длина всего дескриптора, количество разделов функций и номер версии. Для не составного устройства за заголовком следует один раздел функции, связанный с единственным интерфейсом устройства. Поле compatibleID этого раздела должно указывать "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 2 D 00 39 00 34 00 38 00 36 00 2D 00 34 00 39 00 41 00 46 0 0 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.

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

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

Во время перечисления стек usb-драйвера считывает дескрипторы функций расширенных свойств и создает записи реестра в следующем разделе:

HKEY_LOCAL_MACHINE\Системы\CurrentControlSet\Перечисления\USB\Параметры устройстваидентификатора><\\>экземпляра устройства<

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

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

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