FILTER_RECEIVE_NET_BUFFER_LISTS コールバック関数 (ndis.h)
NDIS は 、FilterReceiveNetBufferLists 関数を呼び出して、受信通知を処理するフィルター ドライバーを要求します。
構文
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 拡張可能スイッチの送受信フラグ」を参照してください。
NDIS_RECEIVE_FLAGS_SWITCH_DESTINATION_GROUP
このフラグが設定されている場合、 NET_BUFFER_LIST 構造のリンクされたリスト内のすべてのパケットは、同じ拡張可能スイッチの宛先ポートに転送されます。
詳細については、「 Hyper-V 拡張可能スイッチの送受信フラグ」を参照してください。
戻り値
なし
解説
FilterReceiveNetBufferLists は省略可能な関数です。 フィルター ドライバーが受信通知をフィルター処理しない場合は、 を呼び出すときに、この関数のエントリ ポイントを NULL に設定できます。 NdisFRegisterFilterDriver 関数。
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 関数。
-
を呼び出して、次の上にあるドライバーにバッファーを渡します。 NdisFIndicateReceiveNetBufferLists 関数。
ドライバーは、 NdisFIndicateReceiveNetBufferLists を呼び出す前にバッファーの内容を変更できます。
ドライバーは、NDIS が FilterReceiveNetBufferLists に渡したNDIS_RECEIVE_FLAGS_RESOURCES フラグ設定を変更するか、単に NdisFIndicateReceiveNetBufferLists に渡すことができます。
- バッファーを破棄します。 NDIS が NDIS_RECEIVE_FLAGS_RESOURCES フラグをクリアした場合は、 NdisFReturnNetBufferLists 関数を呼び出してバッファーを破棄します。 NDIS が NDIS_RECEIVE_FLAGS_RESOURCES フラグを設定した場合は、何も操作を実行せず、 FilterReceiveNetBufferLists から戻ってバッファーを破棄します。
- 後で処理するために、バッファーをローカル データ構造にキューに入れます。 NDIS が FilterReceiveNetBufferLists のNDIS_RECEIVE_FLAGS_RESOURCES フラグを設定した場合、フィルター ドライバーは FilterReceiveNetBufferLists から戻る前にコピーを作成する必要があります。
- バッファーをコピーし、コピーを使用して受信通知を生成します。 受信インジケーターは、フィルター ドライバーによって開始された受信インジケーターに似ています。 この場合、ドライバーは基になるドライバーに元のバッファーを返す必要があります。
フィルター モジュールが 一時停止 状態の場合、フィルター ドライバーは、そのフィルター モジュールの受信通知を生成してはなりません。 フィルター ドライバーは、作成したバッファーを 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 |
こちらもご覧ください
NdisFIndicateReceiveNetBufferLists ProtocolReceiveNetBufferListsフィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示