在 WBDI 驱动程序中使用 WinUSB

Microsoft 建议 WBDI 驱动程序使用内置于 UMDF 驱动程序框架User-Mode U 盘 (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 堆栈无法保证系统唤醒和驱动程序何时可以开始从设备读取数据之间的计时。

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