FwpsConstructIpHeaderForTransportPacket0 関数 (fwpsk.h)
FwpsConstructIpHeaderForTransportPacket0 関数は、コールアウトによって呼び出され、新しい IP ヘッダーを構築するか、既存の IP パケット ヘッダーを 1 つのネット バッファーに対してのみ再構築します。
構文
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 です。 それ以外の場合、このパラメーターの値は、 の ipHeaderSize メンバーと等しくなります。 FWPS_INCOMING_METADATA_VALUES0 吹き出しドライバーの classifyFn 吹き出し関数に渡される構造体です。 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 メンバーを介して吹き出しに提供されます。 FWPS_INCOMING_METADATA_VALUES0 吹き出しドライバーの classifyFn 吹き出し関数に渡される構造体です。
[in, optional] controlData
WSASendMsg 関数で指定されたソケット制御データを含むバッファーへの省略可能なポインター。このポインターは、Microsoft Windows SDKドキュメントで説明されています。 WSACMSGHDR タイプの詳細については、 CMSGHDR を参照してください。
存在する場合、ソケット コントロール データは、 の controlData メンバーを持つ吹き出しに提供されます。 FWPS_INCOMING_METADATA_VALUES0 吹き出しドライバーの classifyFn 吹き出し関数に渡される構造体です。
ソケット コントロール データが NULL でない場合は、呼び出しドライバーの classifyFn 関数の実装で深くコピーする必要があります。また、挿入完了関数が呼び出されるまで controlData バッファーを有効にしておく必要があります。
[in] controlDataLength
controlData パラメーターの長さ (バイト単位)。
[in] flags
NBL が送信パスと受信パスのどちらを対象とするかを指定するフラグ。 flags パラメーターには、次の値を指定できます。
値 | 意味 |
---|---|
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 コードを返します。
リターン コード | 説明 |
---|---|
|
新しい IP ヘッダーが正常に構築されました。 |
|
エラーが発生しました。 |
解説
WFP 送信トランスポート層 (FWPS_LAYER_OUTBOUND_TRANSPORT_Xxx) で複製されたネット バッファー リストから、 FwpsConstructIpHeaderForTransportPacket0 は、ネット バッファー リスト チェーンの一部である各ネット バッファーの新しいヘッダーを構築します。 この関数を使用して、パケットの既存の IP ヘッダーを再構築することもできます。この場合、ネット バッファー リストには 1 つのネット バッファーのみを含める必要があります。
この関数は、IP ヘッダーがまだ作成されていないが、ソース IP アドレスまたはソース ポートをトランスポート 層から変更する必要がある場合に便利です。 通常は、パケットがネットワーク層に到達するまでこのような変更を実行するのを待つことができますが、IP パケットが暗号化またはデジタル署名された IPsec 環境では、ネットワーク層に到達できません。
ソース IP アドレスは、別のローカルで定義された IP アドレスまたはローカル コンピューターに存在しない別のアドレスに変更できます。 変更されたパケットは、受信または転送データ パスに送信または挿入できます。
0 以外の endpointHandle パラメーターを指定すると、ソケットに関連付けられているセッション状態 (ソケット オプション) が使用され、各新しい IP ヘッダーが作成されます。 同様に、controlData パラメーターと controlDataLength パラメーターを使用して追加のソケット オプションを指定した場合、これらのオプションを使用して各新しい IP ヘッダーが作成されます。
入力ネット バッファー リストが受信 WFP トランスポート 層から複製された場合、または未加工の送信操作の結果として作成された場合、ネット バッファーには既に IP ヘッダーが含まれます。 この場合、この関数が呼び出されると、IPv4 オプションは新しい IP ヘッダーに保持されますが、AH/ESP ヘッダーと IPv6 拡張ヘッダーは削除されます。 TCP/IP スタックは IPsec 処理後も AH/ESP ヘッダーを保持するため、WFP によって示され、コールアウトによって複製されたパケットを受信データ パスに簡単に挿入することはできません。 したがって、この関数は 、FwpsInjectTransportReceiveAsync0 関数を使用して受信データ パスに挿入される IPsec で処理されたパケットを再構築する場合に役立ちます。
ヘッダーインクルード セッションの場合。たとえば、送信トランスポート 層から生ソケットで送信された汎用ルーティング カプセル化 (GRE) トラフィック (IP プロトコル 47) をフィルター処理するには、 FwpsConstructIpHeaderForTransportPacket0 を呼び出す前に次の手順を使用します。
- を呼び出してネット バッファー リストを複製します。 FwpsAllocateCloneNetBufferList0 関数。
- classifyFn 関数の inMetaValues パラメーターが指すFWPS_INCOMING_METADATA_VALUES0構造体の headerIncludeHeaderLength メンバーが 0 より大きい場合は、複製されたネット バッファー リストをその量だけ退避します。たとえば、NdisRetreatNetBufferListDataStart の呼び出しなどです。
- FWPS_INCOMING_METADATA_VALUES0の headerIncludeHeader メンバーが指すバッファーを、複製されたネット バッファー リストの新しく退避された領域にコピーします。 バッファーのサイズは 、headerIncludeHeaderLength の値と同じである必要があります。
- 複製された net バッファー リストを指す NetBufferList パラメーターと headerIncludeHeaderSize パラメーターが headerIncludeHeaderLength の値に設定されている FwpsConstructIpHeaderForTransportPacket0 を呼び出します。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows Server 2008 以降で使用できます。 |
対象プラットフォーム | ユニバーサル |
Header | fwpsk.h (Fwpsk.h を含む) |
Library | Fwpkclnt.lib |
IRQL | <= DISPATCH_LEVEL |