断片化された NET_BUFFER_LIST 構造
NDIS ドライバーは、既存の NET_BUFFER_LIST 構造から複製された NET_BUFFER_LIST 構造の断片を作成できます。 フラグメント化された構造体は、元のデータを参照する一連の NET_BUFFER 構造体を参照します。ただし、データは最大サイズを超えない単位に分割します。 ドライバーは、この種類の構造体を使用して、大きなバッファーをより小さなバッファーに効率的に分割できます。
次の図は、親 NET_BUFFER_LIST 構造とフラグメント化された子構造の関係を示しています。
上の図には、親 NET_BUFFER_LIST 構造と、その親から派生した子構造が含まれています。 親構造には、1 つの NET_BUFFER_LIST_CONTEXT 構造と、MDL がアタッチされた 1 つの NET_BUFFER 構造があります。 親構造の親ポインターは、派生構造ではないことを示す NULL です。
子 NET_BUFFER_LIST 構造には、MDLs がアタッチされた 3つの NET_BUFFER 構造があります。 子 NET_BUFFER_LIST構造 には、親構造へのポインターがあります。 NET_BUFFER_LIST_CONTEXT 構造ポインターが存在する NULL は、子に NET_BUFFER_LIST_CONTEXT 構造がないことを示します。
NDIS ドライバーは、NdisAllocateFragmentNetBufferList 関数を呼び出して、既存の NET_BUFFER_LIST 構造体のデータに基づく新しいフラグメント化された NET_BUFFER_LIST 構造体を作成します。 NDIS は、フラグメント化されたNET_BUFFER_LIST構造体の新しいNET_BUFFER構造体と MDLs を割り当てます。 NDIS は、フラグメント化された構造の NET_BUFFER_LIST_CONTEXT 構造を割り当てません。 新しい フラグメントNET_BUFFER 構造と MDL は、親構造と同じデータを記述します。 データはコピーされません。
NdisAllocateFragmentNetBufferList は、各親NET_BUFFER構造体で使用されるデータ空間の先頭から開始し、StartOffset パラメーターで指定された値によってオフセットされるフラグメントを作成します。
NdisAllocateFragmentNetBufferList は、各ソース NET_BUFFER構造体で使用されるデータ空間をフラグメントに分割します。 各フラグメントの使用されるデータ空間の長さは、MaximumLength パラメーターで指定された値以下です。 最後のフラグメントの使用されるデータ空間は、MaximumLength より小さいことがあります。 新しいNET_BUFFER構造体のデータ オフセットは、DataOffsetDelta パラメーターで指定されたバイト数だけ退避されます。
複数のNET_BUFFER_LIST構造体に複数のNET_BUFFER構造体がある場合 (図では示されていません)、各NET_BUFFER構造体の断片化プロセスは、1 つの構造体の場合と同等です。 たとえば、親NET_BUFFER構造体内のデータの最後の部分が最大サイズよりも小さければ、NDIS は、次のNET_BUFFER構造体の開始時に、このようなデータとデータを組み合わせません。
NDIS ドライバーは、NdisFreeFragmentNetBufferList 関数を呼び出して、以前に NdisAllocateFragmentNetBufferList を呼び出して割り当てられていたNET_BUFFER_LIST構造体と、関連付けられているすべてのNET_BUFFER構造体と MDL チェーンを解放します。