ミニポート ドライバー バッファー管理

ミニポート ドライバーは通常、MiniportInitializeEx から NdisAllocateNetBufferListPool を呼び出して、NET_BUFFER_LIST 構造体のプールを作成します。 ミニポート ドライバーはこれらの構造体を使用して、受信したデータを表示します。

通常、NET_BUFFER_LIST 構造体を割り当てるミニポート ドライバーは、NET_BUFFER_LIST 構造体に 1 つの NET_BUFFER 構造体を割り当て、キューに入れます。 NET_BUFFER_LIST 構造体のプールを割り当てる場合は、NET_BUFFER_LIST 構造体と NET_BUFFER 構造体を個別に割り当てるよりも、NET_BUFFER 構造体を事前に割り当てるほうが効率的です。

ミニポート ドライバーは NdisAllocateNetBufferListPool を呼び出し、AllocateNetBuffer パラメーターを TRUE に設定して、NET_BUFFER 構造体が事前に割り当てられていることを示すことができます。 この場合、NET_BUFFER 構造体は、ドライバーがプールから割り当てる各 NET_BUFFER_LIST 構造体に事前に割り当てられます。 このようなドライバーは、このプールから構造体を割り当てるために NdisAllocateNetBufferAndNetBufferList を呼び出す必要があります。

通常、ミニポート ドライバーは、MiniportInitializeEx から NdisAllocateNetBufferAndNetBufferList を呼び出して、後続の受信操作に必要な数のバッファーを割り当てます。 この場合、ドライバーは空きバッファーの内部リストを管理します。

MiniportReturnNetBufferLists 関数は、後続の受信表示で再利用するために返された NET_BUFFER_LIST 構造体を準備できます。 MiniportReturnNetBufferLists は NET_BUFFER_LIST 構造体をプールに返すことができますが (たとえば、NdisFreeNetBufferList を呼び出すことができます)、プールに返さずに構造体を再利用するほうが効率的です。

ミニポート ドライバーは、NDIS がアダプターを停止したときに、すべての NET_BUFFER_LIST 構造体と構造体に関連するデータを解放する必要があります。 ドライバーは、構造体を解放するために NdisFreeNetBufferList を、NET_BUFFER_LIST プールを解放するために NdisFreeNetBufferListPool 関数を呼び出すことができます。