フィルター ドライバー バッファー管理

フィルター ドライバーでは、他のドライバーから取得したネットワーク データをコピーしたり、送受信の操作を開始したりするためのバッファーを作成します。

フィルター ドライバーがバッファーを作成しなければ、ドライバーはバッファー プールを管理しません。 このようなドライバーは、他のドライバーから受け取るバッファーを渡すのみです。

送受信操作をサポートするバッファーを作成するフィルター ドライバーは、NET_BUFFER_LIST構造体プールとNET_BUFFER構造体プールを管理する必要があります。

これらのプールを作成するのにドライバーが呼び出す関数は次の通りです。

NdisAllocateNetBufferListPool

NdisAllocateNetBufferPool

フィルター ドライバーは、次の関数を使用してプールから構造体を割り当てることができます。

NdisAllocateNetBufferAndNetBufferList

NdisAllocateNetBufferList

NdisAllocateNetBuffer

NdisAllocateNetBufferAndNetBufferList の呼び出しは、NdisAllocateNetBufferList の後に NdisAllocateNetBuffer を呼び出すよりも効率的です。 ただし、 NdisAllocateNetBufferAndNetBufferList は、NET_BUFFER_LIST構造体に 1 つのNET_BUFFER構造体のみ作成します。 NdisAllocateNetBufferAndNetBufferList を使用するには、ドライバーが NdisAllocateNetBufferListPool を呼び出すときに、AllocateNetBuffer パラメーターを TRUE に設定する必要があります。

リクエストの送信元のフィルター ドライバーは、基になるドライバーのコンテキストとバックフィル領域の要件を決定しなければなりません。 フィルター ドライバーは、再起動属性を使用して基になるドライバーのバックフィル要件を決定します。 フィルター ドライバーは、再起動状態のバックフィルとコンテキストの要件を決定する必要があります。 ドライバーは、スタック全体に十分なバックフィルとコンテキスト領域を割り当てなければなりません。 必要に応じて、フィルター ドライバーはプールを解放し、再起動状態でそれらを再割り当てできます。

フィルター ドライバーは、次の関数を使用してプールを開放します。

NdisFreeNetBufferListPool

NdisFreeNetBufferPool

フィルター ドライバーは、次の関数を使用してプールから構造体を自由に割り当てることができます。

NdisFreeNetBufferList

NdisFreeNetBuffer

ドライバーは、関連付けられているNET_BUFFER_LIST構造体を解放する前に、NdisAllocateNetBuffer で割り当てられたNET_BUFFER構造体を解放しなければなりません。 ドライバーが関連付けられているNET_BUFFER_LIST構造体の NdisFreeNetBufferList を呼び出すと、NdisAllocateNetBufferAndNetBufferList で割り当てられたNET_BUFFER構造体が解放されます。