WBDI ドライバーでのキューの管理
WBDI ドライバーは、サービスからの複数の同時要求を処理するために、少なくとも 1 つのキューを作成する必要があります。 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 ハンドラーを提供します。 これは、IQueueCallbackDeviceIoControl::OnDeviceIoControl前に CreateIoQueue の呼び出しで "unknown" パラメーターの一部であるタグを挿入 メソッドで行います。
未処理の IOCTL_BIOMETRIC_CAPTURE_DATA 要求は一度に 1 つだけです。 ドライバーは、保留中の要求へのポインターを内部的に保持するか、別のフレームワーク キューを使用してそれらの要求を処理することによって、IOCTL_BIOMETRIC_CAPTURE_DATA 要求を追跡する必要があります。
サンプルでは、保留中の I/O リクエストがある場合、Device.h で定義されているように、リクエストへのポインターを CBiometricDevice クラスのメンバーに保持します:
IWDFIoRequest *m_PendingRequest;
1 つのセンサー データ収集 I/O が保留されている間、それ以降のデータ収集 IOCTL の呼び出しは失敗します:
FxRequest->Complete(WINBIO_E_DATA_COLLECTION_IN_PROGRESS);
キャプチャ要求が完了または取り消されると、この値は NULL に設定されます。
IWDFIoRequest *FxRequest = (IWDFIoRequest *)InterlockedExchangePointer((PVOID *)&m_PendingRequest, NULL);