Share via


ネットワーク データの受信

次の図は、ミニポート ドライバー、NDIS、プロトコル ドライバーを含む基本的な受信操作を示しています。

Diagram illustrating a basic network receive operation.

ミニポート ドライバーは、NdisMIndicateReceiveNetBufferLists 関数を呼び出し、上位レベルのドライバー NET_BUFFER 構造を示します。 すべての NET_BUFFER 構造は通常、別個のNET_BUFFER_LIST 構造にアタッチする必要があります。 これにより、プロトコル ドライバーは、NET_BUFFER_LIST 構造の元のリストのサブセットを作成し、それらを別のクライアントに転送できます。 一部のドライバー (ネイティブ IEEE 802.11 ミニポート ドライバーなど) は、複数の NET_BUFFER 構造を NET_BUFFER_LIST 構造にアタッチすることがあります。

すべての NET_BUFFER_LIST 構造をリンクしたら、ミニポート ドライバーは、NdisMIndicateReceiveNetBufferLists 関数にリスト内の最初の NET_BUFFER_LIST 構造へのポインターを渡します。 NDIS は、NET_BUFFER_LIST 構造を調べ、NET_BUFFER_LIST 構造に関連付けられている各プロトコル ドライバーの ProtocolReceiveNetBufferLists 関数を呼び出します。 NDIS は、各プロトコル ドライバーへの適切なバインドに関連付けられている NET_BUFFER_LIST 構造のみを含むリストのサブセットを渡します。 NDIS は、NET_BUFFER_LIST 構造で指定された NetBufferListFrameType 値と、各プロトコル ドライバーが登録するフレームの種類を照合します。

プロトコル ドライバーの ProtocolReceiveNetBufferLists 関数に渡される ReceiveFlags パラメーターで NDIS_RECEIVE_FLAGS_RESOURCES フラグが設定されている場合、NDIS は、ProtocolReceiveNetBufferLists 呼び出しが返された直後に NET_BUFFER_LIST 構造の所有権を回復します。

NDIS_RECEIVE_FLAGS_RESOURCES フラグが設定されている場合、プロトコル ドライバーは、リンク リスト内の NET_BUFFER_LIST 構造の元のセットを保持する必要があります。 たとえば、このフラグが設定されると、ドライバーは構造を処理し、スタックを一度に 1 つずつ上に示しますが、関数が値を返す前に、元のリンク リストを復元する必要があります。

プロトコル ドライバーの ProtocolReceiveNetBufferLists 関数に渡される ReceiveFlags パラメーターで NDIS_RECEIVE_FLAGS_RESOURCES フラグが設定されていない場合、プロトコル ドライバーは NET_BUFFER_LIST 構造の所有権を保持できます。 この場合、プロトコル ドライバーは NdisReturnNetBufferLists 関数を呼び出すことによって、NET_BUFFER_LIST 構造を返す必要があります。

ミニポート ドライバーは、受信リソースが不足している場合、NdisMIndicateReceiveNetBufferLists の呼び出しで ReceiveFlags パラメーターに NDIS_RECEIVE_FLAGS_RESOURCES フラグを設定できます。 その場合、ドライバーは、NdisMIndicateReceiveNetBufferLists が返されるとすぐに、指定されたすべての NET_BUFFER_LIST 構造と埋め込み NET_BUFFER 構造の所有権を回収できます。 NDIS_RECEIVE_FLAGS_RESOURCES フラグが設定された NET_BUFFER 構造を示すと、プロトコル ドライバーは強制的にデータをコピーするため、これは回避する必要があります。 ミニポート ドライバーは、受信リソースが不足しそうな状況を検出し、その状況を回避するために必要な手順を実行する必要があります。

NDIS は、プロトコル ドライバーが NdisReturnNetBufferLists を呼び出した後、ミニポート ドライバーの MiniportReturnNetBufferLists 関数を呼び出します。

ミニポート ドライバーが NDIS_RECEIVE_FLAGS_RESOURCES フラグが設定されている NET_BUFFER_LIST 構造を示した場合、NDIS が NET_BUFFER_LIST 構造を同じステータスのプロトコル ドライバーに示すという意味ではありません。 たとえば、NDIS は、NDIS_RECEIVE_FLAGS_RESOURCES フラグが設定された NET_BUFFER_LIST 構造をコピーし、フラグがクリアされたプロトコル ドライバーにコピーを示します。

NDIS は任意の順序と任意の組み合わせでミニポート ドライバーに NET_BUFFER_LIST 構造を返すことができます。 つまり、その MiniportReturnNetBufferLists 関数の呼び出しによってミニポート ドライバーに返される NET_BUFFER_LIST 構造のリンク リストは、NdisMIndicateReceiveNetBufferLists の以前のさまざまな呼び出しから得られた NET_BUFFER_LIST 構造を含む可能性があります。

ミニポート ドライバーは、NET_BUFFER_LIST 構造の SourceHandle メンバーを、MiniportInitializeEx 関数のミニポート ドライバーに NDIS が提供した MiniportAdapterHandle に設定する必要があります。 フィルター ドライバーは、FilterAttach 関数のフィルター ドライバーに提供されたフィルターの NdisFilterHandle にフィルター ドライバーが送信した各 NET_BUFFER_LIST 構造の SourceHandle メンバーを設定する必要があります。 フィルター ドライバーは、フィルター ドライバーによって生成されなかった NET_BUFFER_LIST 構造の SourceHandle メンバーを変更してはなりません。

中間ドライバーは、MiniportInitializeEx 関数の中間ドライバーに NDIS が提供すた MiniportAdapterHandle 値に NET_BUFFER_LIST 構造体 SourceHandle メンバーも設定します。 中間ドライバーが受信通知を転送した場合、ドライバーは SourceHandle メンバーに書き込む前に、基になるドライバーが指定した SourceHandle 値を保存する必要があります。 NDIS が中間ドライバーに転送された NET_BUFFER_LIST 構造体を返す場合、中間ドライバーは、保存した SourceHandle を復元する必要があります。