次の図は、ドライバー スタック内のプロトコル ドライバー、NDIS、および基になるドライバーを含む基本的な受信操作を示しています。
NDIS は、プロトコル ドライバーの ProtocolReceiveNetBufferLists 関数を呼び出して、基になるドライバーからの指示を受け取る処理を行います。 NDIS は、基になるドライバーが受信通知関数 (NdisMIndicateReceiveNetBufferLists など) を呼び出して、受信したネットワーク データまたはループ バック データを示した後に ProtocolReceiveNetBufferLists を呼び出します。
ProtocolReceiveNetBufferLists の ReceiveFlags パラメーターのNDIS_RECEIVE_FLAGS_RESOURCES フラグが設定されていない場合、プロトコル ドライバーは NdisReturnNetBufferLists 関数を呼び出すまで、NET_BUFFER_LIST構造体の所有権を保持します。 NDIS が NDIS_RECEIVE_FLAGS_RESOURCES フラグを設定する場合、プロトコル ドライバーは NET_BUFFER_LIST 構造体と関連付けられたリソースを保持できません。 set NDIS_RECEIVE_FLAGS_RESOURCES フラグは、基になるドライバーが受信リソースで不足していることを示します。 この場合、ProtocolReceiveNetBufferLists 関数は、受信したデータをプロトコル割り当てストレージにコピーし、できるだけ早く戻る必要があります。
手記 NDIS は、基になるドライバーが示すフラグを変更できます。 たとえば、ミニポート ドライバーが NdisMIndicateReceiveNetBufferLists 関数の ReceiveFlags パラメーターにNDIS_RECEIVE_FLAGS_RESOURCES フラグを設定する場合、NDIS は指定されたデータをコピーし、NDIS_RECEIVE_FLAGS_RESOURCES フラグをクリアして ProtocolReceiveNetBufferLists にコピーを渡すことができます。
手記NDIS_RECEIVE_FLAGS_RESOURCES フラグが設定されている場合、プロトコル ドライバーは、リンクリスト内の元のNET_BUFFER_LIST構造体のセットを保持する必要があります。 たとえば、このフラグが設定されている場合、ドライバーは構造体を処理し、スタックを一度に 1 つずつ上に示しますが、関数が戻る前に元のリンクリストを復元する必要があります。
プロトコル ドライバーは NdisReturnNetBufferLists 関数を呼び出して、関連付けられている NET_BUFFER 構造体とネットワーク データと共に、 NET_BUFFER_LIST 構造体の一覧の所有権を解放します。