次の方法で共有


FwpsConstructIpHeaderForTransportPacket0 関数 (fwpsk.h)

FwpsConstructIpHeaderForTransportPacket0 関数は、新しい IP ヘッダーを構築したり、既存の IP パケット ヘッダーを 1 つのネット バッファーのみに再構築したりするために、コールアウトによって呼び出されます。

注意FwpsConstructIpHeaderForTransportPacket0 は、FwpsConstructIpHeaderForTransportPacketの特定のバージョンです。 詳細については、「WFP Version-Independent 名の と Windows の特定のバージョンを対象とする」を参照してください。
 

構文

NTSTATUS FwpsConstructIpHeaderForTransportPacket0(
  [in, out]      NET_BUFFER_LIST  *netBufferList,
                 ULONG            headerIncludeHeaderLength,
  [in]           ADDRESS_FAMILY   addressFamily,
  [in]           const UCHAR      *sourceAddress,
  [in]           const UCHAR      *remoteAddress,
  [in]           IPPROTO          nextProtocol,
  [in, optional] UINT64           endpointHandle,
  [in, optional] const WSACMSGHDR *controlData,
  [in]           ULONG            controlDataLength,
  [in]           UINT32           flags,
                 PVOID            reserved,
  [in, optional] IF_INDEX         interfaceIndex,
  [in, optional] IF_INDEX         subInterfaceIndex
);

パラメーター

[in, out] netBufferList

新しい IP ヘッダーを構築または再構築する複製されたトランスポート層パケット データを記述する NET_BUFFER_LIST 構造体へのポインター。 新しい IP ヘッダーを作成するには、複製されたNET_BUFFER_LIST構造体のオフセットをトランスポート ヘッダーの先頭に配置します。 既存の IP パケット ヘッダーを再構築するには、IP ヘッダーの先頭にあるオフセットを見つけます。

headerIncludeHeaderLength

NetBufferList が指すNET_BUFFER_LIST構造体に既に IP ヘッダーが含まれている場合は、既存の IP ヘッダーの合計サイズ (バイト単位) を示します (存在する場合)。 NetBufferList に IP ヘッダーが含まれていない場合、headerIncludeHeaderSize は 0 になります。 それ以外の場合、このパラメーターの値は 、吹き出しドライバーの classifyFn 吹き出し関数に渡される FWPS_INCOMING_METADATA_VALUES0 構造体。 IPv4 オプションは保持されますが、この関数が呼び出されると、既存の IPv6 ヘッダーの拡張ヘッダーは削除されることに注意してください。 詳細については、「解説」を参照してください。

[in] addressFamily

次のいずれかのアドレス ファミリ:

AF_INET

IPv4 アドレス ファミリ。

AF_INET6

IPv6 アドレス ファミリ。

[in] sourceAddress

構築する IP ヘッダーの一部となるソース IP アドレスへのポインター。 IPv4 の場合、アドレスは 4 バイトです。 IPv6 の場合、アドレスは 16 バイトです。 ソース アドレスのバイトは、常にネットワーク のバイト順です。

[in] remoteAddress

構築する IP ヘッダーの一部となるリモート IP アドレスを指定するバッファーへのポインター。

バッファーには、IPv4 アドレス (4 バイト) または IPv6 アドレス (16 バイト) を含めることができます。また、アドレスはネットワークのバイト順で指定する必要があります。 IP バージョンは、addressFamily パラメーターと一致する必要があります。

[in] nextProtocol

構築する新しい IP ヘッダーの IPPROTO プロトコルの種類を指定します。 IPPROTO 列挙体の詳細については、AF_INET または AF_INET6を参照してください。

[in, optional] endpointHandle

パケットの挿入先となる送信データ パス内のスタック トランスポート エンドポイントを示す省略可能なハンドル。 このエンドポイント ハンドルは、transportEndpointHandle メンバーを介して吹き出しに提供されます。吹き出しドライバーの classifyFn 吹き出し関数に渡される FWPS_INCOMING_METADATA_VALUES0 構造体。

[in, optional] controlData

WSASendMsg 関数で指定されたソケット制御データを含むバッファーへの省略可能なポインター。このポインターは、Microsoft Windows SDK のドキュメントで説明されています。 WSACMSGHDR タイプの詳細については、CMSGHDR を参照してください。

存在する場合、ソケット コントロール データは、controlData メンバーを持つ吹き出しに提供されます。吹き出しドライバーの classifyFn 吹き出し関数に渡される FWPS_INCOMING_METADATA_VALUES0 構造体。

ソケット制御データが NULL されていない場合は、classifyFn 関数のコールアウト ドライバーの実装で深くコピーする必要があります。また、controlData バッファーは、インジェクション完了関数が呼び出されるまで有効なままにする必要があります。

[in] controlDataLength

controlData パラメーターの長さ (バイト単位)。

[in] flags

NBL が送信パスまたは受信パスを対象とするかどうかを指定するフラグ。 パラメーター フラグには、次の値を指定できます。

価値 意味
FWPS_CONSTRUCT_IPHEADER_FOR_SEND このフラグを設定すると、NBL が送信パスを対象としていることを指定します。
FWPS_CONSTRUCT_IPHEADER_FOR_RECEIVE このフラグを設定すると、NBL が受信パスを対象としていることを指定します。

USO または URO をサポートするコールアウト ドライバーの場合は、このパラメーターを次のいずれかの値に設定する必要があります。 他の引き出し線ドライバーは、このパラメーターを 0 設定できます。 これらのフラグは、Windows Server 2022 23H2 以降でのみサポートされます。 Windows の以前のリリースでは、引き出し線ドライバーは常にこのパラメーターを 0 設定する必要があります。

reserved

引っ込み思案。 コールアウト ドライバーでは、このパラメーターを NULL 設定する必要があります。

[in, optional] interfaceIndex

元のパケット データを受信したインターフェイスのインデックス。 引き出しドライバーは、このパラメーターの classifyFn 吹き出し関数に受信データ値の 1 つとして渡されるインターフェイス インデックスの値を使用する必要があります。 このパラメーターは省略可能で、0 にすることができます。

[in, optional] subInterfaceIndex

元のパケット データを受信したサブインターフェイスのインデックス。 コールアウト ドライバーは、パケットが元のパケットが示されたのと同じサブインターフェイスに挿入される場合、このパラメーターの classifyFn 吹き出し関数に受信データ値の 1 つとして渡されるサブインターフェイス インデックスの値を使用する必要があります。 このパラメーターは省略可能で、0 にすることができます。

戻り値

FwpsConstructIpHeaderForTransportPacket0 関数は、次のいずれかの NTSTATUS コードを返します。

リターン コード 形容
STATUS_SUCCESS
新しい IP ヘッダーが正常に構築されました。
その他の状態コードの
エラーが発生しました。

備考

WFP 送信トランスポート層 (FWPS_LAYER_OUTBOUND_TRANSPORT_Xxx) で複製されたネット バッファー リストから、FwpsConstructIpHeaderForTransportPacket0 、ネット バッファー リスト チェーンの一部である各ネット バッファーの新しいヘッダーを構築します。 この関数を使用して、パケットの既存の IP ヘッダーを再構築することもできます。この場合、ネット バッファー リストには 1 つのネット バッファーのみを含める必要があります。

この関数は、IP ヘッダーがまだ作成されていないが、ソース IP アドレスまたはソース ポートをトランスポート層から変更する必要がある場合に便利です。 通常は、パケットがネットワーク 層に到達するまでこのような変更を実行するのを待つことができますが、IP パケットが暗号化またはデジタル署名された IPsec 環境では、ネットワーク層に到達する前にこれを行うことはできません。

ソース IP アドレスは、別のローカルで定義された IP アドレスまたはローカル コンピューターに存在しない別のアドレスに変更できます。 変更されたパケットは、受信または転送データ パスに送信または挿入できます。

endpointHandle パラメーター 0 以外の値を指定すると、ソケットに関連付けられているセッション状態 (ソケット オプション) が使用され、各新しい IP ヘッダーが作成されます。 同様に、controlData と controlDataLength パラメーターを使用して追加のソケット オプション 指定した場合、これらのオプションを使用して新しい IP ヘッダーが作成されます。

入力ネット バッファー リストが受信 WFP トランスポート 層から複製された場合、または未加工の送信操作の結果として作成された場合、ネット バッファーには既に IP ヘッダーが含まれます。 この場合、この関数が呼び出されると、IPv4 オプションは新しい IP ヘッダーに保持されますが、AH/ESP ヘッダーと IPv6 拡張ヘッダーは削除されます。 TCP/IP スタックは IPsec 処理後も AH/ESP ヘッダーを保持するため、WFP によって示され、吹き出しによって複製されたパケットを受信データ パスに簡単に挿入することはできません。 したがって、この関数は、FwpsInjectTransportReceiveAsync0 関数を使用して受信データ パスに挿入される IPsec で処理されたパケットを再構築する場合に便利です。

ヘッダーインクルード セッションの場合。たとえば、送信トランスポート 層から生ソケットに送信された汎用ルーティング カプセル化 (GRE) トラフィック (IP プロトコル 47) をフィルター処理するには、FwpsConstructIpHeaderForTransportPacket0 呼び出す前に、次の手順を使用します。

  1. を呼び出して、ネット バッファー リストを複製します。FwpsAllocateCloneNetBufferList0 関数を します。
  2. headerIncludeHeaderLengthclassifyFn 関数の inMetaValues パラメーターによって指されているFWPS_INCOMING_METADATA_VALUES0構造体のメンバーが 0 より大きい場合は、複製されたネット バッファー リストをその量ずつ退避します。たとえば、NdisRetreatNetBufferListDataStart 呼び出しによって。
  3. FWPS_INCOMING_METADATA_VALUES0の headerIncludeHeader メンバーが指すバッファーを、複製されたネット バッファー リストの新しく退避された領域にコピーします。 バッファーのサイズは、headerIncludeHeaderLength の値等しい必要があります。
  4. 複製された net バッファー リストを指す NetBufferList パラメーターを持つ FwpsConstructIpHeaderForTransportPacket0 を呼び出し、headerIncludeHeaderSize パラメーター headerIncludeHeaderLengthの値に設定します。
FwpsConstructIpHeaderForTransportPacket0 は、結果として得られる net バッファー リストの大規模送信オフロード (LSO) とチェックサム オフロードのサポートを無効にします。 完全なチェックサムは、上位レベルのプロトコル (TCP、UDP、ICMP) に対して計算されます。 IP ヘッダーが再構築されると、IP チェックサムが再計算されます。

必要条件

要件 価値
サポートされる最小クライアント Windows Server 2008 以降で使用できます。
ターゲット プラットフォーム 万国
ヘッダー fwpsk.h (Fwpsk.h を含む)
ライブラリ Fwpkclnt.lib
IRQL <= DISPATCH_LEVEL

関連項目

AF_INET

AF_INET6

CMSGHDR する

FWPS_INCOMING_METADATA_VALUES0 FwpsInjectTransportReceiveAsync0

NET_BUFFER_LIST

classifyFn