次の方法で共有


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);