配置 Usbccgp.sys 以选择非默认 USB 配置

本文提供有关注册表设置的信息,这些设置配置 Usbccgp.sys 选择 USB 配置的方式。 本主题还介绍了 Usbccgp.sys 如何处理由控制复合设备功能之一的客户端驱动程序发送的选择配置请求。

USB 复合设备由单个 USB 设备中的多个功能(功能设备)组成。 如果Windows为复合设备加载Microsoft提供的USB通用父驱动程序(Usbccgp.sys),从那时起,Usbccgp.sys 负责选择设备的配置。 复合设备的每个接口或接口集合在许多方面都是,例如具有其自己的物理设备对象(PDO)的单独设备。 重置设备的配置会更改设备的所有接口的配置,而不仅仅是客户端驱动程序控制的配置。 操作系统不允许这样做。 因此,控制一组接口或复合设备的接口集合的客户端驱动程序无法更改最初由 Usbccgp.sys设置的配置。

但是,在 Windows Vista 和更高版本的 Windows 中,可以添加以下注册表值来指定要选择的配置:

注册表项 类型 价值 默认值
OriginalConfigurationValue(原始配置值) REG_DWORD USB 配置索引。 Usbccgp.sys 先使用 OriginalConfigurationValue 进行选择配置请求。 0
AltConfigurationValue REG_DWORD 如果 OriginalConfigurationValue 的选择配置请求失败,要使用的配置索引。 0

注释

默认情况下,上述注册表设置不存在。 必须在 USB 设备 的硬件(即“设备”)密钥 下添加它们。

注册表设置允许 CCGP 驱动程序选择备用配置。

上表中所述的注册表值对应于 USB 定义的配置索引,由配置描述符 (USB_CONFIGURATION_DESCRIPTOR) 的 bConfigurationValue 成员指示,而不是由设备配置描述符中报告的 bConfigurationNum 值指示。 首先,Usbccgp.sys 使用 OriginalConfigurationValue 指定的 USB 配置索引将选择配置请求发送到父 USB 总线驱动程序(Usbhub.sys)。 如果该请求失败,Usbccgp.sys 尝试使用 AlternateConfigurationValue 中指定的值。 如果 AlternateConfigurationValue 或 OriginalConfigurationValue 无效,则 Usbccgp.sys 使用默认值。

由于多种原因,选择配置请求可能会失败。 当设备未正确响应请求或 bMaxPower 值(请求的配置所需的电源)超过中心端口支持的电源值时,最常见的故障会发生。 例如,特定配置的 bMaxPower (由 OriginalConfigurationValue 指定)为 100 毫秒,但中心端口只能提供 50 毫秒。 当 Usbccgp.sys 为该配置发送选择配置请求时,USB 驱动程序堆栈(特别是 USB 端口驱动程序)将失败请求。 然后,Usbccgp.sys 指定 AltConfigurationValue 所指示的配置,再发送另一个选择配置请求。 如果备用配置需要 50 毫秒或更少,并且不会发生其他问题,则选择配置请求将成功完成。

兼容性功能

即使复合设备中函数的客户端驱动程序无法选择复合设备的配置,客户端驱动程序仍可向 Usbccgp.sys发送选择配置请求。 有关如何生成该请求的信息,请参阅 如何为 USB 设备选择配置。 Usbccgp.sys 从客户端驱动程序接收选择配置请求后执行以下任务:

  1. 使用 USB 端口驱动程序用于验证任何选择配置请求所用的相同条件来验证收到的请求。
  2. 如果请求中指定的接口和管道设置与当前设置不同,Usbccgp.sys 将通过发送一个 URB_FUNCTION_SELECT_INTERFACE 类型的 URB 发出选择接口请求,以将现有设置更改为新的接口和管道设置。
  3. USBD_INTERFACE_INFORMATIONUSBD_PIPE_INFORMATION 结构的缓存内容复制到 URB 中。
  4. 完成 URB。