CoNDIS ドライバーからの NET_BUFFER 構造の送信
次の図は、プロトコル ドライバー、NDIS、ミニポート ドライバーを含む基本的な CoNDIS 送信操作を示しています。
前の図に示すように、プロトコル ドライバーは NdisCoSendNetBufferLists 関数を呼び出して、仮想接続 (VC) で NET_BUFFER_LIST 構造体を送信します。 NDIS は、ミニポート ドライバーの MiniportCoSendNetBufferLists 関数を呼び出して、基になるミニポート ドライバーに NET_BUFFER_LIST 構造体を転送します。
すべての NET_BUFFER ベースの送信操作は非同期です。 したがって、ミニポート ドライバーは常に NdisMCoSendNetBufferListsComplete 関数を呼び出し、データの送信が完了したときに適切なステータス コードを提供します。 ミニポート ドライバーは、他の NET_BUFFER_LIST 構造体に関係なく、各 NET_BUFFER_LIST 構造体の送信操作を完了できます。 NDIS は、ミニポート ドライバーの NdisMCoSendNetBufferListsComplete を呼び出すたびに、プロトコル ドライバーの ProtocolCoSendNetBufferListsComplete 関数を呼び出します。
プロトコル ドライバーは、NDIS がプロトコル ドライバーの ProtocolCoSendNetBufferListsComplete 関数を呼び出すとすぐに、NET_BUFFER_LIST 構造体とすべての関連する構造体とデータの所有権を取り戻せます。
ミニポート ドライバーまたは NDIS は、任意の順序で NET_BUFFER_LIST 構造体を返すことができます。 とはいえ、プロトコル ドライバーでは、各 NET_BUFFER_LIST 構造体にアタッチされている NET_BUFFER 構造体の一覧が変更されていないことが保証されます。
プロトコル ドライバーは、NET_BUFFER_LIST 構造体の SourceHandle メンバーを NdisCoSendNetBufferLists の NdisVcHandle パラメーターと同じ値に設定します。 NDIS では、 SourceHandle メンバーを使用して、NET_BUFFER_LIST 構造体を送信したプロトコル ドライバーに NET_BUFFER_LIST 構造体を返します。
中間ドライバーでは、NET_BUFFER_LIST 構造体の SourceHandle メンバーも NdisVcHandle 値に設定します。 中間ドライバーが送信要求を転送する場合、ドライバーは SourceHandle メンバーに書き込む前に、基になるドライバーが指定した SourceHandle 値を保存する必要があります。 NDIS が中間ドライバーに転送された NET_BUFFER_LIST 構造体を返す場合、中間ドライバーは、保存した SourceHandle を復元する必要があります。
プロトコル ドライバーは、コネクションレス ドライバーと同じメカニズムを使用して送信要求を取り消すことができます。 送信要求の取り消しの詳細については、「送信操作の取り消し」を参照してください。