次の方法で共有


FILTER_RECEIVE_NET_BUFFER_LISTS コールバック関数 (ndis.h)

NDIS は 、FilterReceiveNetBufferLists 関数を呼び出して、受信通知を処理するフィルター ドライバーを要求します。

メモFILTER_RECEIVE_NET_BUFFER_LISTS型を使用して関数を宣言する必要があります。 詳細については、次の例に関するセクションを参照してください。
 

構文

FILTER_RECEIVE_NET_BUFFER_LISTS FilterReceiveNetBufferLists;

void FilterReceiveNetBufferLists(
  [in] NDIS_HANDLE FilterModuleContext,
  [in] PNET_BUFFER_LIST NetBufferLists,
  [in] NDIS_PORT_NUMBER PortNumber,
  [in] ULONG NumberOfNetBufferLists,
  [in] ULONG ReceiveFlags
)
{...}

パラメーター

[in] FilterModuleContext

フィルター モジュールのコンテキスト領域へのハンドル。 FilterAttach 関数でこのコンテキスト領域を作成および初期化したフィルター ドライバー。

[in] NetBufferLists

基になるドライバーによって割り当てられた NET_BUFFER_LIST 構造体のリンクされたリスト。 各 NET_BUFFER_LIST 構造体には、1 つの NET_BUFFER 構造体が含まれています。

[in] PortNumber

ミニポート アダプターのポートを識別するポート番号。 ミニポート アダプターのポート番号は、 NdisMAllocatePort 関数を呼び出すことによって割り当てられます。 0 の値は、ミニポート アダプターの既定のポートを識別します。

[in] NumberOfNetBufferLists

NetBufferListsの構造体のリンクリストにあるNET_BUFFER_LIST構造体の数。

[in] ReceiveFlags

受信インジケーターの属性を定義するフラグ。 フラグは OR 操作と組み合わせることができます。 すべてのフラグをクリアするには、このメンバーを 0 に設定します。 この関数は、次のフラグをサポートしています。

NDIS_RECEIVE_FLAGS_DISPATCH_LEVEL

現在の IRQL がDISPATCH_LEVELされることを指定します。 このフラグの詳細については、「 ディスパッチ IRQL 追跡」を参照してください。

NDIS_RECEIVE_FLAGS_RESOURCES

FilterReceiveNetBufferLists の呼び出しが返された直後に、NDIS がNET_BUFFER_LIST構造体とアタッチされているNET_BUFFER構造体の所有権を再利用することを指定します。

NDIS_RECEIVE_FLAGS_SINGLE_ETHER_TYPE

NetBufferLists のリスト内のすべてのNET_BUFFER_LIST構造体が同じプロトコルの種類 (EtherType) であることを指定します。

NDIS_RECEIVE_FLAGS_SINGLE_VLAN

NetBufferLists のリスト内のすべてのNET_BUFFER_LIST構造が同じ VLAN に属することを指定します。

NDIS_RECEIVE_FLAGS_PERFECT_FILTERED

NetBufferLists のリスト内のすべてのNET_BUFFER_LIST構造体に、ミニポート アダプターに割り当てられているパケット フィルターとマルチキャスト アドレス一覧に一致するデータのみを含むように指定します。

NDIS_RECEIVE_FLAGS_SINGLE_QUEUE

NetBufferLists のリスト内のすべてのNET_BUFFER_LIST構造体が同じ VM キューに属することを指定します。 ミニポート ドライバーは、NDIS_RECEIVE_QUEUE_PARAMETERS_PER_QUEUE_RECEIVE_INDICATION フラグが の Flags メンバーに設定されている場合、キューのすべての受信通知に対してこの フラグ を設定する必要があります。 その キューが割り当てられたときに構造体をNDIS_RECEIVE_QUEUE_PARAMETERSします。

NDIS_RECEIVE_FLAGS_SHARED_MEMORY_INFO_VALID

NetBufferLists のリスト内のすべてのNET_BUFFER_LIST構造体に、有効な共有メモリ情報が含まれていることを指定します。 受信した NET_BUFFER_LISTでこのフラグが設定されている場合、NDIS は共有メモリ情報を有効として扱います。 このフラグが設定されていない場合、NDIS とドライバーは共有メモリ情報を無視します。 たとえば、パケット データを変更する中間ドライバーでは、このフラグを使用して、データをコピーする必要があるかどうかを判断できます。 ミニポート ドライバーは、 フラグを使用して、キューが削除されたときに VM キューに関連付けられているメモリを解放する方法を決定できます。

NDIS_RECEIVE_FLAGS_MORE_NBLS

予約済み。

NDIS_RECEIVE_FLAGS_SWITCH_SINGLE_SOURCE

このフラグが設定されている場合、 NET_BUFFER_LIST 構造のリンクされたリスト内のすべてのパケットは、同じ Hyper-V 拡張可能スイッチのソース ポートから送信されます。

詳細については、「 Hyper-V 拡張可能スイッチの送受信フラグ」を参照してください。

メモNET_BUFFER_LIST構造体のリンクされたリスト内の各パケットが同じソース ポートを使用する場合、拡張機能は、受信要求の完了時に FilterReturnNetBufferListsReturnFlags パラメーターにNDIS_RETURN_FLAGS_SWITCH_SINGLE_SOURCE フラグを設定する必要があります。 この拡張機能は、NdisFReturnNetBufferLists を呼び出して、発信元または複製されなかったパケットを返す場合は、ReturnFlags パラメーターでこのフラグを設定する必要があります。
 

NDIS_RECEIVE_FLAGS_SWITCH_DESTINATION_GROUP

このフラグが設定されている場合、 NET_BUFFER_LIST 構造のリンクされたリスト内のすべてのパケットは、同じ拡張可能スイッチの宛先ポートに転送されます。

詳細については、「 Hyper-V 拡張可能スイッチの送受信フラグ」を参照してください。

メモNET_BUFFER_LIST構造体のリンクリスト内の各パケットが同じ宛先ポートを使用する場合、拡張機能は、受信要求の完了時に FilterReturnNetBufferListsReturnFlags パラメーターにNDIS_RECEIVE_FLAGS_SWITCH_DESTINATION_GROUP フラグを設定する必要があります。 この拡張機能は、NdisFReturnNetBufferLists を呼び出して、発信元または複製されなかったパケットを返す場合は、ReturnFlags パラメーターでこのフラグを設定する必要があります。
 

戻り値

なし

解説

FilterReceiveNetBufferLists は省略可能な関数です。 フィルター ドライバーが受信通知をフィルター処理しない場合は、 を呼び出すときに、この関数のエントリ ポイントを NULL に設定できます。 NdisFRegisterFilterDriver 関数。

メモFilterReceiveNetBufferLists 関数を提供するフィルター ドライバーは、FilterStatus 関数を提供する必要があります。
 
フィルター ドライバーは、FilterSetModuleOptions 関数から NdisSetOptionalHandlers 関数を呼び出して、フィルター モジュールの FilterReceiveNetBufferLists 関数を指定できます。

NDIS は FilterReceiveNetBufferLists を呼び出して、基になるドライバーによって開始される通知を受け取る処理を行います。 NDIS は、ループバックの結果としてこの関数を呼び出すこともできます。

フィルター ドライバーが FilterReceiveNetBufferLists 関数を指定しなかった場合、NDIS は、 FilterReceiveNetBufferLists 関数を指定したスタック内の次の上位のフィルター ドライバーを呼び出します。 このようなフィルター ドライバーがない場合、NDIS は、基になるドライバーを呼び出します。 ProtocolReceiveNetBufferLists 関数。

ReceiveFlags パラメーターのNDIS_RECEIVE_FLAGS_RESOURCES フラグが設定されていない場合、フィルター ドライバーは、 を呼び出すまでNET_BUFFER_LIST構造体の所有権を保持します。 NdisFReturnNetBufferLists 関数。

ReceiveFlags パラメーターのNDIS_RECEIVE_FLAGS_RESOURCES フラグが設定されている場合、フィルター ドライバーは、NET_BUFFER_LIST構造と、基になるドライバーによって割り当てられたリソースを保持できません。 このフラグは、基になるドライバーが受信リソースで不足していることを示すことができます。 FilterReceiveNetBufferLists 関数は、できるだけ早くを返す必要があります。 返す前に、 FilterReceiveNetBufferLists 関数は、受信したデータをフィルター ドライバーによって割り当てられたストレージにコピーするか、 を呼び出してバッファーを渡すことができます。 NdisFIndicateReceiveNetBufferLists 関数。

メモNDIS_RECEIVE_FLAGS_RESOURCES フラグが設定されている場合、フィルター ドライバーはリンク リスト内の元のNET_BUFFER_LIST構造体のセットを保持する必要があります。 たとえば、このフラグが設定されている場合、ドライバーは構造体を処理し、一度に 1 つずつスタックを上に示しますが、関数が返す前に元のリンク リストを復元する必要があります。
 
フィルター ドライバーは、データを基になるドライバーに示す前に、受信したデータをフィルター処理できます。 FilterReceiveNetBufferLists 関数に送信されるバッファーごとに、フィルター ドライバーは次の操作を実行できます。
  • を呼び出して、次の上にあるドライバーにバッファーを渡します。 NdisFIndicateReceiveNetBufferLists 関数。

    ドライバーは、 NdisFIndicateReceiveNetBufferLists を呼び出す前にバッファーの内容を変更できます。

    ドライバーは、NDIS が FilterReceiveNetBufferLists に渡したNDIS_RECEIVE_FLAGS_RESOURCES フラグ設定を変更するか、単に NdisFIndicateReceiveNetBufferLists に渡すことができます。

  • バッファーを破棄します。 NDIS が NDIS_RECEIVE_FLAGS_RESOURCES フラグをクリアした場合は、 NdisFReturnNetBufferLists 関数を呼び出してバッファーを破棄します。 NDIS が NDIS_RECEIVE_FLAGS_RESOURCES フラグを設定した場合は、何も操作を実行せず、 FilterReceiveNetBufferLists から戻ってバッファーを破棄します。
  • 後で処理するために、バッファーをローカル データ構造にキューに入れます。 NDIS が FilterReceiveNetBufferListsNDIS_RECEIVE_FLAGS_RESOURCES フラグを設定した場合、フィルター ドライバーは FilterReceiveNetBufferLists から戻る前にコピーを作成する必要があります。
  • バッファーをコピーし、コピーを使用して受信通知を生成します。 受信インジケーターは、フィルター ドライバーによって開始された受信インジケーターに似ています。 この場合、ドライバーは基になるドライバーに元のバッファーを返す必要があります。
NdisFIndicateReceiveNetBufferLists というフィルター ドライバーがNDIS_RECEIVE_FLAGS_RESOURCES フラグを設定しなかった場合、NDIS は を呼び出します。フィルター モジュールの FilterReturnNetBufferLists 関数。 FilterReturnNetBufferLists 関数では、フィルター ドライバーは、受信表示パスのバッファーに対して実行した操作を元に戻します。

フィルター モジュールが 一時停止 状態の場合、フィルター ドライバーは、そのフィルター モジュールの受信通知を生成してはなりません。 フィルター ドライバーは、作成したバッファーを NdisFIndicateReceiveNetBufferLists に渡してはなりません。 ただし、ドライバーは、基になるドライバーからの受信通知を渡すことができます。

NDIS は、IRQL <= DISPATCH_LEVELで FilterReceiveNetBufferLists を呼び出します。

FilterReceiveNetBufferLists 関数を定義するには、まず、定義する関数の種類を識別する関数宣言を指定する必要があります。 Windows には、ドライバー用の一連の関数型が用意されています。 関数の種類を使用して関数を宣言すると、ドライバー、静的ドライバー検証ツール (SDV)、およびその他の検証ツールのコード分析でエラーが検出され、Windows オペレーティング システムのドライバーを記述するための要件になります。

たとえば、" MyReceiveNetBufferLists" という名前の FilterReceiveNetBufferLists 関数を定義するには、次のコード例に示すように FILTER_RECEIVE_NET_BUFFER_LISTS 型を使用します。

FILTER_RECEIVE_NET_BUFFER_LISTS MyReceiveNetBufferLists;

次に、次のように関数を実装します。

_Use_decl_annotations_
VOID
 MyReceiveNetBufferLists(
    NDIS_HANDLE  FilterModuleContext,
    PNET_BUFFER_LIST  NetBufferLists,
    NDIS_PORT_NUMBER  PortNumber,
    ULONG  NumberOfNetBufferLists,
    ULONG  ReceiveFlags
    )
  {...}

FILTER_RECEIVE_NET_BUFFER_LISTS関数の種類は、Ndis.h ヘッダー ファイルで定義されています。 コード分析ツールの実行時にエラーをより正確に識別するには、 Use_decl_annotations 注釈を関数定義に追加してください。 Use_decl_annotations注釈を使用すると、ヘッダー ファイル内のFILTER_RECEIVE_NET_BUFFER_LISTS関数型に適用される注釈が確実に使用されます。 関数宣言の要件の詳細については、「NDIS ドライバーの関数 ロール型を使用して関数を宣言する」を参照してください。

Use_decl_annotationsの詳細については、「関数の動作に注釈を付ける」を参照してください。

要件

要件
サポートされている最小のクライアント NDIS 6.0 以降でサポートされています。
対象プラットフォーム Windows
ヘッダー ndis.h (Ndis.h を含む)
IRQL <= DISPATCH_LEVEL

こちらもご覧ください

FilterAttach

FilterReturnNetBufferLists

FilterSetModuleOptions

NDIS_RECEIVE_QUEUE_PARAMETERS

NET_BUFFER

NET_BUFFER_LIST

NdisFIndicateReceiveNetBufferLists

NdisFRegisterFilterDriver

NdisFReturnNetBufferLists

NdisMAllocatePort

NdisSetOptionalHandlers

ProtocolReceiveNetBufferLists