从用户模式服务与 GenericUSBFn.sys 通信

所有用户模式请求都发送到 Microsoft 提供的内核模式驱动程序 GenericUSBFn.sys。 可以通过将这些 I/O 控制 (代码发送到 IOCTL) 来创建与 GenericUSBFn.sys 通信的用户模式服务,GenericUSBFn.sys 处理与 USB 函数驱动程序的内核模式通信。

Genericusbfnioctl.h 中声明的 IOCTL 用于与来自用户模式服务的 GenericUSBFn.sys 通信。

以下步骤介绍如何定义与 GenericUSBFn.sys 交互以与 USB 功能驱动程序通信的 USB 接口服务:

  1. 启动时,服务将侦听接口的设备接口到达。 设备接口 GUID 是 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\USBFN\Interfaces OEM 定义的子项下在注册表中声明的 InterfaceGUID 值。 有两种常见的方法来侦听设备到达:
    • 触发器启动服务。 有关详细信息,请参阅服务触发器事件。
    • 注册设备接口到达。 有关详细信息,请参阅 CM_Register_Notification 函数。
  2. 接口到达后,服务会打开设备的句柄:
    • 通过调用 CM_Get_Device_Interface_List 函数获取设备的符号名称。 指定在注册表的 InterfaceGUID 值中声明的设备接口 GUID。
    • 获得设备的符号名称后,使用 CreateFile 打开设备的句柄。
  3. 服务发出IOCTL_GENERICUSBFN_GET_CLASS_INFO,以检索有关可用管道的信息,如注册表中配置的那样。
  4. 服务准备好进行通信后,会发出IOCTL_GENERICUSBFN_ACTIVATE_USB_BUS。 激活所有类驱动程序后,USB 函数类扩展可以连接到主机。
  5. 为了接收 USB 通知,该服务会发出IOCTL_GENERICUSBFN_BUS_EVENT_NOTIFICATION。 当发生新的 USB 事件时,此 IOCTL 完成。 特别感兴趣的事件 (USBFN_EVENT) 包括:
  6. UsbfnEventReset:用于确定连接的 USB 设备的速度。
  7. UsbfnEventConfigured:服务现在可以发出传输请求。
  8. UsbfnEventSetupPacket:USB 函数类扩展已收到特定于接口的设置数据包 (bmRequestType.Type == BMREQUEST_CLASS) 。 服务应通过在管道 0 中发出传输请求来回复设置数据包,然后发出在管道 0 上的相反方向 (IOCTL_GENERICUSBFN_CONTROL_STATUS_HANDSHAKE_OUT) 握手请求。
  9. 收到 UsbfnEventConfigured 事件后,服务可以使用IOCTL_GENERICUSBFN_TRANSFER_IN、IOCTL_GENERICUSBFN_TRANSFER_IN_APPEND_ZERO_PKT和IOCTL_GENERICUSBFN_TRANSFER_OUT开始发出传输请求。