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


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

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

Внимание

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

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

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

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

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

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

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

  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. В разделе "Параметры устройства" добавьте запись реестра строк с именем DeviceInterfaceGUID или запись с несколькими строками с именем DeviceInterfaceGUID. Задайте значение GUID, созданного на шаге 2.

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

    Примечание.

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

Написание пользовательской установки INF для WinUSB

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

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

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

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

Следующий INF устанавливает WinUSB в качестве драйвера функции ПЛАТЫ OSR USB FX2 в системе на основе x64.

Начиная с 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-устройства. Эти элементы списка описывают директивы "Включает " и "Директивы " в предыдущем INF-файле.

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

  • USB_Install.Services: директива Include в разделе USB_Install.Services содержит предоставленный системой INF-файл для WinUSB (Winusb.inf). WinUSB coinstaller устанавливает этот 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".

Следующий INF устанавливает WinUSB в качестве драйвера функции ПЛАТЫ OSR USB FX2 в системе на основе x64. В примере показан INF с WDF cointallers.

;
;
; 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, включая все розничные версии. Чтобы установить WinUSB на проверенных сборках Windows, используйте установленную версию (с суффиксом _chk).

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

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

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

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

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

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

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

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

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

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

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

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

  4. Скопируйте kmDF coinstaller (WdfcoinstallerXXX.dll) из папки WinDDK\<BuildNumber>\redist\wdf в папку пакета драйвера.

    KmDF coinstaller (WdfcoinstallerXXX.dll) устанавливает правильную версию KMDF в целевой системе при необходимости. Версия WinUSB coinstaller должна соответствовать kmDF coinstaller, так как драйверы клиентов на основе 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 cointaller Версия библиотеки KMDF KMDF cointaller
    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 в x64-разрядных версиях Windows.

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

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