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

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

Diagram showing a basic NDIS send operation with a protocol driver, NDIS, and a miniport driver.

プロトコル ドライバーは、NdisSendNetBufferLists 関数を呼び出して、バインディング上の NET_BUFFER_LIST 構造体を送信します。 NDIS は、ミニポート ドライバーの MiniportSendNetBufferLists 関数を呼び出して、基になるミニポート ドライバーに NET_BUFFER_LIST 構造体を転送します。

すべての NET_BUFFER ベースの送信操作は非同期です。 ミニポート ドライバーは、それが完了すると、適切なステータス コードで NdisMSendNetBufferListsComplete 関数を呼び出します。 各 NET_BUFFER_LIST 構造体の送信は、個別に完了できます。 NDIS は、ミニポート ドライバーが NdisMSendNetBufferListsComplete を呼び出すたびに、プロトコル ドライバーの ProtocolSendNetBufferListsComplete 関数を呼び出します。

プロトコル ドライバーは、NDIS がプロトコル ドライバーの ProtocolSendNetBufferListsComplete 関数を呼び出すとすぐに、NET_BUFFER_LIST 構造体およびすべての関連する構造体とデータの所有権を取り戻せます。

ミニポート ドライバーまたは NDIS は、任意の順序で NET_BUFFER_LIST 構造体を返すことができます。 プロトコル ドライバーでは、各 NET_BUFFER_LIST 構造体にアタッチされている NET_BUFFER 構造体の一覧が変更されていないことが保証されています。

NDIS ドライバーは、NET_BUFFER_LIST 構造体内の NET_BUFFER 構造体を分離できます。 NDIS ドライバーは、NET_BUFFER 構造体の MDL を分離することもできます。 ただし、ドライバーは常に、元の形式の NET_BUFFER 構造体と MDL を持つ NET_BUFFER_LIST 構造体を返す必要があります。 たとえば、中間ドライバーは、NET_BUFFER_LIST を2 つの新しい NET_BUFFER_LIST 構造体に分離し、元のデータの一部を次のドライバーに渡す場合があります。 ただし、中間ドライバーは、元の NET_BUFFER_LIST の処理を完了すると、元の NET_BUFFER 構造と MDL を持つ完全な NET_BUFFER_LIST を返す必要があります。

プロトコル ドライバーは、NdisOpenAdapterEx 関数の呼び出しで NDIS が提供した NdisBindingHandle に、NET_BUFFER_LIST 構造体の SourceHandle メンバーを設定します。 NDIS では、 SourceHandle メンバーを使用して、NET_BUFFER_LIST 構造体を送信したプロトコル ドライバーに NET_BUFFER_LIST 構造体を返します。

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