Поделиться через


Использование WinUSB в драйвере WBDI

Корпорация Майкрософт рекомендует использовать целевой объект ввода-вывода USB , встроенный в платформу User-Mode Driver Framework (UMDF).

Настройка UmdfDispatcher

INF-файл, устанавливающий драйвер UMDF, должен содержать раздел DDInstall для WDF. Если вы используете целевой объект ввода-вывода USB в UMDF, необходимо задать директиву реестра UmdfDispatcher в этом разделе DDInstall .

В следующем разделе wudfBioUsbSample.inx в примере WudfBioUsbSample показано, как задать эту директиву:

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

Дополнительные сведения о UmdfDispatcher см. в разделе Указание директивы INF UmdfDispatcher. Общие сведения о директивах реестра WDF см. в разделе Указание директив WDF.

Ожидающие асинхронные запросы на чтение

WinUsb может обрабатывать несколько незавершенных запросов на чтение. Устройства, которым требуется минимальная задержка между операциями чтения во время сканирования, должны поддерживать некоторое количество ожидающих асинхронных запросов на чтение. Если драйвер выполняет асинхронные запросы, WinUsb выдает эти запросы перед возвратом в пользовательский режим для подпрограмм завершения предыдущих запросов на чтение.

Вы можете обратиться к методу CBiometricDevice::InitiatePendingRead в Device.cpp в WudfBioUsbSample , чтобы увидеть пример кода, как выполнить запрос на чтение.

Код для выполнения запроса на чтение должен быть циклом из следующих шагов:

  1. Создайте предварительно выделенный объект памяти платформы, вызвав IWDFDriver::CreatePreallocatedWdfMemory.

  2. Укажите код обратного вызова в подпрограмме OnCompletion . См. CBiometricDevice::OnCompletion в примере.

  3. Получите указатель на интерфейс IRequestCallbackRequestCompletion объекта-владеющего объекта.

  4. Зарегистрируйте функцию обратного вызова, вызвав IWDFIoRequest::SetCompletionCallback и передав указатель на IRequestCallbackRequestCompletion , полученный на предыдущем шаге. Платформа теперь будет вызывать обратный вызов по завершении запроса ввода-вывода.

  5. Вызовите IWDFIoRequest::Send , чтобы отправить запрос на чтение на устройство.

  6. Обработка запроса на чтение при завершении обратного вызова. Прежде чем подпрограмма OnCompletion инициирует новый ожидающий запрос на чтение, она должна проверка состояние целевого объекта ввода-вывода. Для этого запросите 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-стек операционной системы не может гарантировать время между пробуждением системы и началом чтения с устройства.

В идеале устройство должно оставаться в состоянии , готовом для записи сканирования, когда система приостановлена. Если проверка выполняется во время приостановки системы, устройство должно кэшировать входные данные для всего сканирования отпечатков пальцев. После пробуждения системы драйвер считывает данные с устройства. Поддерживая этот сценарий, можно включить сценарии пробуждения системы, разблокировки и входа в систему.