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 「解説」を参照してください。

こちらもご覧ください

EvtDeviceWdmIrpPreprocess