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構造体には、MDL がアタッチされた 3 つのNET_BUFFER構造体があります。 子NET_BUFFER_LIST構造体には、親構造体へのポインターがあります。 NULL NET_BUFFER_LIST_CONTEXT構造体ポインターは、子に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 関数を呼び出して、NET_BUFFER_LIST構造体と、以前に NdisAllocateFragmentNetBufferList呼び出すことによって割り当てられたすべての関連NET_BUFFER構造体と MDL チェーンを解放します。