WBDI ドライバーでの WinUSB の使用
Microsoft では、WBDI ドライバーでは、ユーザー モード ドライバー フレームワーク (UMDF) に組み込まれている USB I/Oターゲット を使用することをお勧めします。
UmdfDispatcher の設定
UMDF ドライバーをインストールする INF ファイルには、WDF 固有の DDInstall セクションが含まれている必要があります。 UMDF で USB I/O ターゲットを使用する場合は、この DDInstall セクション内で UmdfDispatcher レジストリ ディレクティブを設定する必要があります。
WudfBioUsbSampleタグの サンプルの WudfBioUsbSample.inx の次のセクションは、このディレクティブを設定する方法を示しています。
[Biometric_Install.NT.Wdf]
KmdfService=WINUSB, WinUsb_Install
UmdfDispatcher=WinUsb
UmdfService=WudfBioUsbSample, WudfBioUsbSample_Install
UmdfServiceOrder=WudfBioUsbSample
UmdfDispatcher の詳細については、UmdfDispatcher INF ディレクティブの指定を参照してください。 WDF レジストリ ディレクティブの一般的な情報については、WDF ディレクティブの指定を参照してください。
保留中の非同期読み取りリクエスト
WinUsb は、複数の未処理の読み取り要求を処理できます。 スキャン中の読み取り操作間の遅延を最小限に抑える必要があるデバイスでは、ある程度の数の未処理の非同期読み取り要求を保留にしておく必要があります。 ドライバーが非同期要求を行う場合、WinUsb は、以前の読み取り要求の完了ルーチンのためにユーザー モードに戻る前に、これらの要求を発行します。
読み取り要求を保留する方法のコード例については、WudfBioUsbSample のDevice.cppの CBiometricDevice::InitiatePendingRead
メソッドを参照できます。
読み取りリクエストを保留するコードは、次のステップのループである必要があります。
IWDFDriver::CreatePreallocatedWdfMemoryを呼び出して、事前割り当てフレームワーク メモリ オブジェクトを作成します。
OnCompletion ルーチンでコールバック コードを指定します。 サンプルの
CBiometricDevice::OnCompletion
を参照してください。所有するオブジェクトの IRequestCallbackRequestCompletionインターフェイスへのポインターを取得します。
コールバック関数を登録するには、WDFIoRequest::SetCompletionCallbackを呼び出し、前の手順で取得した IRequestCallbackRequestCompletionへのポインターを渡します。 フレームワークは、I/O リクエストが完了するとコールバックを呼び出すようになります。
IWDFIoRequest::Send を呼び出して、読み取り要求をデバイスに送信します。
コールバック完了時に読み取りリクエストを処理します。 OnCompletion ルーチンは、新しい保留中の読み取り要求を開始する前に、I/O ターゲットの状態を確認する必要があります。 これを行うには、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 セレクティブ サスペンド をサポートする必要があります。
システム ウェイクとデバイス アイドルをサポートするデバイスでは、WudfBioUsbSample.inx のコード例に示すように、WinUsb でセレクティブ サスペンドのレジストリ設定を有効にする必要があります:
HKR,,"SystemWakeEnabled",0x00010001,1
HKR,,"DeviceIdleEnabled",0x00010001,1
オペレーティング システムの USB スタックは、システムのウェイクアップとドライバーがデバイスからの読み取りを開始できるタイミングの間のタイミングを保証できません。
理想的には、システムが一時停止されたときにデバイスをスキャンをキャプチャできる状態にしておく必要があります。 システムの一時停止中にスキャンが発生した場合、デバイスは指紋スキャン全体の入力データをキャッシュする必要があります。 システムが起動すると、ドライバーはデバイスからデータを読み取ります。 このシナリオをサポートすることで、システムのウェイクアップとロック解除/ログインのシナリオを有効にすることができます。