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

120 篇文章 3 订阅

作者:shangdawei

转自:http://www.amobbs.com/forum.php?mod=viewthread&tid=5530162&page=1&authorid=2963


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 程序包进行安装,无需任何用户干预。


WinUsbCompat.rar(5.41 KB, 下载次数: 24)

如何配置 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。


如何通过 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 设备


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

这个就像HID或者MSC之类, 只要设备符合WinUSB的要求, 无需提供 inf和驱动, windows自动安装winusb.sys

另外在win8下, 修改/自定义 inf 文件, 或出现签名问题, 似乎要启动安全模式才允许安装,
使用内置的inf则不会出现这个问题, 要符合WinUSB的要求, 至少需要提供以下 3 项 :

1. 定义存储在字符串索引 0xEE 处的 OS 字符串描述符

  1. #define bMS_VendorCode              ( 0x01 )
  2. // "MSFT100" : index : 0xEE : langId : 0x0000
  3. const U8 OS_StringDescritpor[ ] =
  4. { 0x12,  0x03,  'M',  0,  'S',  0,  'F',  0,  'T',  0,  '1',  0,  '0',  0,  '0',  0,  bMS_VendorCode,  0 };
复制代码
处理 usb 标准请求时, 读取 index==0xEE 的串描述符, 返回 OS_StringDescritpor
bMS_VendorCode 将作为后续 Vendor 请求的请求代码

2. 设置扩展兼容 ID OS 特征描述符包
  1. // "WINUSB\0\0" : wIndex : 0x0004
  2. const U8 WINUSB_ExtendedCompatId_Descritpor[ ] =
  3. {
  4.   0x28, 0x00, 0x00, 0x00,                         // dwLength
  5.   0x00, 0x01,                                     // bcdVersion
  6.   0x04, 0x00,                                     // wIndex
  7.   0x01,                                           // bCount
  8.   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,       // Reserved[7]
  9.   0x00,                                           // bFirstInterfaceNumber
  10.   0x01,                                           // RESERVED ( 0x01 )
  11.   'W', 'I', 'N', 'U', 'S', 'B', 0x00, 0x00,       // compactiableID[8]
  12.   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // subCompactiableID[8]
  13.   0x00, 0x00, 0x00, 0x00, 0x00, 0x00              // Reserved[6]
  14. };
复制代码
处理请求带代码为 bMS_VendorCode 的 vendor 请求时, 若设置包的 wIndex == 0x0004 返回WINUSB_ExtendedCompatId_Descritpor


3. 注册设备接口 GUID
  1. // L"DeviceInterfaceGUID" : wIndex = 0x0005
  2. // L"{12345678-1234-1234-1234-123456789ABC}"
  3. //
  4. const U8 WINUSB_ExtendedProperty_InterfaceGUID_Descritpor[ ] =
  5. {
  6.   0x8E, 0x00, 0x00, 0x00,     // dwTotalSize = Header + All sections
  7.   0x00, 0x01,                 // bcdVersion
  8.   0x05, 0x00,                 // wIndex
  9.   0x01, 0x00,                 // wCount
  10.   
  11.   0x84, 0x00, 0x00, 0x00,     // dwSize -- this section
  12.   
  13.   0x01, 0x00, 0x00, 0x00,     // dwPropertyDataType
  14.   
  15.   0x28, 0x00,                 // wPropertyNameLength
  16.   
  17.   'D', 0x00, 'e', 0x00,       // bProperytName : WCHAR : L"DeviceInterfaceGUID"
  18.   'v', 0x00, 'i', 0x00,       // bProperytName : WCHAR
  19.   'c', 0x00, 'e', 0x00,       // bProperytName : WCHAR
  20.   'I', 0x00, 'n', 0x00,       // bProperytName : WCHAR
  21.   't', 0x00, 'e', 0x00,       // bProperytName : WCHAR
  22.   'r', 0x00, 'f', 0x00,       // bProperytName : WCHAR
  23.   'a', 0x00, 'c', 0x00,       // bProperytName : WCHAR
  24.   'e', 0x00, 'G', 0x00,       // bProperytName : WCHAR
  25.   'U', 0x00, 'I', 0x00,       // bProperytName : WCHAR
  26.   'D', 0x00, 0x00, 0x00,      // bProperytName : WCHAR
  27.   
  28.   0x4E, 0x00, 0x00, 0x00,     // dwPropertyDataLength : 78 Bytes = 0x0000004E
  29.   
  30.   '{', 0x00, '1', 0x00,       // bPropertyData : WCHAR : L"{12345678-1234-1234-1234-123456789ABC}"
  31.   '2', 0x00, '3', 0x00,       // bPropertyData
  32.   '4', 0x00, '5', 0x00,       // bPropertyData
  33.   '6', 0x00, '7', 0x00,       // bPropertyData
  34.   '8', 0x00, '-', 0x00,       // bPropertyData
  35.   '1', 0x00, '2', 0x00,       // bPropertyData
  36.   '3', 0x00, '4', 0x00,       // bPropertyData
  37.   '-', 0x00, '1', 0x00,       // bPropertyData
  38.   '2', 0x00, '3', 0x00,       // bPropertyData
  39.   '4', 0x00, '-', 0x00,       // bPropertyData
  40.   '1', 0x00, '2', 0x00,       // bPropertyData
  41.   '3', 0x00, '4', 0x00,       // bPropertyData
  42.   '-', 0x00, '1', 0x00,       // bPropertyData
  43.   '2', 0x00, '3', 0x00,       // bPropertyData
  44.   '4', 0x00, '5', 0x00,       // bPropertyData
  45.   '6', 0x00, '7', 0x00,       // bPropertyData
  46.   '8', 0x00, '9', 0x00,       // bPropertyData
  47.   'A', 0x00, 'B', 0x00,       // bPropertyData
  48.   'C', 0x00, '}', 0x00,       // bPropertyData
  49.   0x00, 0x00                  // bPropertyData
  50. };
复制代码
处理请求带代码为 bMS_VendorCode 的 vendor 请求时, 若设置包的 wIndex == 0x0005 返回WINUSB_ExtendedProperty_InterfaceGUID_Descritpor

至此, Windows 将安装 WinUsb.sys 作为设备的驱动

3.gif

compactid.gif

guid.gif

通讯过程参考

log1.jpg

log2.jpg


搜索到这些软件, 应该可以生成的驱动并且直接加载

http://sourceforge.net/projects/libusb-win32/

http://sourceforge.net/projects/libusbx/

http://sourceforge.net/projects/libusbk/

http://sourceforge.net/projects/libwdi/

http://sourceforge.net/projects/libwdi/files/zadig/

zadig.png


libusbk.jpg

  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
USB虚拟NDIS网络适配器是一种用于USB设备的网络适配器。它可以将USB设备(如手机、无线网卡等)转换为虚拟的网络设备,在计算机上创建一个虚拟的网络连接端口。 USB虚拟NDIS网络适配器的主要作用是为USB设备提供网络连接功能,使得这些设备可以通过USB接口连接到计算机,并通过计算机的网络连接功能来进行网络通信。 使用USB虚拟NDIS网络适配器,用户可以通过将USB设备连接到计算机上,实现与其他计算机或网络的通信。这种适配器在无线网络通信方面尤为重要,因为它可以将无线网卡或手机等设备转换为可用于无线网络连接的网络设备。 使用USB虚拟NDIS网络适配器时,用户必须先安装适配器的驱动程序,以确保计算机可以正确地识别和使用适配器。安装驱动程序后,用户可以通过计算机的网络设置界面,设置和配置网络连接,实现与其他设备或网络的通信。 USB虚拟NDIS网络适配器的好处是它的便携性和灵活性。用户可以随时随地将USB设备插入计算机,无需使用额外的网络线缆或设备,即可实现网络连接。这对于需要经常移动或需要应急联网的用户来说非常方便。 总的来说,USB虚拟NDIS网络适配器是一种通过USB接口为设备提供网络连接功能的适配器。它的使用简便、灵活便携,使用户能够随时随地实现网络通信,特别适用于无线网络通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值