现在的位置: 首页 > 综合 > 正文

WinUSB – 微软为所有 USB 设备提供的常规驱动程序

2013年05月30日 ⁄ 综合 ⁄ 共 6977字 ⁄ 字号 评论关闭

WinUSB - 微软为所有 USB 设备提供的常规驱动程序 

  [复制链接]

   

20

主题

0

好友

717

积分

高级会员

Rank: 4

莫元
696
跳转到指定楼层

1

 发表于
2013-4-19 22:48:33
 |只看该作者 |倒序浏览
本帖最后由 shangdawei 于 2013-4-19
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。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

签名档
 
   

20

主题

0

好友

717

积分

高级会员

Rank: 4

莫元
696
2

 发表于
2013-4-19 22:58:10
 |只看该作者

如何通过 WinUSB 功能访问 USB 设备


在本主题中,你将了解应用程序如何通过调用 WinUSB 功能与 USB 设备通信。本主题假定你已经将 WinUSB (Winusb.sys) 加载为设备的函数驱动程序。位于设备的内核模式堆栈中的 WinUSB。此驱动程序包括在 Windows 的 \Windows\System32\drivers 文件夹中。 有关安装此驱动程序的说明,请参阅 WinUSB (Winusb.sys) 安装。


如果你正在使用 Winusb.sys 作为 USB 设备的函数驱动程序,则可以从应用程序调用 WinUSB 功能来与设备通信。这些由用户模式 DLL Winusb.dll 公开的函数可简化通信过程。与构建设备 I/O 控制请求来执行标准 USB 操作(如配置设备、发送控制请求以及与设备互传数据)不同,应用程序调用等效的 WinUSB 功能。


Winusb.dll 使用应用程序提供的数据构建适当的设备 I/O 控制请求,然后将请求发送到 Winusb.sys 进行处理。为与 USB 堆栈通信,WinUSB 功能使用与应用程序的请求对应的适当 IOCTL 调用 DeviceIoControl。 当请求完成时,WinUSB 功能将 Winusb.sys 返回的任何信息(例如来自读请求的数据)再回传到调用进程。如果调用 DeviceIoControl 成功,它将返回非零值。如果调用失败或者挂起(不立即处理),DeviceIoControl 将返回零值。
如果出现错误,应用程序可以调用 GetLastError 以获得更详细的错误消息。


使用 WinUSB 功能与设备通信比实现驱动程序更简单。不过,请注意以下限制:


WinUSB 功能一次仅允许一个应用程序与设备通信。如果需要多个应用程序同时与设备通信,则必须实现一个函数驱动程序。

WinUSB 功能不支持在同步终结点之间传输流数据。同步传输需要一个内核模式的函数驱动程序。

WinUSB 功能不支持已经提供内核模式支持的设备。此类设备的示例包括调制解调器和网络适配器,二者分别由电话服务 API (TAPI) 和 NDIS 支持。

对于多功能设备,可以使用设备的 INF 文件分别为每个 USB 函数指定内置内核模式驱动程序或 Winusb.sys。不过,对于某个特定函数,只能指定其中一个选项,而不能同时指定两个。

可以将 Winusb.sys 安装为 USB 复合设备中函数的函数驱动程序。这需要在 INF 中进行一些硬件 ID 修改。有关详细信息,请参阅 WinUSB (Winusb.sys) 安装中的“为 WinUSB 安装编写 .Inf 文件”。


Winusb.sys 也是 UMDF 函数驱动程序与关联的设备之间链接的关键部分。Winusb.sys 作为高层筛选器驱动程序安装在设备的内核模式堆栈中。应用程序通过与设备的 UMDF 函数驱动程序通信来发送读、写或设备 I/O 控制请求。驱动程序与框架交互,后者将请求传递到 Winusb.sys。Winusb.sys 随后处理该请求并将其传递到协议驱动程序,最后传递到设备。任何响应都通过反向路径返回。Winusb.sys 还作为设备堆栈的即插即用和电源所有者 (PPO)。


注意  WinUSB 功能需要 Windows XP 或更高版本。你可以在 C/C++ 应用程序中使用这些函数与你的 USB 设备通信。Microsoft 不支持为 WinUSB 提供托管 API。

本主题包括如何使用 WinUSB 功能与使用 Winusb.sys 作为函数驱动程序的 USB 设备进行通信的详细演练。


先决条件

设置项目

创建设备的文件句柄

获取设备的 WinUSB 接口句柄

查询设备以获取 USB 描述符

向默认终结点发送控制传输

发送 I/O 请求

释放设备句柄

实现主函数

相关主题


如何通过 WinUSB 功能访问 USB 设备

签名档
 

抱歉!评论已关闭.