windows USB 设备驱动开发-创建安装 Winusb.sys 的驱动程序包

要将 WinUSB 用作设备的功能驱动程序,请创建一个驱动程序包。 驱动程序包必须包含以下文件:

  • WinUSB 辅助安装程序 (Winusbcoinstaller.dll);
  • KMDF 辅助安装程序 (WdfcoinstallerXXX.dll);
  • 一个 .inf 文件,用于将 Winusb.sys 安装为设备的功能驱动程序;
  • 包的已签名目录文件。 从 Vista 开始,在 Windows x64 版本上安装 WinUSB 时需要此文件;
    3fa52cffa7b94f17a2f8cc562023bfa3.png

确保驱动程序包的内容符合这些要求:

  • 必须从相同版本的 Windows 驱动程序工具包 (WDK) 获取 KMDF 和 WinUSB 辅助安装程序文件‘;
  • 必须从最新版本的 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,并且位于 WinDDK\<BuildNumber>\redist\winusb 文件夹的相应子目录中;
  4. 将 KMDF 辅助安装程序 (WdfcoinstallerXXX.dll) 从 WinDDK\<BuildNumber>\redist\wdf 文件夹复制到驱动程序包文件夹。
    KMDF 辅助安装程序 (WdfcoinstallerXXX.dll) 根据需要在目标系统上安装适当的 KMDF 版本。 WinUSB 辅助安装程序的版本必须与 KMDF 辅助安装程序匹配,因为基于 KMDF 的客户端驱动程序(例如 Winusb.sys)要求在系统上正确安装相应版本的 KMDF 框架。 例如,Winusbcoinstaller2 需要 KMDF 版本1.9,该版本由 Wdfcoinstaller01009 安装。 WdfcoinstallerXXX 的 x86 和 x64 版本都包含在 WinDDK\<BuildNumber>\redist\wdf 文件夹下的 WDK 中。 下表显示了要在目标系统上使用的 WinUSB 辅助安装程序和关联的 KMDF 辅助安装程序。使用此表可确定 WinUSB 辅助安装程序和关联的 KMDF 辅助安装程序;
    09c80e7958124a96904a5a57e6db045f.png
  5. 编写一个 .inf 文件,用于将 Winusb.sys 安装为 USB 设备的功能驱动程序;
  6. 创建包的已签名目录文件。 在 Windows x64 版本上安装 WinUSB 时需要此文件;
  7. 将 USB 设备连接到计算机;
  8. 打开“设备管理器”,以安装驱动程序。 按照“更新驱动程序软件”向导中的说明进行操作,然后选择手动安装。 你需要提供驱动程序包文件夹的位置才能完成安装;

WinUSB 设备

在本文中,你将了解 Windows 如何识别 WinUSB 设备。

如果你是 OEM 或独立硬件供应商, (IHV) 开发想要使用 Winusb.sys 作为函数驱动程序的设备,并且想要在不提供自定义 INF 的情况下自动加载驱动程序,则本文中的信息适用于你。

什么是 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 所必需的。

在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 类(如音频、蓝牙等),并且需要自定义驱动程序。 如果你的设备是 WinUSB 设备,则很可能该设备不属于 USB 类。 因此,设备必须安装在“USBDevice”安装类下。 更新的 Winusb.inf 有助于满足该要求。

关于使用 USBDevice 类

不要对未分类的设备使用“USB”安装类。 该类保留用于安装控制器、中心和复合设备。 误用“USB”类可能会导致严重的可靠性和性能问题。 对于未分类的设备,请使用“USBDevice”。

在 Windows 8,若要使用“USBDevice”设备类,只需将此添加到 INF:

[Version]
  ...
  Class=USBDevice
  ClassGuid={88BAE032-5A81-49f0-BC3D-A4FF138216D6}
  ...

在设备管理器你将看到一个新节点 USB 通用串行总线设备,并且你的设备显示在该节点下。

在 Windows 7 中,除了上述行外,还需要在 INF 中创建以下注册表设置:

;---------- Add Registry Section ----------
  [USBDeviceClassReg]
  HKR,,,,"Universal Serial Bus devices"
  HKR,,NoInstallClass,,1
  HKR,,SilentInstall,,1
  HKR,,IconPath,%REG_MULTI_SZ%,"%systemroot%\system32\setupapi.dll,-20"

在设备管理器中,你将看到设备显示在 USB 通用串行总线设备下。 但是,设备类说明派生自 INF 中指定的注册表设置。

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

在设备枚举期间,USB 驱动程序堆栈从设备读取兼容 ID。 如果兼容 ID 为“WINUSB”,则 Windows 将其用作设备标识符,并在更新的内置 Winusb.inf 中查找匹配项,然后加载 Winusb.sys 作为设备的函数驱动程序。

此映像适用于定义为 WinUSB 设备的单个接口 MUTT 设备,因此 Winusb.sys 加载为设备的函数驱动程序。

88fd0665dd3446d4a898422557f667eb.png

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

如何更改 WinUSB 设备的设备说明

对于 WinUSB 设备,设备管理器显示“WinUsb 设备”作为设备说明。 该字符串派生自 Winusb.inf。 如果有多个 WinUSB 设备,则所有设备都会获得相同的设备说明。

为了在 设备管理器 中唯一标识和区分设备,Windows 8在设备类上提供一个新属性,该属性指示系统在其 iProduct 字符串描述符) 中将设备描述 (报告的设备说明优先于 INF 中的说明。 Windows 8 中定义的“USBDevice”类将设置此属性。 换句话说,当设备安装在“USBDevice”类下时,系统会查询设备以获取设备说明,并将设备管理器字符串设置为查询中检索到的任何内容。 在这种情况下,将忽略 INF 中提供的设备说明。 请注意上图中的设备说明字符串:“MUTT”。 字符串由 USB 设备在其产品字符串描述符中提供。

早期版本的 Windows 不支持新的类属性。 若要在早期版本的 Windows 上获得自定义设备说明,必须编写自己的自定义 INF。

如何配置 WinUSB 设备

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

支持扩展功能描述符

为了使 USB 驱动程序堆栈知道设备支持扩展功能描述符,设备必须定义存储在字符串索引0xEE的 OS 字符串描述符。 在枚举期间,驱动程序堆栈会查询字符串描述符。 如果描述符存在,则驱动程序堆栈假定设备包含一个或多个 OS 功能描述符以及检索这些功能描述符所需的数据。

检索到的字符串描述符具有 bMS_VendorCode 字段值。 值指示 USB 驱动程序堆栈必须用于检索扩展功能描述符的供应商代码。

设置兼容 ID

扩展的兼容 ID OS 功能描述符,用于匹配内置 Winusb.inf 并加载 WinUSB 驱动程序模块。

扩展的兼容 ID OS 功能描述符包括标头部分,后跟一个或多个功能部分,具体取决于设备是复合设备还是非复合设备。 标头部分指定整个描述符的长度、函数节数和版本号。 对于非复合设备,标头后跟一个与设备的唯一接口关联的函数部分。 该部分的 compatibleID 字段必须指定“WINUSB”作为字段值。 对于复合设备,有多个功能部分。 每个函数节的 compatibleID 字段必须指定“WINUSB”。

注册设备接口 GUID

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

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

扩展属性 OS 功能描述符包括标头部分,后跟一个或多个自定义属性节。 标头部分描述整个扩展属性描述符,包括其总长度、版本号和自定义属性节数。 若要注册设备接口 GUID,请添加自定义属性部分,将 bPropertyName 字段设置为“DeviceInterfaceGUID”, 并将 wPropertyNameLength 设置为 40 字节。 使用 GUID 生成器生成唯一的设备接口 GUID,并将 bPropertyData 字段设置为该 GUID,例如“{8FE6D4D7-49DD-41E7-9486-49AFC6BFE475}”。 GUID 指定为 Unicode 字符串,字符串的长度为 78 字节, (包括 null 终止符) 。

b80c904f39ad4d13b06a4a460789ea11.png
在设备枚举期间,USB 驱动程序堆栈随后从扩展属性 OS 功能描述符中检索 DeviceInterfaceGUID 值,并在设备的硬件密钥中注册设备。 应用程序可以使用 SetupDiXxx API 检索值 (请参阅 SetupDiOpenDevRegKey) 。 

启用或禁用 WinUSB 电源管理功能

在Windows 8之前,若要配置 WinUSB 的电源管理功能,必须在 HW 中编写注册表项值。自定义 INF 的 AddReg 部分。

在Windows 8及更高版本中,可以在设备中指定电源设置。 可以通过扩展属性 OS 功能描述符报告值,这些描述符在 WinUSB 中为该设备启用或禁用功能。 可以配置两个功能:选择性挂起和系统唤醒。 选择性挂起允许设备在空闲时进入低功耗状态。 系统唤醒是指设备在系统处于低功耗状态时唤醒系统的能力。

fbcfa64f83c04f669245f7ca1f11b2c7.png

例如,若要在设备上启用选择性挂起,请添加一个自定义属性部分,用于将 bPropertyName 字段设置为 Unicode 字符串“DeviceIdleEnabled”和 wPropertyNameLength 为 36 字节。 将 bPropertyData 字段设置为“0x00000001”。 属性值存储为小字节序 32 位整数。

在枚举期间,USB 驱动程序堆栈读取扩展属性功能描述符,并在此项下创建注册表项:

\ HKEY_LOCAL_MACHINE系统\CurrentControlSet\枚举\Usb\<设备标识符>\<实例标识符>\设备参数

此图显示了 WinUSB 设备的示例设置。

b2ec5054ff4e49178baf07c318743b27.png

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值