在 WBDI 驱动程序中使用 WinUSB

Microsoft 建议 WBDI 驱动程序使用内置于用户模式驱动程序框架 (UMDF) 中的 USB I/O 目标

设置 UmdfDispatcher

安装 UMDF 驱动程序的 INF 文件必须包含特定于 WDF 的 DDInstall 部分。 如果在 UMDF 中使用 USB I/O 目标,则必须在此 DDInstall 部分中设置 UmdfDispatcher 注册表指令。

WudfBioUsbSample 示例中的以下部分演示了如何设置此指令:

[Biometric_Install.NT.Wdf]
KmdfService=WINUSB, WinUsb_Install
UmdfDispatcher=WinUsb
UmdfService=WudfBioUsbSample, WudfBioUsbSample_Install
UmdfServiceOrder=WudfBioUsbSample

有关 UmdfDispatcher 的特定信息,请参阅指定 UmdfDispatcher INF 指令。 有关 WDF 注册表指令的一般信息,请参阅指定 WDF 指令

挂起的异步读取请求

WinUsb 可以处理多个未完成的读取请求。 扫描期间需要最小延迟的读取操作的设备应保留一些未完成的异步读取请求挂起。 如果驱动程序发出异步请求,WinUsb 会在将请求转移到用户模式之前发出这些请求,以处理早期读取请求的完成例程。

可以参考 WudfBioUsbSample 的 Device.cpp 中的 CBiometricDevice::InitiatePendingRead 方法,查看有关如何编写读取请求的代码示例。

挂起读取请求的代码应该是以下步骤的循环:

  1. 通过调用 IWDFDriver::CreatePreallocatedWdfMemory 创建预分配的框架内存对象。

  2. OnCompletion 提供回调代码。 请参阅示例中的 CBiometricDevice::OnCompletion

  3. 获取指向拥有对象的 IRequestCallbackRequestCompletion 接口的指针。

  4. 通过调用 IWDFIoRequest::SetCompletionCallback 并传入指向上一步中获取的 IRequestCallbackRequestCompletion 的指针,注册回调函数。 框架现在将在 I/O 请求完成时调用回调。

  5. 调用 IWDFIoRequest::Send 以将读取请求发送到设备。

  6. 在回调完成时处理读取请求。 在 OnCompletion 例程启动新的挂起读取请求之前,应检查 I/O 目标的状态。 为此,请查询 IWDFUsbTargetPipe,以获取指向其 IWDFIoTargetStateManagement 接口的指针。 然后调用 IWDFIoTargetStateManagement::GetState

    IWDFIoTarget * pTarget
    IWDFIoTargetStateManagement * pStateMgmt = NULL;
    WDF_IO_TARGET_STATE state;
    
    HRESULT hrQI = pTarget->QueryInterface(IID_PPV_ARGS(&pStateMgmt));
    WUDF_TEST_DRIVER_ASSERT((SUCCEEDED(hrQI) && pStateMgmt));
    
    state = pStateMgmt->GetState();
    

扫描完成后,取消任何挂起的读取请求。

如果使用 UMDF-USB 目标,则可以允许读取请求在停电和通电时保持挂起状态。

如果未使用 UMDF-USB 目标,驱动程序应停止在 D0Exit 处发送挂起的读取请求,并在 D0Entry 重新启动。

选择性暂停

WBDI 驱动程序应支持 USB 选择性挂起

支持系统唤醒和设备空闲的设备应为 WinUsb 中的选择性挂起启用注册表设置,如来自 WudfBioUsbSample.inx 的此代码示例所示:

HKR,,"SystemWakeEnabled",0x00010001,1
HKR,,"DeviceIdleEnabled",0x00010001,1

操作系统 USB 堆栈无法保证系统唤醒和驱动程序何时可以开始从设备读取。

理想情况下,当系统暂停时,设备应处于准备好捕获扫描的状态。 如果系统暂停时发生扫描,设备应缓存整个指纹扫描的输入数据。 当系统唤醒时,驱动程序随后从设备读取数据。 通过支持此方案,可以启用系统唤醒和解锁/登录方案。