プロトコル ドライバーのデータの受信
次の図は、ドライバー スタック内のプロトコル ドライバー、NDIS、基になるドライバーを含む基本的な受信操作を示しています。
NDIS は、プロトコル ドライバーの ProtocolReceiveNetBufferLists 関数を呼び出して、基になるドライバーからの指示を受け取る処理を行います。 基になるドライバーが受信通知関数 (NdisMIndicateReceiveNetBufferLists など) を呼び出して、受信したネットワーク データまたはループバック データを示した後、NDIS は ProtocolReceiveNetBufferLists を呼び出します。
ProtocolReceiveNetBufferLists の ReceiveFlags パラメーターで NDIS_RECEIVE_FLAGS_RESOURCES フラグが設定されていない場合、プロトコル ドライバーは NdisReturnNetBufferLists 関数を呼び出すまで NET_BUFFER_LIST 構造の所有権を保持します。 NDIS が NDIS_RECEIVE_FLAGS_RESOURCES フラグを設定した場合、プロトコル ドライバーは、NET_BUFFER_LIST 構造と関連付けられているリソースを保持できません。 設定された 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 構造のリストの所有権を解放します。