面向开发人员的 WinUSB (Winusb.sys) 安装
对于某些通用串行总线(USB)设备,可以安装 WinUSB (Winusb.sys),而不是实现驱动程序。
重要
本主题是面向程序员的。 如果你是遇到 USB 问题的客户,请参阅修复 Windows 中的 USB-C 问题
不使用 INF 文件自动安装 WinUSB
OEM 或独立硬件供应商 (IHV) 可以构建设备,以便在 Windows 8 及更高版本的操作系统上自动安装 Winusb.sys。 此类设备称为 WinUSB 设备,不需要编写引用内置 Winusb.inf 的自定义 INF 文件。
连接 WinUSB 设备时,系统自动读取设备信息并加载 Winusb.sys。
有关详细信息,请参阅 WinUSB 设备。
通过指定系统提供的设备类别来安装 WinUSB
连接设备时,你可能会注意到 Windows 会自动加载 Winusb.sys 。 否则,请按照以下说明加载驱动程序:
- 将设备插入主机系统。
- 打开设备管理器并找到设备。
- 选择并按住(或右键单击)设备,然后从上下文菜单中选择“更新驱动程序软件…”。
- 在向导中,选择“浏览我的计算机以查找驱动程序软件”。
- 选择“从计算机的设备驱动程序列表中选择”。
- 从设备类别的列表中,选择“通用串行总线设备”。
- 向导显示“WinUsb 设备”。 选择此项以加载驱动程序。
如果 通用串行总线设备 未显示在设备类列表中,则需要使用自定义 INF 安装驱动程序。 前面的过程不会为应用(UWP 应用或 Windows 桌面应用)添加设备接口 GUID 来访问设备。 必须按照此过程手动添加 GUID。
按照上述过程中的说明加载驱动程序。
使用 guidgen.exe 等工具生成设备的设备接口 GUID。
在此项下找到设备的注册表项:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\<VID_vvvv&PID_pppp>
在“设备参数”项下,添加名为“DeviceInterfaceGUID”的字符串注册表项或名为“DeviceInterfaceGUIDs”的多字符串项。 将值设置为你在步骤 2 中生成的 GUID。
断开设备与系统的连接,然后将其重新连接到同一个物理端口。
注意
如果更改物理端口,则必须重复步骤 1 到 4。
编写用于 WinUSB 安装的自定义 INF
驱动程序包中有一个 .inf 文件,该文件可将 Winusb.sys 安装为 USB 设备的功能驱动程序。
以下示例 .inf 文件显示了对大多数 USB 设备的 WinUSB 安装,并进行了一些修改,例如将节名称中的 USB_Install 更改为适当的 DDInstall 值。 还应根据需要更改版本、制造商和型号部分。 例如,提供适当的制造商的名称、签名的目录文件的名称、正确的设备类别以及设备的供应商标识符 (VID) 和产品标识符 (PID)。 有关创建目录文件的信息,请参阅创建用于对驱动程序包进行测试签名的目录文件。
另请注意,安装程序类设置为 USBDevice。 供应商可以将 USBDevice 设置类用于不属于其他类的设备,并且不是 USB 主机控制器或中心。
如果要将 WinUSB 安装为 USB 复合设备中某个函数的函数驱动程序,则必须在 INF 中提供与该函数关联的硬件 ID。 可以从“设备管理器”中的 devnode 的属性获取该功能的硬件 ID。 硬件 ID 字符串格式为 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
若要仅安装新的自定义设备安装类,请在设备 INF 文件中包括 ClassInstall32 节。 已安装类中的设备的 INF 文件(无论系统提供的是设备安装程序类还是自定义类)都不能包含 ClassInstall32 部分。
除特定于设备的值以及以下列表中所述的几个问题之外,还可以使用这些部分和指令来安装适用于任何 USB 设备的 WinUSB。 这些列表项描述了上述 .inf 文件中的 Includes 和 Directives。
USB_Install:安装 WinUSB 需要 USB_Install 部分中的 Include 和 Needs 指令。 不应修改这些指令。
USB_Install.Services:USB_Install.Services 部分中的 Include 指令包含系统提供的 WinUSB .inf (Winusb.inf)。 WinUSB cointaller 在目标系统上尚未安装此 .inf 文件。 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 句柄。 有关这些例程的详细信息,请参阅如何使用 WinUSB Functions 访问 USB 设备。
以下 INF 将 WinUSB 作为 OSR USB FX2 板的功能驱动程序安装在基于 x64 的系统上。 该示例显示了 WDF 辅助安装程序的 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
[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 设备无需修改即可使用这些部分和指令。
基于 x86 和基于 x64 的 Windows 版本具有单独的硬币管理器。
每个 cointaller 都有免费和已检查的版本。 使用免费版本可在 Windows 免费版本(包括所有零售版)上安装 WinUSB。 若要在已检查的 Windows 版本上安装 WinUSB,请使用选中的版本(带有“_chk”后缀)。
每次 Winusb.sys 加载时,它都会注册一个设备接口,该设备接口具有在 DeviceInterfaceGUIDs 项下的注册表中指定的设备接口类。
HKR,,DeviceInterfaceGUIDs, 0x10000,"{D696BFEB-1734-417d-8A04-86D01071C512}"
如果使用 Windows XP 或 Windows Server 2003 的可再分发 WinUSB 包,请确保不要在卸载软件包中卸载 WinUSB。 其他 USB 设备可能正在使用 WinUSB,因此其二进制文件必须保留在共享文件夹中。
如何创建安装 Winusb.sys 的驱动程序包
要将 WinUSB 用作设备的功能驱动程序,请创建一个驱动程序包。 驱动程序包必须包含以下文件:
- WinUSB 硬币塔勒 (Winusbcoinstaller.dll)
- KMDF 硬币塔勒 (WdfcoinstallerXXX.dll)
- 一个 .inf 文件,用于将 Winusb.sys 安装为设备的功能驱动程序。 有关详细信息,请参阅为 WinUSB 安装编写自定义 INF。
- 包的已签名目录文件。 从 Vista 开始,在 Windows x64 版本上安装 WinUSB 时需要此文件。
确保驱动程序包的内容符合这些要求:
- KMDF 和 WinUSB cointaller 文件必须从同一版本的 Windows 驱动程序工具包(WDK)获取。
- 必须从最新版本的 WDK 获取 cointaller 文件,以便驱动程序支持所有最新的 Windows 版本。
- 必须使用 Winqual 版本签名对驱动程序包的内容进行数字签名。 有关如何创建和测试已签名的目录文件的详细信息,请参阅 Windows 开发人员中心硬件站点上的内核模式代码签名演练。
下载 Windows 驱动程序工具包 (WDK) 并安装此包。
在连接 USB 设备的计算机上创建驱动程序包文件夹。 例如,c:\UsbDevice。
将 WinUSB cointaller (WinusbcoinstallerX.dll) 从 WinDDK\BuildNumber>\<redist\winusb 文件夹复制到驱动程序包文件夹。
如果需要,WinUSB cointaller (Winusbcoinstaller.dll) 会在目标系统上安装 WinUSB。 WDK 包括三个版本的 cointaller,具体取决于系统体系结构:基于 x86、基于 x64 和基于 Itanium 的系统。 每个 cointaller 都命名为WinusbcoinstallerX.dll,位于 WinDDK\BuildNumber>\<redist\winusb 文件夹中的相应子目录中。
将 KMDF cointaller (WdfcoinstallerXXX.dll) 从 WinDDK\BuildNumber>\<redist\wdf 文件夹复制到驱动程序包文件夹。
如有必要,KMDF cointaller (WdfcoinstallerXXX.dll) 会在目标系统上安装正确的 KMDF 版本。 WinUSB cointaller 的版本必须与 KMDF cointaller 匹配,因为基于 KMDF 的客户端驱动程序(如 Winusb.sys)要求在系统上正确安装相应的 KMDF 框架版本。 例如,Winusbcoinstaller2.dll需要 KMDF 版本 1.9,Wdfcoinstaller01009.dll安装。 WdfcoinstallerXXX 的 x86 和 x64 版本都包含在 WinDDK\<BuildNumber>\redist\wdf 文件夹下的 WDK 中。 下表显示了在目标系统上使用的 WinUSB cointaller 和关联的 KMDF cointaller。
使用此表可以确定 WinUSB cointaller 和关联的 KMDF cointaller。
WinUSB cointaller KMDF 库版本 KMDF cointaller Winusbcoinstaller.dll 需要 KMDF 版本 1.5 或更高版本 Wdfcoinstaller01005.dll
Wdfcoinstaller01007.dll
Wdfcoinstaller01009.dllWinusbcoinstaller2.dll 需要 KMDF 版本 1.9 或更高版本 Wdfcoinstaller01009.dll Winusbcoinstaller2.dll 需要 KMDF 版本 1.11 或更高版本 WdfCoInstaller01011.dll 编写一个 .inf 文件,用于将 Winusb.sys 安装为 USB 设备的功能驱动程序。
创建包的已签名目录文件。 在 Windows x64 版本上安装 WinUSB 时需要此文件。
将 USB 设备连接到计算机。
若要安装驱动程序,请打开设备管理器。 按照“更新驱动程序软件”向导中的说明进行操作,然后选择手动安装。 若要完成安装,请提供驱动程序包文件夹的位置。