WinUSB

来源:互联网 发布:easycms 建站 编辑:程序博客网 时间:2024/05/17 22:54
WinUSB

本节介绍 Microsoft 为所有 USB 设备提供的常规 WinUSB 驱动程序 (Winusb.sys) 及其用户模式组件。

在早于 Windows XP Service Pack 2 (SP2) 的 Windows 版本中,所有 USB 设备驱动程序都必须在内核模式下运行。如果所创建的 USB 设备的操作系统没有本机类驱动程序,则需要为该设备编写内核模式设备驱动程序。

Windows USB (WinUSB) 是一种常规的 USB 设备驱动程序,它是与用于 Windows XP SP2 的 Windows 驱动程序框架 (WDF) 同时开发的。WinUSB 架构由内核模式驱动程序 (Winusb.sys) 和公开 WinUSB 功能的用户模式动态链接库 (Winusb.dll) 组成。 使用这些功能,你可以通过用户模式软件管理 USB 设备。


WinUSB 架构和模块

WinUSB 由于两个基本组件组成:

Winusb.sys 是一种内核模式驱动程序,可在 USB 设备的内核模式设备堆栈的协议驱动程序之上作为筛选器驱动程序或功能驱动程序进行安装。
Winusb.dll 是一种公开 WinUSB 功能的用户模式 DLL。.当 Winusb.sys 作为设备的功能驱动程序安装后,应用程序可以使用这些功能与其进行通信。
对于不要求自定义功能驱动程序的设备,Winusb.sys 可以在该设备的内核模式堆栈中作为功能驱动程序进行安装。随后,用户模式流程通过使用一组设备 I/O 控制请求或调用 WinUSB 功能来与 Winusb.sys 进行通信。


WinUSB (Winusb.sys) 安装

对于某些通用串行总线 (USB) 设备(如仅由单个应用程序访问的设备),你可以在该设备的内核模式堆栈中安装 WinUSB (Winusb.sys) 作为 USB 设备的功能驱动程序,来取代实施驱动程序。还可以安装 WinUSB 作为功能驱动程序或为 USB 复合设备的某个特定功能安装 WinUSB。WinUSB 通过使用 WinUSB 用户模式动态链接库 winusb.dll 公开的 WinUSB 功能 与设备进行通信。

编写 WinUSB 安装的自定义 INF

作为驱动程序包的一部分,你需要提供 .inf 文件,该文件将安装 Winusb.sys 作为 USB 设备的功能驱动程序。

有关如何安装 Winusb.sys 作为功能驱动程序的完整说明,请参阅如何安装 Winusb.sys 作为设备的功能驱动程序。

下面的示例 .inf 文件西那是的针对大多数 USB 设备的 WinUSB 安装,但进行了一些修改,例如将相应部分名称中的 USB_Install 更改为相应的 DDInstall 值。你还应根据需要更改版本、制造商和型号部分。例如,提供相应的制造商名称、已签名目录文件的名称、正确的设备类以及设备的供应商标识 (VID) 和产品标识 (PID)。

还应通知安装程序类已设置为 "USBDevice"。供应商可以对不属于其他类以及不是 USB 主控制器或集线器的设备使用 "USBDevice" 安装程序类。

如果要安装 WinUSB 作为 USB 复合设备中任一功能的功能驱动程序,必须在 INF 中提供中与该功能关联的硬件 ID。可以从“设备管理器”的 devnode 属性中获取该功能的硬件 ID。硬件 ID 字符串格式为 "USB\VID_vvvv&PID_pppp"。
  1. 下面的 INF 安装 WinUSB 作为基于 x64 系统上 OSR USB FX2 主板的功能驱动程序。


  2. ;
  3. ;
  4. ; Installs WinUsb
  5. ;

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

  13. ; ========== Manufacturer/Models sections ===========

  14. [Manufacturer]
  15. %ManufacturerName% = Standard,NTamd64

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

  18. ; ========== Class definition ===========

  19. [ClassInstall32]
  20. AddReg = ClassInstall_AddReg

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

  26. ; =================== Installation ===================

  27. [USB_Install]
  28. Include = winusb.inf
  29. Needs   = WINUSB.NT

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

  33. [USB_Install.HW]
  34. AddReg=Dev_AddReg

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

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

  40. ; =================== Strings ===================

  41. [Strings]
  42. ManufacturerName=""
  43. ClassName="Universal Serial Bus devices"
  44. DeviceName="Fx2 Learning Kit Device"
  45. REG_MULTI_SZ = 0x00010000
复制代码
如何在不编写自定义 INF 的情况下自动安装 WinUSB

作为 OEM 或独立硬件供应商 (IHV),你可以构建自己的设备,以便在 Windows 8 以及早期版本的操作系统上自动安装 Winusb.sys。这种设备称作 WinUSB 设备,无需编写引用自带 Winusb.inf 的自定义 INF 文件。有关详细信息,请参阅 WinUSB 设备。

什么是 WinUSB 设备

WinUSB 设备是一种通用串行总线 (USB) 设备,其固件定义了某些 Microsoft 操作系统 (OS) 特征描述符,这些描述符将兼容 ID 报告为 "WINUSB"。

WinUSB 设备的用途是让 Windows 将 Winusb.sys 作为设备的功能驱动程序载入,而无需自定义 INF 文件。对于 WinUSB 设备,你无须为设备分发 INF 文件,对最终用户而言,这大大简化了驱动程序安装过程。相反,如果你需要提供自定义 INF,则不应将设备定义为 WinUSB 设备和在 INF 中指定设备的硬件 ID。

Microsoft 提供了 Winusb.inf,其中包含将 Winusb.sys 作为 USB 设备的设备驱动程序安装所需的信息。

在 Windows 8 之前,要将 Winusb.sys 作为功能驱动程序加载,你需要提供自定义 INF。自定义 INF 指定设备特定的硬件 ID,同时包括内置 Winusb.inf 的部分。这些部分是实例化服务、复制内置二进制文件以及注册设备接口 GUID(应用程序查找设备和与设备通讯必须使用 GUID)所必需的。有关编写自定义 INF 的信息,请参阅 WinUSB (Winusb.sys) 安装。

在 Windows 8 中,内置 Winusb.inf 文件经过更新后可让 Windows 自动将 INF 与 WinUSB 设备匹配。

使用内置 Winusb.inf 安装 WinUSB 设备

在 Windows 8 中,内置 Winusb.inf 文件已更新。INF 包括引用称为 "USB\MS_COMP_WINUSB" 的兼容 ID 的安装部分。

[Generic.Section.NTamd64]

%USB\MS_COMP_WINUSB.DeviceDesc%=WINUSB,USB\MS_COMP_WINUSB

更新的 INF 还包括称为 "USBDevice" 的新安装程序类。

"USBDevice" 安装程序类可供这些 Microsoft 未提供内置驱动程序的设备使用。通常,此类设备不属于定义良好的 USB 类(如音频、Bluetooth 等),并且需要自定义驱动程序。如果你的设备是 WinUSB 设备,则该设备很可能不属于 USB 类。因此,你的设备必须安装在 "USBDevice" 安装程序类下。更新的 Winusb.inf 便于实现该要求。

关于 USBDevice 类的使用。:  
不要对未分类设备使用“USB”安装程序类。该类预留用于安装控制器、集线器和复合设备。“USB”类误用可能造成严重的可靠性和性能问题。对于未分类设备,请使用“USBDevice”。

在 Windows 8 中,要使用“USBDevice”设备类,只需将其添加到你的 INF 中即可。

[版本]


  1. [Version]

  2. Class=USBDevice

  3. ClassGuid={88BAE032-5A81-49f0-BC3D-A4FF138216D6}

复制代码
在设备管理器中,你将会看到一个新节点 USB 通用串行总线设备,你的设备就显示在该节点下。

在 Windows 7 中,除前面的行外,你还需要在 INF 中创建以下注册表设置:

;---------- 添加注册表部分 ----------
  1. [USBDeviceClassReg]

  2. HKR,,,,"Universal Serial Bus devices"

  3. HKR,,NoInstallClass,,1

  4. HKR,,SilentInstall,,1

  5. HKR,,IconPath,%REG_MULTI_SZ%," %systemroot%\system32\setupapi.dll,-20"
复制代码
在设备管理器中,你将会发现你的设备显示在 USB 通用串行总线设备下。不过,该设备类描述由 INF 中指定的注册表设置派生而来。

- Eliyas Yakub,Microsoft Windows USB 核心团队



注意,"USBDevice" 类不仅限于 WinUSB。如果你有设备的自定义驱动程序,则可在自定义 INF 中使用 "USBDevice" 安装程序类。

在设备枚举过程中,USB 驱动程序堆栈会从设备读取兼容 ID。如果兼容 ID 是 "WINUSB",Windows 会将其用作设备标识符,并在更新的内置 Winusb.inf 中查找匹配,然后将 Winusb.sys 作为设备的功能驱动程序加载。

对于 Windows 8 之前的 Windows 版本,更新的 Winusb.inf 可通过 Windows 更新提供。
如果你的计算机配置为自动获取驱动程序更新,WinUSB 驱动程序将使用新的 INF 程序包进行安装,无需任何用户干预。




如何配置 WinUSB 设备

若要将 USB 设备标识为 WinUSB 设备,设备固件必须具有这些 Microsoft OS 描述符。

支持扩展的特征描述符

为了让 USB 驱动程序堆栈了解设备支持扩展的特征描述符,设备必须定义存储在字符串索引 0xEE 处的 OS 字符串描述符。在枚举过程中,驱动程序堆栈查询字符串描述符。如果存在描述符,驱动程序堆栈会假定设备包含一个或多个 OS 特征描述符和检索这些特征描述符所需要的数据。

检索的字符串描述符具有 bMS_VendorCode 字段值。该值表示 USB 驱动程序堆栈必须用来检索扩展特征描述符的供应商代码。

设置兼容 ID

匹配内置 Winusb.inf 和加载 WinUSB 驱动程序模块所需要的扩展兼容 ID OS 特征描述符。

扩展兼容 ID OS 特征描述符包含紧跟一个或多个功能部分的标题部分,具体取决于是否是复合设备。标题部分指定整个描述符的长度、功能部分的数量以及版本号。对于非复合设备,标题后紧跟一个仅与设备的接口关联的功能部分。该部分的 compatibleID 字段必须指定 "WINUSB" 作为字段值。复合设备有多个功能部分。每个功能部分的 compatibleID 字段必须指定 "WINUSB"。

注册设备接口 GUID

注册设备接口 GUID 所需要的扩展属性 OS 特征描述符。需要使用 GUID 从应用程序或服务查找设备、配置设备以及执行 I/O 操作。

在以前版本的 Windows 中,设备接口 GUID 注册通过自定义 INF 完成。从 Windows 8 开始,你的设备应使用扩展属性 OS 特征描述符报告接口 GUID。