次の方法で共有


フィルター ドライバーのデータの受信

フィルター ドライバーは、受信インジケーターを開始したり、基になるドライバーから表示を受け取ったりすることができます。 ミニポート ドライバーが NdisMIndicateReceiveNetBufferLists 関数を呼び出すと、NDIS は、指定された NET_BUFFER_LIST 構造をドライバー スタック内の最も下にある上位のフィルター モジュールに送信します。

フィルター ドライバーによって開始されたインジケーターの受信

次の図は、フィルター ドライバーによって開始された受信指示を示しています。

Diagram illustrating a receive indication initiated by a filter driver.

フィルター ドライバーは、NdisFIndicateReceiveNetBufferLists 関数を呼び出して、受信したデータを示します。 NdisFIndicateReceiveNetBufferLists 関数は、スタックの上にある NET_BUFFER_LIST 構造の指定されたリストを、上位のドライバーに渡します。 フィルター ドライバーは、初期化時に作成したプールから構造を割り当てます。

フィルター ドライバーが NdisFIndicateReceiveNetBufferListsReceiveFlags パラメーターで NDIS_RECEIVE_FLAGS_RESOURCES フラグを設定した場合、これは、フィルター ドライバーが NET_BUFFER_LIST 構造の所有権をすぐにに回復する必要があることを示します。 この場合、NDIS はフィルター ドライバーの FilterReturnNetBufferLists 関数を呼び出さず、NET_BUFFER_LIST 構造を返しません。 フィルター ドライバーは、NdisFIndicateReceiveNetBufferLists が返された直後に所有権を回復します。

フィルター ドライバーが NdisFIndicateReceiveNetBufferListsReceiveFlags パラメーターで NDIS_RECEIVE_FLAGS_RESOURCES フラグを設定しない場合、NDIS は、指定された NET_BUFFER_LIST 構造をフィルター ドライバーの FilterReturnNetBufferLists 関数に返します。 この場合、フィルター ドライバーは、NDIS が FilterReturnNetBufferLists にそれらを返すまで、指定された構造の所有権を放棄します。

フィルター ドライバーは、自身が開始した受信指示を追跡する必要があり、受信操作が完了したときに NdisFReturnNetBufferLists 関数を呼び出しません。

受信インジケーターのフィルター処理

次の図は、基になるドライバーによって開始されるフィルター処理された受信インジケーターを示しています。

Diagram illustrating a filtered receive indication initiated by an underlying driver.

NDIS は、フィルター ドライバーの FilterReceiveNetBufferLists 関数を呼び出して、基になるドライバーからの指示を受け取る処理を行います。 基になるドライバーが受信通知関数 (NdisMIndicateReceiveNetBufferLists など) を呼び出して、受信したネットワーク データまたはループバック データを示した後、NDIS は FilterReceiveNetBufferLists を呼び出します。

FilterReceiveNetBufferListsReceiveFlags パラメーターで 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 が FilterReceiveNetBufferListsReceiveFlags パラメーターで NDIS_RECEIVE_FLAGS_RESOURCES フラグを設定した場合でも、フィルター ドライバーは NdisFIndicateReceiveNetBufferLists を使用してバッファーを渡すことができます。 この場合、フィルター ドライバーは、バッファーの所有権を回復するまで FilterReceiveNetBufferLists から戻ってはなりません。

  • バッファーを破棄します。 NDIS が FilterReceiveNetBufferListsReceiveFlags パラメーターで NDIS_RECEIVE_FLAGS_RESOURCES フラグをクリアした場合、NdisFReturnNetBufferLists 関数を呼び出してバッファーを破棄します。 NDIS が FilterReceiveNetBufferListsReceiveFlags パラメーターで NDIS_RECEIVE_FLAGS_RESOURCES フラグを設定した場合、アクションを実行せず、FilterReceiveNetBufferLists から戻ってバッファーを破棄します。

  • 後で処理するために、バッファーをローカル データ構造のキューに入れます。 NDIS が FilterReceiveNetBufferListsReceiveFlags パラメーターで NDIS_RECEIVE_FLAGS_RESOURCES フラグを設定した場合、フィルター ドライバーは FilterReceiveNetBufferLists から戻る前にコピーを作成する必要があります。

  • バッファーをコピーし、コピーを使って受信通知を生成します。 受信インジケーターは、フィルター ドライバーによって開始された受信インジケーターに似ています。 この場合、ドライバーは、基になるドライバーに元のバッファーを返す必要があります。

NdisFIndicateReceiveNetBufferLists 関数は、ドライバー スタックの上にある NET_BUFFER_LIST 構造の指定されたリストを、上位のドライバーに渡します。 受信操作は、フィルター ドライバーによって開始された受信操作と同じように続行されます。

基になるドライバーがバッファーの所有権を保持している場合、NDIS はフィルター モジュールの FilterReturnNetBufferLists 関数を呼び出します。 その FilterReturnNetBufferLists 関数では、フィルター ドライバーは、受信指示パスのバッファーに対して実行した操作を元に戻します。

最下位レイヤー フィルター モジュールがバッファーで行われることを示す場合、NDIS はバッファーをミニポート ドライバーに返します。 NDIS が FilterReceiveNetBufferListsReceiveFlags パラメーターの NDIS_RECEIVE_FLAGS_RESOURCES フラグをクリアした場合、フィルター ドライバーは NdisFReturnNetBufferLists を呼び出してバッファーを返します。 NDIS が FilterReceiveNetBufferListsReceiveFlags パラメーターで NDIS_RECEIVE_FLAGS_RESOURCES フラグを設定した場合、FilterReceiveNetBufferLists から戻るとバッファーが返されます。