次の方法で共有


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

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

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

送受信操作をサポートするバッファーを作成するフィルター ドライバーは、 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構造体が解放されます。