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


Установка WinUSB (Winusb.sys) для разработчиков

Для некоторых устройств универсальной последовательной шины (USB) можно установить WinUSB (Winusb.sys) вместо реализации драйвера.

Внимание

Эта статья предназначена для программистов. Если у вас возникли проблемы с USB, см. статью "Устранение проблем с USB-C в Windows"

Автоматическая установка WinUSB без INF-файла

Как изготовитель оборудования или независимый поставщик оборудования (IHV), вы можете создать устройство таким образом, чтобы Winusb.sys устанавливается автоматически. Такое устройство называется устройством WinUSB и не требует написания пользовательского INF-файла, который ссылается на in-box Winusb.inf.

При подключении устройства WinUSB Windows считывает сведения об устройстве и загружает Winusb.sys автоматически.

Дополнительные сведения см. в разделе "Устройство WinUSB".

Установка WinUSB путем указания класса устройства, предоставленного системой

При подключении устройства вы можете заметить, что Windows загружает Winusb.sys автоматически. В противном случае выполните следующие инструкции, чтобы загрузить драйвер:

  1. Подключите устройство к хост-системе.
  2. Откройте диспетчер устройств и найдите устройство.
  3. Щелкните правой кнопкой мыши устройство и выберите "Обновить программное обеспечение драйвера... " в контекстном меню.
  4. В мастере выберите Выполнить поиск драйверов на моем компьютере.
  5. Выберите Разрешить мне выбрать из списка драйверов устройств на моем компьютере.
  6. В списке классов устройств выберите устройства универсальной последовательной шины.
  7. Мастер показывает WinUsb Device. Выберите его для загрузки драйвера.

Если устройства универсальной последовательной шины не отображаются в списке классов устройств, необходимо установить драйвер с помощью пользовательского INF-файла. Предыдущая процедура не добавляет GUID интерфейса устройства для того, чтобы приложения (будь то UWP или классические приложения Windows) могли получить доступ к устройству. Чтобы добавить GUID вручную, выполните следующую процедуру.

  1. Загрузите драйвер, как описано в предыдущей процедуре.

  2. Создайте GUID интерфейса устройства для вашего устройства с помощью такого средства, как guidgen.exe.

  3. Найдите ключ реестра для устройства под этим ключом:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\<VID_vvvv&PID_pppp>

  4. В разделе Device Parameters добавьте строковую запись реестра с именем DeviceInterfaceGUID или запись типа Multi-String с именем DeviceInterfaceGUIDs. Задайте значение GUID, созданного на шаге 2.

  5. Отключите устройство от системы и повторно подключите его к одному физическому порту.

    Примечание.

    При изменении физического порта необходимо повторить шаги 1–4.

Создание пользовательского INF-файла для WinUSB

В составе пакета драйвера предоставляется INF-файл, который устанавливает Winusb.sys в качестве драйвера функции для USB-устройства.

Ниже приведен пример универсального INF-файла, допустимого для платформ x64 и ARM64 под управлением Windows 10 или более поздней версии. В этом примере нет соустановщиков, что позволяет подписывать на портале панели управления Центра разработчиков оборудования.

;
; Universal INF file for WinUsb installation
;

[Version]
Signature   = "$Windows NT$"
Class       = USBDevice
ClassGUID   = {88BAE032-5A81-49f0-BC3D-A4FF138216D6}
Provider    = %ManufacturerName%
CatalogFile = WinUSBInstallation.cat
DriverVer   = 09/04/2012,13.54.20.543
PnpLockdown = 1

; ========== Manufacturer and Models sections ===========

[Manufacturer]
%ManufacturerName% = Standard,NTamd64,NTarm64

[Standard.NTamd64]
%DeviceName% =USB_Install, USB\VID_0547&PID_1002

[Standard.NTarm64]
%DeviceName% =USB_Install, USB\VID_0547&PID_1002

; =================== Installation ===================

[USB_Install]
Include = winusb.inf
Needs   = WINUSB.NT

[USB_Install.Services]
Include =winusb.inf
Needs   = WINUSB.NT.Services

[USB_Install.HW]
AddReg=Dev_AddReg

[Dev_AddReg]
HKR,,DeviceInterfaceGUIDs,0x10000,"{9f543223-cede-4fa3-b376-a25ce9a30e74}"

; =================== Strings ===================

[Strings]
ManufacturerName="Contoso"
ClassName="Universal Serial Bus devices"
DeviceName="Fx2 Learning Kit Device"
REG_MULTI_SZ = 0x00010000

Этот универсальный INF-файл можно использовать на нескольких платформах Windows (x64 и ARM64) и может быть подписан на портале панели мониторинга Центра разработчиков оборудования .

Чтобы установить только новый класс настройки пользовательского устройства, добавьте раздел ClassInstall32 в INF-файл устройства. INF-файлы для устройств в установленном классе, независимо от того, является ли это системный класс установки устройства или пользовательский класс, не должны включать раздел ClassInstall32.

За исключением значений, относящихся к устройству, и некоторых проблем, отмеченных в следующем списке, можно использовать эти разделы и директивы для установки WinUSB для любого USB-устройства. Эти элементы списка описывают Includes и Directives в предыдущем INF-файле.

  • USB_Install: Директивы Include и Needs в разделе USB_Install требуются для установки WinUSB. Эти директивы не следует изменять.

  • USB_Install.Services: директива Include в разделе USB_Install.Services содержит предоставленный системой INF-файл для WinUSB (Winusb.inf). Windows устанавливает этот INF-файл, если он еще не установлен в целевой системе. Директива Needs указывает раздел в Winusb.inf , содержащий сведения, необходимые для установки Winusb.sys в качестве драйвера функции устройства. Эти директивы не следует изменять.

  • USB_Install.HW: этот раздел является ключом в INF-файле. Он задает глобальный уникальный идентификатор интерфейса устройства (GUID) для вашего устройства. Директива AddReg задает указанный GUID интерфейса в стандартном значении реестра. Когда Winusb.sys загружается в качестве драйвера функции устройства, он считывает значение реестра ключа DeviceInterfaceGUIDs и использует указанный GUID для представления интерфейса устройства. Вы должны заменить GUID в этом примере на тот, который вы создаете специально для вашего устройства. Если протоколы для устройства изменяются, создайте новый GUID интерфейса устройства.

    Примечание.

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

Каждый раз при загрузке Winusb.sys он регистрирует интерфейс устройства с классами, указанными в реестре под ключом DeviceInterfaceGUIDs.

HKR,,DeviceInterfaceGUIDs, 0x10000,"{D696BFEB-1734-417d-8A04-86D01071C512}"

Создание пакета драйверов, который устанавливает Winusb.sys

Чтобы использовать WinUSB в качестве драйвера функции устройства, создайте пакет драйвера. Ниже приведены инструкции по созданию пакета драйвера, который устанавливает Winusb.sys:

  1. Скачайте комплект драйверов Windows (WDK) и установите его на компьютере.

  2. Создайте папку пакета драйверов в системе, где подключено USB-устройство, например C:\UsbDevice.

  3. Напишите INF-файл, который устанавливает Winusb.sys в качестве драйвера функции для USB-устройства и сохраните его в папке пакета драйвера. Пример записи этого файла можно найти в разделе "Написание настраиваемого INF для WinUSB" этого документа.

  4. Создайте подписанный файл каталога для пакета. Этот файл необходим для установки WinUSB в Windows. Дополнительные сведения о создании и тестировании файлов подписанных каталогов см. в пошаговом руководстве по подписи кодаKernel-Mode на сайте Центра разработки для Windows — оборудование.

    Схема с содержимым пакета установки драйвера WinUSB

  5. Подключите USB-устройство к компьютеру.

  6. Откройте диспетчер устройств на компьютере. Следуйте инструкциям мастера обновления драйверов и выберите ручную установку. При появлении запроса укажите расположение папки пакета драйвера для завершения установки.