リトリート操作
リトリート操作では、NET_BUFFER 構造体、または NET_BUFFER_LIST 構造体内のすべての NET_BUFFER 構造体で使用されるデータ空間のサイズを増やすことができます。
NDIS は、次のリトリート関数を提供します。
NdisRetreatNetBufferListDataStart
リトリート操作では、NET_BUFFER 構造体に関連付けられている MDL を割り当てることがあります。 MDL を割り当てるメカニズムを提供するために、ドライバーは、NetAllocateMdl 関数のオプションのエントリ ポイントを提供できます。 エントリ ポイントが NULL の場合、NDIS は既定のメソッドを使用して MDL を割り当てます。 MDL は、MDL の割り当てに使用されたメカニズムの逆数を提供する NetFreeMdl 関数内で解放する必要があります。
新しい DataLength を取得するには、NDIS は、現在の DataLength にドライバー指定の DataOffsetDelta を追加します。 未使用データ領域のサイズが DataOffsetDelta より大きい場合、リトリート操作によって DataOffset が減少します。 この場合、新しい DataOffset は現在の DataOffset から DataOffsetDelta を引いた値です。
DataOffsetDelta が DataOffset より大きい場合、リトリート操作によって新しいデータ領域が割り当てられます。 この場合、NDIS は適宜 DataOffset を調整します。
送信操作では、リトリート要求を満たすのに十分な未使用データ領域がない場合、NDIS はメモリを割り当てます。 メモリ割り当てが必要ない場合、NDIS は DataOffset と DataLength を調整するだけです。 パフォーマンスを向上させるために、ドライバーは、すべての下位ドライバーのリトリート操作に対応するために、十分な合計データ サイズを割り当ててから送信する必要があります。
受信リターンの場合、NDIS は、適宜 DataOffset と DataLength を調整するだけです。 リトリート操作は、受信処理中に行われたアドバンス操作を元に戻します。 リトリート操作の後、使用済みデータ空間 には、受信処理中に使用された下位ドライバーのヘッダー データが含まれます。