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

NDIS は FilterSendNetBufferLists 関数を呼び出して、フィルター ドライバーがNET_BUFFER_LIST構造のリンクされたリスト フィルター処理できるようにします。

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

構文

FILTER_SEND_NET_BUFFER_LISTS FilterSendNetBufferLists;

void FilterSendNetBufferLists(
  [in] NDIS_HANDLE FilterModuleContext,
       PNET_BUFFER_LIST NetBufferList,
  [in] NDIS_PORT_NUMBER PortNumber,
  [in] ULONG SendFlags
)
{...}

パラメーター

[in] FilterModuleContext

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

NetBufferList

NET_BUFFER構造体のリストを指定するNET_BUFFER_LIST構造体のリンクされたリストへのポインター。 リスト内 の各NET_BUFFER は、送信データを含む MDL のチェーンをマップします。

[in] PortNumber

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

[in] SendFlags

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

NDIS_SEND_FLAGS_DISPATCH_LEVEL

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

NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK

NDIS がループバック用にチェックすることを指定します。 既定では、NDIS は送信要求を送信したドライバーにデータをループ バックしません。 上にあるドライバーは、このフラグを設定することで、この動作をオーバーライドできます。 このフラグが設定されている場合、NDIS は、バインドの受信条件に一致するデータを含むすべての NET_BUFFER 構造体を識別します。 NDIS は、NET_BUFFER 基になるドライバーの条件に一致する構造体を示します。 このフラグは、他のバインディングでのループバックのチェックやループバックには影響しません。

NDIS_SEND_FLAGS_SWITCH_SINGLE_SOURCE

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

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

メモNET_BUFFER_LIST構造体のリンクされたリスト内の各パケットが同じソース ポートを使用する場合、拡張機能は送信要求の完了時に NdisFSendNetBufferListsCompleteSendCompleteFlags パラメーターに NDIS_SEND_COMPLETE_FLAGS_SWITCH_SINGLE_SOURCE フラグを設定する必要があります。
 
メモ このフラグは、NDIS 6.30 以降で使用できます。
 

NDIS_SEND_FLAGS_SWITCH_DESTINATION_GROUP

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

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

メモ このフラグは、NDIS 6.30 以降で使用できます。
 

戻り値

なし

解説

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

フィルター ドライバーが FilterSendNetBufferLists 関数を指定し、キューに要求を送信する場合は、 も指定する必要があります。 FilterCancelSendNetBufferLists 関数。

フィルター ドライバーは、FilterSetModuleOptions 関数から NdisSetOptionalHandlers 関数を呼び出して、フィルター モジュールの FilterSendNetBufferLists 関数を指定できます。

フィルター ドライバーで FilterSendNetBufferLists 関数が指定されている場合、NDIS はこの関数を呼び出して、ネットワーク経由で NET_BUFFER 構造体の一覧に含まれるデータをフィルター処理します。 NDIS は、各NET_BUFFER_LIST構造体 のNET_BUFFER 構造体の一覧 指定します。

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

フィルター ドライバーは、データをフィルター処理し、フィルター処理されたデータを基になるドライバーに送信できます。 FilterSendNetBufferLists に送信されたNET_BUFFER構造体ごとに、フィルター ドライバーは次の操作を実行できます。

  • NdisFSendNetBufferLists 関数を呼び出して、次の基になるドライバーにバッファーを渡します。 フィルター ドライバーは、 NdisFSendNetBufferLists を呼び出す前にバッファーの内容を変更できます。 この場合、NDIS は を呼び出します。基になるドライバーが送信要求を完了した後の FilterSendNetBufferListsComplete 関数。
  • NdisFSendNetBufferListsComplete 関数を呼び出してバッファーを拒否します。
  • 後で処理するために、バッファーをローカル データ構造にキューに入れます。
  • バッファーをコピーし、コピーを使用して送信要求を送信します。 送信操作は、フィルター ドライバーによって開始される送信要求に似ています。 この場合、ドライバーは NdisFSendNetBufferListsComplete 関数を呼び出して、基になるドライバーに元のバッファーを返す必要があります。
送信操作が完了すると、フィルター ドライバーは、変更がある場合は、 FilterSendNetBufferLists 関数で行ったバッファー記述子に戻します。 ドライバーは NdisFSendNetBufferListsComplete 関数を呼び出して NET_BUFFER_LIST構造体のリンクされたリストを上にあるドライバーに返し、送信要求の最終状態を返します。

フィルター モジュールが 一時停止 状態の場合、フィルター ドライバーは、そのフィルター モジュールの送信要求を送信してはなりません。 NDIS が FilterSendNetBufferLists を呼び出す場合、ドライバーは NdisFSendNetBufferLists を呼び出して、ドライバーが再起動されるまでデータを渡す必要があります。 ドライバーは、送信操作を完了するために、 すぐに NdisFSendNetBufferListsComplete を呼び出す必要があります。 各NET_BUFFER_LIST構造の完全な状態 をNDIS_STATUS_PAUSED に設定する必要があります。

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

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

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

FILTER_SEND_NET_BUFFER_LISTS MySendNetBufferLists;

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

_Use_decl_annotations_
VOID
 MySendNetBufferLists(
    NDIS_HANDLE  FilterModuleContext,
    PNET_BUFFER_LIST  NetBufferLists,
    NDIS_PORT_NUMBER  PortNumber,
    ULONG  SendFlags
    )
  {...}

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

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

要件

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

こちらもご覧ください

FilterAttach

FilterCancelSendNetBufferLists FilterSendNetBufferListsComplete

FilterSetModuleOptions

MiniportSendNetBufferLists

NET_BUFFER

NET_BUFFER_LIST

NdisFRegisterFilterDriver

NdisFSendNetBufferLists

NdisFSendNetBufferListsComplete

NdisMAllocatePort

NdisSetOptionalHandlers

NdisWriteEventLogEntry