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


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

Корпорация Майкрософт рекомендует использовать драйверы 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 см. в разделе Указание директивы UmdfDispatcher INF. Общую информацию о директивах реестра 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 не используется, драйвер должен прекратить отправку ожидающих запросов на чтение при выходе из D0 и возобновить их при входе в D0.

выборочная приостановка

Драйвер WBDI должен поддерживать выборочной приостановки USB-.

Устройство, которое поддерживает системное пробуждение и режим простоя, должно активировать настройки реестра для выборочной приостановки в WinUsb, как показано в этом примере кода из WudfBioUsbSample.inx:

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

Стек USB операционной системы не может гарантировать временной промежуток между пробуждением системы и моментом, когда драйвер может начать чтение с устройства.

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