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

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

Важно!

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

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

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

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

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

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

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

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

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

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

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

  3. Найдите раздел реестра для устройства в этом разделе:

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

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

  5. Отключите устройство от системы и повторно подключите его к тому же физическому порту. Примечание. При изменении физического порта необходимо повторить шаги 1–4.

Написание пользовательского inf-кода для установки WinUSB

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

В следующем примере INF-файла показана установка WinUSB для большинства USB-устройств с некоторыми изменениями, такими как изменение USB_Install в именах разделов на соответствующее значение DDInstall . При необходимости следует изменить разделы версии, производителя и модели. Например, укажите название соответствующего производителя, имя подписанного файла каталога, правильный класс устройства, идентификатор поставщика (VID) и идентификатор продукта (PID) для устройства. Сведения о создании файла каталога см. в статье Создание файла каталога для Test-Signing пакета драйверов.

Также обратите внимание, что для класса установки задано значение USBDevice. Поставщики могут использовать класс установки USBDevice для устройств, которые не принадлежат к другому классу и не являются контроллерами узла USB или концентраторами.

При установке WinUSB в качестве драйвера функции для одной из функций на составном USB-устройстве необходимо указать идентификатор оборудования, связанный с функцией, в INF-файле. Идентификатор оборудования для функции можно получить из свойств devnode в диспетчер устройств. Формат строки идентификатора оборудования — "USB\VID_vvvv&PID_pppp".

Следующий inf устанавливает WinUSB в качестве драйвера функции OSR USB FX2 в 64-разрядной системе.

Начиная с Windows 10 версии 1709, комплект драйверов Windows предоставляет InfVerif.exe, которые можно использовать для тестирования INF-файла драйвера, чтобы убедиться, что синтаксические проблемы отсутствуют, а INF-файл является универсальным. Рекомендуется предоставить универсальный INF-файл. Дополнительные сведения см. в разделе Использование универсального INF-файла.

;
;
; Installs WinUsb
;

[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/Models sections ===========

[Manufacturer]
%ManufacturerName% = Standard,NTamd64

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

; ========== Class definition (for Windows 8 and earlier versions)===========

[ClassInstall32]
AddReg = ClassInstall_AddReg

[ClassInstall_AddReg]
HKR,,,,%ClassName%
HKR,,NoInstallClass,,1
HKR,,IconPath,%REG_MULTI_SZ%,"%systemroot%\system32\setupapi.dll,-20"
HKR,,LowerLogoVersion,,5.2

; =================== 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

[USB_Install.Wdf]
KmdfService=WINUSB, WinUsb_Install

[WinUsb_Install]
KmdfLibraryVersion=1.11

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

; [DestinationDirs]
; If your INF needs to copy files, you must not use the DefaultDestDir directive here.
; You must explicitly reference all file-list-section names in this section.

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

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

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

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

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

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

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

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

Следующий inf устанавливает WinUSB в качестве драйвера функции OSR USB FX2 в 64-разрядной системе. В примере показан inf с совместными установщиками WDF.

;
;
; Installs WinUsb
;

[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/Models sections ===========

[Manufacturer]
%ManufacturerName% = Standard,NTamd64

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

; ========== Class definition (for Windows 8 and earlier versions) ===========

[ClassInstall32]
AddReg = ClassInstall_AddReg

[ClassInstall_AddReg]
HKR,,,,%ClassName%
HKR,,NoInstallClass,,1
HKR,,IconPath,%REG_MULTI_SZ%,"%systemroot%\system32\setupapi.dll,-20"
HKR,,LowerLogoVersion,,5.2

; =================== 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}"

[USB_Install.CoInstallers]
AddReg=CoInstallers_AddReg
CopyFiles=CoInstallers_CopyFiles

[CoInstallers_AddReg]
HKR,,CoInstallers32,0x00010000,"WdfCoInstaller01011.dll,WdfCoInstaller","WinUsbCoInstaller2.dll"

[CoInstallers_CopyFiles]
WinUsbCoInstaller2.dll
WdfCoInstaller01011.dll

[DestinationDirs]
; If your INF needs to copy files, you must not use the DefaultDestDir directive here.
CoInstallers_CopyFiles=11
; ================= Source Media Section =====================

[SourceDisksNames]
1 = %DiskName%

[SourceDisksFiles]
WinUsbCoInstaller2.dll=1
WdfCoInstaller01011.dll=1


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

[Strings]
ManufacturerName=""
ClassName="Universal Serial Bus devices"
DeviceName="Fx2 Learning Kit Device"
DiskName="MyDisk"
REG_MULTI_SZ = 0x00010000
  • USB_Install.CoInstallers. Этот раздел, включающий указанные разделы AddReg и CopyFiles , содержит данные и инструкции по установке установщиков WinUSB и KMDF и связыванию их с устройством. Большинство USB-устройств могут использовать эти разделы и директивы без изменений.

  • В версиях Windows на базе x86 и x64 есть отдельные совместные установщики.

    У каждого совместного установщика есть бесплатные и проверенные версии. Используйте бесплатную версию для установки WinUSB в бесплатных сборках Windows, включая все розничные версии. Используйте установленную версию (с суффиксом "_chk") для установки WinUSB в проверенных сборках Windows.

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

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

Если вы используете распространяемый пакет WinUSB для Windows XP или Windows Server 2003, убедитесь, что winUSB не удаляется в пакетах удаления. Другие USB-устройства могут использовать WinUSB, поэтому двоичные файлы должны оставаться в общей папке.

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

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

  • Совместный установщик WinUSB (Winusbcoinstaller.dll)
  • Совместный установщик KMDF (WdfcoinstallerXXX.dll)
  • INF-файл, устанавливающий Winusb.sys в качестве драйвера функции устройства. Дополнительные сведения см. в статье Создание пользовательского INF-файла для установки WinUSB.
  • Подписанный файл каталога для пакета. Этот файл необходим для установки WinUSB в 64-разрядных версиях Windows, начиная с Vista.

Пакет установки WinUSB.

Убедитесь, что содержимое пакета драйвера соответствует следующим требованиям:

  • Файлы совместного установщика KMDF и WinUSB должны быть получены из одной и той же версии пакета драйверов Windows (WDK).
  • Файлы совместного установщика должны быть получены из последней версии WDK, чтобы драйвер поддерживал все последние выпуски Windows.
  • Содержимое пакета драйверов должно быть цифровой подписью сигнатуры выпуска Winqual. Дополнительные сведения о создании и тестировании подписанных файлов каталога см. в разделе Пошаговое руководство по подписи кода в режиме ядра на сайте "Оборудование" Центра разработки для Windows.
  1. Скачайте комплект драйверов Windows (WDK) и установите его.

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

  3. Скопируйте установщик WinUSB (WinusbcoinstallerX.dll) из папки WinDDK\<BuildNumber>\redist\winusb в папку пакета драйверов.

    При необходимости совместный установщик WinUSB (Winusbcoinstaller.dll) устанавливает WinUSB в целевой системе. WDK включает три версии совместного установщика в зависимости от архитектуры системы: x86, x64 и Itanium. Все они называются WinusbcoinstallerX.dll и находятся в соответствующем подкаталоге в папке WinDDK\<BuildNumber>\redist\winusb .

  4. Скопируйте совместный установщик KMDF (WdfcoinstallerXXX.dll) из папки WinDDK\<BuildNumber>\redist\wdf в папку пакета драйверов.

    При необходимости совместный установщик KMDF (WdfcoinstallerXXX.dll) устанавливает правильную версию KMDF в целевой системе. Версия совместного установщика WinUSB должна соответствовать совместному установщику KMDF, так как драйверы клиента на основе KMDF, такие как Winusb.sys, требуют правильной установки соответствующей версии платформы KMDF в системе. Например, Winusbcoinstaller2.dll требуется KMDF версии 1.9, которая устанавливается Wdfcoinstaller01009.dll. Версии WdfcoinstallerXXX.dll x86 и x64 входят в состав WDK в папке WinDDK\<BuildNumber>\redist\wdf . В следующей таблице показаны соинсталлятор WinUSB и связанный с ним совместный установщик KMDF для использования в целевой системе.

    Используйте эту таблицу для определения совместного установщика WinUSB и связанного с ним совместного установщика KMDF.

    Совместный установщик WinUSB Версия библиотеки KMDF Совместный установщик KMDF
    Winusbcoinstaller.dll Требуется KMDF версии 1.5 или более поздней Wdfcoinstaller01005.dll
    Wdfcoinstaller01007.dll
    Wdfcoinstaller01009.dll
    Winusbcoinstaller2.dll Требуется KMDF версии 1.9 или более поздней Wdfcoinstaller01009.dll
    Winusbcoinstaller2.dll Требуется KMDF версии 1.11 или более поздней WdfCoInstaller01011.dll
  5. Напишите INF-файл, который устанавливает Winusb.sys в качестве драйвера функции для USB-устройства.

  6. Создайте подписанный файл каталога для пакета. Этот файл необходим для установки WinUSB в 64-разрядных версиях Windows.

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

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