WdfIoQueueDrain 関数 (wdfio.h)
[KMDF と UMDF に適用]
WdfIoQueueDrain メソッドを使用すると、フレームワークは I/O キューへの I/O 要求のキューを停止しながら、既にキューに登録されている要求の配信と処理を許可します。
構文
void WdfIoQueueDrain(
[in] WDFQUEUE Queue,
[in, optional] PFN_WDF_IO_QUEUE_STATE DrainComplete,
[in, optional] WDFCONTEXT Context
);
パラメーター
[in] Queue
フレームワーク キュー オブジェクトへのハンドル。
[in, optional] DrainComplete
ドライバー提供の EvtIoQueueState コールバック関数へのポインター。 このパラメーターは省略可能であり、 NULL にすることができます。
[in, optional] Context
フレームワークが EvtIoQueueState コールバック関数に渡すドライバー提供のコンテキスト情報への型指定されていないポインター。 このパラメーターは省略可能であり、 NULL にすることができます。
戻り値
なし
解説
ドライバーが無効なオブジェクト ハンドルを提供すると、バグ チェックが発生します。
ドライバーが WdfIoQueueDrain を呼び出した後、フレームワークは指定されたキューへの I/O 要求の追加を停止します。 フレームワークがキューに対する追加の要求を受け取った場合、完了状態の値STATUS_INVALID_DEVICE_STATEで完了します。
ドライバーが EvtIoQueueState コールバック関数を提供する場合、ドライバーに配信されたすべての要求が完了または取り消された後、フレームワークによって呼び出されます。 キュー作成時に WDF_OBJECT_ATTRIBUTES でExecutionLevel を指定することで、コールバックが実行される IRQL を変更できます。 詳細については、EVT_WDF_IO_QUEUE_STATEの「解説」セクションを参照してください。
ドライバーは、フレームワークが EvtIoQueueState を呼び出す前に、キューの状態を変更する別のメソッド (WdfIoQueuePurge や WdfIoQueueStart など) を呼び出さないでください。
ドライバーが DrainComplete に NULL を指定した場合、ドライバーは要求が完了する前に別の状態変更操作を呼び出すことができます。
ベスト プラクティスとして、キューの保留中の I/O 要求がタイムリーに完了すると確信している場合にのみ 、WdfIoQueueDrain を呼び出す必要があります。 それ以外の場合は、 WdfIoQueuePurge を使用します。 詳細については、「 I/O キューの管理」を参照してください。
ドライバーは、I/O キューをドレインした後、 WdfIoQueueStart を呼び出すことによってキューを再起動できます。
例
次のコード例では、ドライバーに配信されたすべての要求が完了または取り消されたときに、I/O キューをドレインし、ドライバーの EvtIoQueueDrainComplete 関数を呼び出します。
WdfIoQueueDrain(
Queue,
EvtIoQueueDrainComplete,
(WDFCONTEXT) myQueueContext
);
要件
要件 | 値 |
---|---|
対象プラットフォーム | ユニバーサル |
最小 KMDF バージョン | 1.0 |
最小 UMDF バージョン | 2.0 |
Header | wdfio.h (Wdf.h を含む) |
Library | Wdf01000.sys (KMDF);WUDFx02000.dll (UMDF) |
IRQL | <= DISPATCH_LEVEL |
DDI コンプライアンス規則 | ChangeQueueState(kmdf)、 DriverCreate(kmdf)、 EvtSurpriseRemoveNoSuspendQueue(kmdf)、 KmdfIrql(kmdf)、 KmdfIrql2(kmdf)、KmdfIrqlExplicit(kmdf)、 NoCancelFromEvtSurpriseRemove(kmdf) |