中間ドライバー ネットワーク データ管理
中間ドライバーは、ネットワーク経由で送信するために、上位レベルのドライバーから 1 つ以上の関連付けられた MDL を持つ NET_BUFFER_LIST 構造体を受け取ります。 中間ドライバーは、ドライバーにコネクションレスの下端がある場合は NdisSendNetBufferLists を呼び出すか、ドライバーに接続指向の下端がある場合は NdisCoSendNetBufferLists を呼び出すことで、基になるドライバーにデータを渡します。 または、中間ドライバーは、チェーンされたバッファーの内容、または、他の送信に対する受信データの順序またはタイミングを変更するために、いくつかのアクションを実行できます。
中間ドライバーの目的に応じて、このようなドライバーは、受信 NET_BUFFER_LIST 構造体にチェーンされているバッファーを再パッケージ化できます。 たとえば、中間ドライバーは、次の状況でネットワーク データを再パッケージ化します。
中間ドライバーは、基になるメディアを介して 1 つのバッファーで送信できるよりも、上にあるプロトコル ドライバーから大きなデータ バッファーを受け取ります。 その結果、中間ドライバーは、受信データをより小さなバッファーに分割する必要があります。
中間ドライバーは、基になるドライバーに各送信を転送する前に、データを圧縮または暗号化することで、ネットワーク データの長さまたは内容を変更します。
ネットワーク データ管理の作成については、「プロトコル ドライバー バッファー管理」を参照してください。
NDIS は、NET_BUFFER_LIST 構造体を複製およびフラグメントするためのインターフェイスを提供します。 構造の複製と断片化の詳細については、「Derived NET_BUFFER_LIST 構造体」を参照してください。
NET_BUFFER_LIST 構造体は、必要に応じて、ドライバーの初期化時、または ProtocolBindAdapterEx 関数で割り当てることができます。 中間ドライバー開発者は、必要に応じて、パフォーマンス上の理由から、初期化時に多数の構造体を割り当てて、ProtocolReceiveNetBufferLists が上位レベルのドライバーに示すために受信データをコピーするリソースを事前に割り当てることができ、そうすることで、MiniportSendNetBufferLists には NET_BUFFER_LIST 構造体 (および、場合によっては、バッファー) があり、受信送信ネットワーク データを次の下位ドライバーに渡せるようにします。
中間ドライバーが送信データまたは受信データを新しいバッファーにコピーし、最後のバッファー内の実際のデータの長さがバッファーの割り当てられた長さよりも短い場合、中間ドライバーは NdisAdjustMdlLength を呼び出して、バッファーをデータの実際の長さに調整できます。
コネクションレスの下端を持つ中間ドライバーは、基になるミニポート アダプターから、常に、ProtocolReceiveNetBufferLists 関数から受信データを受信します。
接続指向の下端を持つ中間ドライバーは、基になるミニポート アダプターから常に ProtocolCoReceiveNetBufferLists 関数から、受信データを受信します。