WBDI 드라이버에서 큐 관리

WBDI 드라이버는 서비스에서 여러 동시 요청을 처리하기 위해 하나 이상의 큐를 만들어야 합니다. UMDF를 사용하는 경우 큐 관리 지원을 활용할 수 있습니다.

WudfBioUsbSample에서 CBiometricIoQueue 클래스는 I/O 큐 인터페이스를 구현합니다.

특히 이 메서드 CBiometricIoQueue::Initialize에서 드라이버는 소유 CBiometricIoQueue 개체를 쿼리하여 프레임워크가 드라이버가 큐에서 구독하는 이벤트 콜백 함수를 결정하는 데 사용하는 IQueueCallbackDeviceIoControl 인터페이스에 대한 포인터를 쿼리합니다.

if (SUCCEEDED(hr)) 
{
hr = this->QueryInterface(__uuidof(IUnknown), (void **)&unknown);
}

그런 다음 드라이버는 IWDFDevice::CreateIoQueue를 호출하여 기본 I/O 큐를 구성합니다.

hr = FxDevice->CreateIoQueue(unknown,
FALSE,
WdfIoQueueDispatchParallel,
FALSE,
FALSE,
&fxQueue);
BiometricSafeRelease(unknown);

호출은 WdfIoQueueDispatchParallel을 지정하므로 프레임워크는 요청을 사용할 수 있는 즉시 드라이버의 I/O 큐 콜백 함수에 요청을 표시합니다.

다음으로 드라이버는 IWDFDevice::ConfigureRequestDispatching을 호출 하여 모든 디바이스 I/O 요청을 필터링하도록 큐를 구성합니다.

hr = FxDevice->ConfigureRequestDispatching(fxQueue,
WdfRequestDeviceIoControl,
TRUE);

드라이버는 이 호출에서 WdfRequestDeviceIoControl을 지정하므로 프레임워크에서 I/O 알림을 처리하는 OnDeviceIoControl 처리기를 제공합니다. 이 작업은 이전에 CreateIoQueue 호출에서 "알 수 없는" 매개 변수의 일부인 IQueueCallbackDeviceIoControl::OnDeviceIoControl 메서드에서 수행합니다.

한 번에 하나의 미해결 IOCTL_BIOMETRIC_CAPTURE_DATA 요청만 있을 수 있습니다. 드라이버는 보류 중인 요청에 대한 포인터를 내부적으로 유지하거나 다른 프레임워크 큐를 사용하여 해당 요청을 처리하여 IOCTL_BIOMETRIC_CAPTURE_DATA 요청을 추적해야 합니다.

샘플에서 보류 중인 I/O 요청이 있는 경우 샘플은 Device.h에 정의된 대로 CBiometricDevice 클래스의 멤버에서 요청에 대한 포인터를 유지 관리합니다.

IWDFIoRequest *m_PendingRequest;

하나의 센서 데이터 수집 I/O가 보류 중인 동안 데이터 수집 IOCTL에 대한 후속 호출은 실패해야 합니다.

FxRequest->Complete(WINBIO_E_DATA_COLLECTION_IN_PROGRESS);

캡처 요청이 완료되거나 취소되면 이 값은 NULL설정됩니다.

IWDFIoRequest *FxRequest = (IWDFIoRequest *)InterlockedExchangePointer((PVOID *)&m_PendingRequest, NULL);