次の方法で共有


RX_CONTEXT と IRP 管理

RX_CONTEXT 構造体は、RDBSS およびネットワーク ミニ リダイレクターが I/O 要求パケット (IRP) を管理するために使用する基本的なデータ構造の 1 つです。 RX_CONTEXT構造体は、処理中の IRP を記述し、IRP の完了時にグローバル リソースを解放できるようにする状態情報を含みます。 RX_CONTEXT データ構造は、RDBSS、ネットワーク ミニ リダイレクター、およびファイル システムで使用する IRP をカプセル化します。 RX_CONTEXT 構造体には、1 つの IRP へのポインターと、IRP を処理するために必要なすべてのコンテキストが含まれます。

RX_CONTEXT 構造体は、Windows Driver Kit (WDK) ヘッダー ファイルの IRP コンテキストまたは RxContext と呼ばれることもあります。また、ネットワーク ミニ リダイレクター ドライバーの開発に使用されるその他のリソースとも呼ばれます。

RX_CONTEXT は、さまざまなネットワーク ミニ リダイレクターによって提供される追加情報がアタッチされるデータ構造です。 設計の観点から、この追加情報は、次のいずれかの方法で処理できます。

  • コンテキスト ポインターを RX_CONTEXT の一部として定義できるようにします。このコンテキスト ポインターは、ネットワーク ミニ リダイレクターが情報を保存するために使用します。 これは、RX_CONTEXT 構造体が割り当てられ破棄されるたびに、ネットワーク ミニ リダイレクター ドライバーは、追加のネットワーク ミニ リダイレクター情報を含むメモリ ブロックの個別の割り当てまたは破棄を実行する必要があることを意味します。 RX_CONTEXT 構造体は大量に作成および破棄されるため、これはパフォーマンスの観点からは許容できるソリューションではありません。

  • もう 1 つの方法は、各 RX_CONTEXT 構造体のサイズを、各ネットワーク ミニ リダイレクターに対して事前に指定された量で割り当てることで構成され、ミニ リダイレクターで使用するために予約されます。 このような方法では、追加の割り当てと破棄を回避しますが、RDBSS の RX_CONTEXT 管理コードが複雑になります。

  • 3 番目の方法は、事前に指定された領域を割り当てることで構成されます。これは、各 RX_CONTEXT の一部として、すべてのネットワーク ミニ リダイレクターに対して同じです。 これは、さまざまなネットワーク ミニ リダイレクターによって必要な構造を適用できる、書式設定されていない領域です。 このようなアプローチは、以前のアプローチに関連する欠点を克服します。 これは、RDBSS で現在実装されているアプローチです。

3 番目の方法は、RDBSS で使用されるスキームです。 したがって、ネットワーク ミニ リダイレクター ドライバーの開発者は、RX_CONTEXT データ構造で定義されているこの事前に指定された領域に収まるように、関連付けられているプライベート コンテキストを定義する必要があります。 この規則に違反するネットワーク ミニ リダイレクター ドライバーでは、パフォーマンスが大幅に低下します。

ネットワーク ミニ リダイレクターによってエクスポートされた多くの RDBSS ルーチンとルーチンは、開始スレッドまたはルーチンによって使用される他のスレッドの RX_CONTEXT 構造体を参照します。 したがって、RX_CONTEXT 構造体は参照カウントされ、非同期操作の使用を管理します。 参照カウントが 0 になると、最後の逆参照操作で RX_CONTEXT 構造体を最終処理して解放できます。

RDBSS には、RX_CONTEXT 構造体と関連する IRP を操作するために使用されるルーチンが多数用意されています。 これらのルーチンは、RX_CONTEXT 構造体の割り当て、初期化、および削除に使用されます。 これらのルーチンは、RX_CONTEXT に関連付けられている IRP を完了し、RX_CONTEXT のキャンセル ルーチンを設定するためにも使用されます。

次のルーチンは、RX_CONTEXT 構造体を操作します。

ルーチンによって返される値 説明

RxCompleteRequest

このルーチンは、RX_CONTEXT 構造体に関連付けられている IRP を完了するために使用されます。 このルーチンは RDBSS によって内部的に使用され、ネットワーク ミニ リダイレクターでは使用しないでください。

RxCompleteRequest_Real

このルーチンは、RX_CONTEXT 構造体に関連付けられている IRP を完了するために使用されます。 このルーチンは RDBSS によって内部的に使用され、ネットワーク ミニ リダイレクターでは使用しないでください。

RxCreateRxContext

このルーチンは、新しい RX_CONTEXT 構造体を割り当て、データ構造を初期化します。

RxDereferenceAndDeleteRxContext_Real

このルーチンは、RX_CONTEXT 構造体を逆参照し、参照カウントが 0 になると、RDBSS のメモリ内データ構造から指定された RX_CONTEXT 構造体の割り当てを解除して削除します。

RxInitializeContext

このルーチンは、新しく割り当てられた RX_CONTEXT 構造体を初期化します。

RxPrepareContextForReuse

このルーチンは、過去に実行されたすべての操作固有の割り当てと取得をリセットすることによって、再利用するために RX_CONTEXT 構造を準備します。 IRP から取得したパラメーターは変更されません。 このルーチンは RDBSS によって内部的に使用され、ネットワーク ミニ リダイレクターでは使用しないでください。

RxResumeBlockedOperations_Serially

このルーチンは、シリアル化されたブロッキング I/O キュー上の次の待機スレッド (ある場合) を起動します。

RxSetMinirdrCancelRoutine

ルーチンは、RX_CONTEXT 構造体のネットワーク ミニ リダイレクターキャンセル ルーチンを設定します。

__RxSynchronizeBlockingOperations

このルーチンは、ブロッキング I/O を同じ作業キューに同期するために使用されます。 このルーチンは、名前付きパイプ操作を同期するために RDBSS によって内部的に使用されます。 このルーチンは、ネットワーク ミニ リダイレクターによってメインに含まれる別のキューで操作を同期するために、ネットワーク ミニ リダイレクターによって使用できます。

ルーチンは、Windows Server 2003 でのみ使用できます。

__RxSynchronizeBlockingOperationsMaybeDroppingFcbLock

このルーチンは、ブロッキング I/O を同じ作業キューに同期するために使用されます。 このルーチンは、名前付きパイプ操作を同期するために RDBSS によって内部的に使用されます。 このルーチンは、ネットワーク ミニ リダイレクターによってメインに含まれる別のキューで操作を同期するために、ネットワーク ミニ リダイレクターによって使用できます。

ルーチンは、Windows XP および Windows 2000 でのみ使用できます。

次のマクロは、前の表に示したルーチンを呼び出す rxcontx.h ヘッダー ファイルで定義されています。 通常、これらのマクロは、これらのルーチンを直接呼び出す代わりに使用されます。

マクロ 説明

RxSynchronizeBlockingOperations(RXCONTEXTFCBIOQUEUE)

このマクロは、ブロッキング I/O 要求を同じ作業キューに同期します。 Windows Server 2003 では、このマクロは DropFcbLock パラメーターを FALSE に設定して__RxSynchronizeBlockingOperations ルーチンを呼び出します。

Windows XP および Windows 2000 では、このマクロは DropFcbLock パラメーターを FALSE に設定して__RxSynchronizeBlockingOperationsMaybeDroppingFcbLock ルーチンを呼び出します。

RxSynchronizeBlockingOperations(RXCONTEXTFCBIOQUEUE)

このマクロは、ブロッキング I/O 要求を同じ作業キューに同期します。 Windows Server 2003 では、このマクロは DropFcbLock パラメーターを TRUE に設定して__RxSynchronizeBlockingOperations ルーチンを呼び出します。

Windows XP および Windows 2000 では、このマクロは DropFcbLock パラメーターを TRUE に設定して__RxSynchronizeBlockingOperationsMaybeDroppingFcbLock ルーチンを呼び出します。