フィルター ドライバーのデータの受信
フィルター ドライバーは、受信インジケーターを開始したり、基になるドライバーから表示を受け取ったりすることができます。 ミニポート ドライバーが NdisMIndicateReceiveNetBufferLists 関数を呼び出すと、NDIS は、指定された NET_BUFFER_LIST 構造をドライバー スタック内の最も下にある上位のフィルター モジュールに送信します。
フィルター ドライバーによって開始されたインジケーターの受信
次の図は、フィルター ドライバーによって開始された受信指示を示しています。
フィルター ドライバーは、NdisFIndicateReceiveNetBufferLists 関数を呼び出して、受信したデータを示します。 NdisFIndicateReceiveNetBufferLists 関数は、スタックの上にある NET_BUFFER_LIST 構造の指定されたリストを、上位のドライバーに渡します。 フィルター ドライバーは、初期化時に作成したプールから構造を割り当てます。
フィルター ドライバーが NdisFIndicateReceiveNetBufferLists の ReceiveFlags パラメーターで NDIS_RECEIVE_FLAGS_RESOURCES フラグを設定した場合、これは、フィルター ドライバーが NET_BUFFER_LIST 構造の所有権をすぐにに回復する必要があることを示します。 この場合、NDIS はフィルター ドライバーの FilterReturnNetBufferLists 関数を呼び出さず、NET_BUFFER_LIST 構造を返しません。 フィルター ドライバーは、NdisFIndicateReceiveNetBufferLists が返された直後に所有権を回復します。
フィルター ドライバーが NdisFIndicateReceiveNetBufferLists の ReceiveFlags パラメーターで NDIS_RECEIVE_FLAGS_RESOURCES フラグを設定しない場合、NDIS は、指定された NET_BUFFER_LIST 構造をフィルター ドライバーの FilterReturnNetBufferLists 関数に返します。 この場合、フィルター ドライバーは、NDIS が FilterReturnNetBufferLists にそれらを返すまで、指定された構造の所有権を放棄します。
注 フィルター ドライバーは、自身が開始した受信指示を追跡する必要があり、受信操作が完了したときに NdisFReturnNetBufferLists 関数を呼び出しません。
受信インジケーターのフィルター処理
次の図は、基になるドライバーによって開始されるフィルター処理された受信インジケーターを示しています。
NDIS は、フィルター ドライバーの FilterReceiveNetBufferLists 関数を呼び出して、基になるドライバーからの指示を受け取る処理を行います。 基になるドライバーが受信通知関数 (NdisMIndicateReceiveNetBufferLists など) を呼び出して、受信したネットワーク データまたはループバック データを示した後、NDIS は FilterReceiveNetBufferLists を呼び出します。
FilterReceiveNetBufferLists の ReceiveFlags パラメーターで NDIS_RECEIVE_FLAGS_RESOURCES フラグが設定されていない場合、フィルター ドライバーは NdisFReturnNetBufferLists 関数を呼び出すまで NET_BUFFER_LIST 構造の所有権を保持します。
ReceiveFlags パラメーターで NDIS_RECEIVE_FLAGS_RESOURCES フラグが設定されている場合、フィルター ドライバーは、NET_BUFFER_LIST 構造と、関連付けられている基になるドライバー割り当てリソースを保持できません。 このフラグは、基になるドライバーが受信リソースで不足していることを示すことができます。 FilterReceiveNetBufferLists 関数は、できるだけ早く返す必要があります。
注NDIS_RECEIVE_FLAGS_RESOURCES フラグが設定されている場合、フィルター ドライバーは、リンク リスト内の NET_BUFFER_LIST 構造の元のセットを保持する必要があります。 たとえば、このフラグが設定されると、ドライバーは構造を処理し、スタックを一度に 1 つずつ上に示しますが、関数が値を返す前に、元のリンク リストを復元する必要があります。
フィルター ドライバーは、上位のドライバーにデータを示す前に、受信したデータに対してフィルター操作を実行できます。 FilterReceiveNetBufferLists 関数に送信されたバッファーごとに、フィルター ドライバーは以下の操作を実行できます。
NdisFIndicateReceiveNetBufferLists を呼び出すことにより、次の上位のドライバーに渡します。 ドライバーは、バッファーの内容を変更できます。 NDIS は、コンテキスト空間の可用性を保証します (NET_BUFFER_LIST_CONTEXT 構造を参照)。
フィルター ドライバーは、NDIS が FilterReceiveNetBufferLists に渡した状態を変更したり、そのまま NdisFIndicateReceiveNetBufferLists に渡したりすることができます。
注 NDIS が FilterReceiveNetBufferLists の ReceiveFlags パラメーターで NDIS_RECEIVE_FLAGS_RESOURCES フラグを設定した場合でも、フィルター ドライバーは NdisFIndicateReceiveNetBufferLists を使用してバッファーを渡すことができます。 この場合、フィルター ドライバーは、バッファーの所有権を回復するまで FilterReceiveNetBufferLists から戻ってはなりません。
バッファーを破棄します。 NDIS が FilterReceiveNetBufferLists の ReceiveFlags パラメーターで NDIS_RECEIVE_FLAGS_RESOURCES フラグをクリアした場合、NdisFReturnNetBufferLists 関数を呼び出してバッファーを破棄します。 NDIS が FilterReceiveNetBufferLists の ReceiveFlags パラメーターで NDIS_RECEIVE_FLAGS_RESOURCES フラグを設定した場合、アクションを実行せず、FilterReceiveNetBufferLists から戻ってバッファーを破棄します。
後で処理するために、バッファーをローカル データ構造のキューに入れます。 NDIS が FilterReceiveNetBufferLists の ReceiveFlags パラメーターで NDIS_RECEIVE_FLAGS_RESOURCES フラグを設定した場合、フィルター ドライバーは FilterReceiveNetBufferLists から戻る前にコピーを作成する必要があります。
バッファーをコピーし、コピーを使って受信通知を生成します。 受信インジケーターは、フィルター ドライバーによって開始された受信インジケーターに似ています。 この場合、ドライバーは、基になるドライバーに元のバッファーを返す必要があります。
NdisFIndicateReceiveNetBufferLists 関数は、ドライバー スタックの上にある NET_BUFFER_LIST 構造の指定されたリストを、上位のドライバーに渡します。 受信操作は、フィルター ドライバーによって開始された受信操作と同じように続行されます。
基になるドライバーがバッファーの所有権を保持している場合、NDIS はフィルター モジュールの FilterReturnNetBufferLists 関数を呼び出します。 その FilterReturnNetBufferLists 関数では、フィルター ドライバーは、受信指示パスのバッファーに対して実行した操作を元に戻します。
最下位レイヤー フィルター モジュールがバッファーで行われることを示す場合、NDIS はバッファーをミニポート ドライバーに返します。 NDIS が FilterReceiveNetBufferLists の ReceiveFlags パラメーターの NDIS_RECEIVE_FLAGS_RESOURCES フラグをクリアした場合、フィルター ドライバーは NdisFReturnNetBufferLists を呼び出してバッファーを返します。 NDIS が FilterReceiveNetBufferLists の ReceiveFlags パラメーターで NDIS_RECEIVE_FLAGS_RESOURCES フラグを設定した場合、FilterReceiveNetBufferLists から戻るとバッファーが返されます。