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


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

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

Внимание

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

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

Как изготовитель оборудования или независимый поставщик оборудования (IHV), вы можете создать устройство таким образом, чтобы Winusb.sys устанавливается автоматически в Windows 8 и более поздних версиях операционной системы. Такое устройство называется устройством WinUSB и не требует написания пользовательского INF-файла, который ссылается на in-box 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. В разделе "Параметры устройства" добавьте запись реестра строк с именем 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). Этот INF-файл устанавливается со установщиком WinUSB, если он еще не находится в целевой системе. Директива 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.

;
;
; 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 в версиях Windows x64, начиная с 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 в x64-разрядных версиях Windows.

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

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