在 WBDI 驱动程序中使用 WinUSB

Microsoft 建议 WBDI 驱动程序使用内置于 User-Mode Driver Framework (UMDF) 的 USB I/O 目标

设置 UmdfDispatcher

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

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

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

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

挂起的异步读取请求

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

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

用于写入读取请求的代码应是以下步骤的循环:

  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 堆栈无法保证系统唤醒与驱动程序何时可以从设备开始读取之间的计时。

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