後退操作

後退操作では、NET_BUFFER構造体または NET_BUFFER_LIST 構造体内のすべてのNET_BUFFER構造体で使用されるデータ空間の サイズを増 やすことができます。

NDIS には、次の後退関数が用意されています。

NdisRetreatNetBufferDataStart

NdisRetreatNetBufferListDataStart

後退操作では、NET_BUFFER構造体に関連付けられている MDL を割り当てることがあります。 MDL を割り当てるメカニズムを提供するために、ドライバーは 、NetAllocateMdl 関数の省略可能なエントリ ポイントを提供できます。 エントリ ポイントが NULL の場合、NDIS は既定のメソッドを使用して MDL を割り当てます。 MDL は、MDL の割り当てに使用されたメカニズムの逆数を提供する NetFreeMdl 関数内で解放する必要があります。

新しい DataLength を取得するには、NDIS は、現在の DataLength にドライバー指定の DataOffsetDelta を追加します。 未使用のデータ領域のサイズが DataOffsetDelta より大きい場合、後退操作によって DataOffset が減少します。 この場合、新しい DataOffset は現在の DataOffset から DataOffsetDelta を引いた値です。

DataOffsetDeltaDataOffset より大きい場合、後退操作によって新しいデータ領域が割り当てられます。 この場合、NDIS はそれに応じて DataOffset を調整します。

送信操作の場合、後退要求を満たすのに十分な 未使用のデータ領域 がない場合、NDIS はメモリを割り当てます。 メモリ割り当てが必要ない場合、NDIS は DataOffsetDataLength を調整するだけです。 パフォーマンスを向上させるために、ドライバーは、基になるすべてのドライバーの後退操作に対応するために送信する前に、十分な合計データ サイズを割り当てる必要があります。

受信リターン ケースの場合、NDIS は、それに応じて DataOffsetDataLength を調整するだけです。 後退操作は、受信処理中に行われた前進操作を元に戻します。 後退操作の後、 使用されるデータ空間 には、受信処理中に使用された基になるドライバーのヘッダー データが含まれます。