EVT_WDF_IO_IN_CALLER_CONTEXT コールバック関数 (wdfdevice.h)
[KMDF にのみ適用]
ドライバーの EvtIoInCallerContext イベント コールバック関数は、フレームワークが I/O キューに配置する前に、I/O 要求を前処理します。
構文
EVT_WDF_IO_IN_CALLER_CONTEXT EvtWdfIoInCallerContext;
void EvtWdfIoInCallerContext(
[in] WDFDEVICE Device,
[in] WDFREQUEST Request
)
{...}
パラメーター
[in] Device
フレームワーク デバイス オブジェクトへのハンドル。
[in] Request
フレームワーク要求オブジェクトへのハンドル。
戻り値
なし
解説
フレームワークは、ドライバーの EvtIoInCallerContext コールバック関数を呼び出して、フレームワークが I/O キューに配置する前に、ドライバーが各 I/O 要求を調べ、場合によっては要求に対して事前処理を実行できるようにします。 デバイスの EvtIoInCallerContext コールバック関数を登録するために、ドライバーは WdfDeviceInitSetIoInCallerContextCallback を呼び出します。
ドライバーがデバイスの EvtIoInCallerContext コールバック関数を登録する場合、フレームワークは、デバイスの I/O 要求を受信するたびにコールバック関数を呼び出します。 コールバック関数は、ドライバーに I/O 要求を送信したプロセスのスレッド コンテキストで呼び出されます。 このプロセスは、次のレベルのドライバーであるか、ドライバーがドライバー スタックの上部にある場合は、ユーザー モード アプリケーションです。
このコールバック関数の主な目的は、フレームワーク ベースのドライバーが、 バッファーされた I/O と直接 I/O のどちらも呼び出されていないバッファー アクセス メソッドをサポートできるようにすることです。 このバッファー アクセス メソッドの場合、ドライバーは、発信元のプロセス コンテキストで受信したバッファーにアクセスする必要があります。
コールバック関数は、要求のバッファーを取得した後、バッファー アドレスまたはハンドルを要求オブジェクトのコンテキスト ストレージに格納できます。 (ドライバーは 、WdfDeviceInitSetRequestAttributes を呼び出して、要求オブジェクトのコンテキスト記憶域のサイズを設定します)。
要求はまだ I/O キューに属していないため、フレームワークは要求をロックまたは同期しません。 ドライバーは、必要な同期を行う必要があります。 同期の詳細については、「 Framework-Based ドライバーの同期手法」を参照してください。
コールバック関数が要求の前処理を完了したら、 WdfDeviceEnqueueRequest を呼び出してキューに入れるか、 WdfRequestComplete を呼び出して完了する必要があります (エラーが検出された場合)。
EvtIoInCallerContext コールバック関数の詳細については、「キューに入れる前に I/O 要求をインターセプトする」および「Framework-Based ドライバーでのデータ バッファーへのアクセス」を参照してください。
ドライバーが 転送の保証された進行状況をサポートするように I/O キューを構成している場合、フレームワークはメモリ不足の状況でドライバーの EvtIoInCallerContext コールバック関数を呼び出さない可能性があります。 フレームワークの予約済み要求オブジェクトがすべて使用されている場合、フレームワークは予約済み要求オブジェクトが使用可能になるまで I/O 要求の処理を延期します。 この状況では、予約済み要求オブジェクトが使用可能になると、I/O 要求をドライバーに送信したプロセスのスレッド コンテキストでフレームワークが実行されなくなるため、延期された I/O 要求に対して、フレームワークは EvtIoInCallerContext コールバック関数を呼び出すことができません。
EvtIoInCallerContext コールバック関数は、呼び出し元スレッドの IRQL で呼び出されます。 呼び出し元のスレッドがユーザー モード アプリケーションからの場合、コールバック関数は IRQL = PASSIVE_LEVELで呼び出されます。 呼び出し元のスレッドが高レベルのカーネル モード ドライバーからの場合、コールバック関数と上位レベルドライバーの両方が IRQL = DISPATCH_LEVELで要求を渡すように設計されている場合、ドライバーの EvtIoInCallerContext コールバック関数は IRQL <<= DISPATCH_LEVEL で呼び出すことができます。
要件
要件 | 値 |
---|---|
対象プラットフォーム | ユニバーサル |
最小 KMDF バージョン | 1.0 |
Header | wdfdevice.h (Wdf.h を含む) |
IRQL | 「解説」を参照してください。 |