Win32 API 日本語リファレンス
ホームNetworkManagement.WindowsFilteringPlatform › IPSEC_TRAFFIC1

IPSEC_TRAFFIC1

構造体
サイズx64: 72 バイト / x86: 72 バイト

サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。

フィールド

フィールドサイズx64x86説明
ipVersionFWP_IP_VERSION4+0+0IP バージョンを指定する FWP_IP_VERSION 値です。トンネル モードでは、これは外側ヘッダーのバージョンです。
Anonymous1_Anonymous1_e__Union16+4+4IPバージョンに応じたローカルアドレスを保持する共用体。
Anonymous2_Anonymous2_e__Union16+20+20IPバージョンに応じたリモートアドレスを保持する共用体。
trafficTypeIPSEC_TRAFFIC_TYPE4+36+36

IPsec トラフィックの種類です。

詳細については、IPSEC_TRAFFIC_TYPE を参照してください。

Anonymous3_Anonymous3_e__Union8+40+40トラフィック種別に応じたトンネルエンドポイント情報の共用体。
remotePortWORD2+48+48このトラフィックのリモート TCP/UDP ポートです。これは、トランスポート レイヤー フィルター内のリモート ポート条件が実際のリモート ポートよりも汎用的である場合に使用されます。
localPortWORD2+50+50このトラフィックのローカル TCP/UDP ポートです。これは、トランスポート レイヤー フィルター内のローカル ポート条件が実際のローカル ポートよりも汎用的である場合に使用されます。
ipProtocolBYTE1+52+52このトラフィックの IP プロトコルです。これは、トランスポート レイヤー フィルター内の IP プロトコル条件が実際の IP プロトコルよりも汎用的である場合に使用されます。
localIfLuidULONGLONG8+56+56上記で指定したローカル アドレスに対応するローカル インターフェイスの LUID です。
realIfProfileIdDWORD4+64+64トラフィックが実際に使用しているインターフェイスに対応するプロファイル ID です。

共用体: _Anonymous1_e__Union x64 16B / x86 16B

フィールドサイズx64x86説明
localV4AddressDWORD4+0+0

IPsec トラフィックのローカル IPv4 アドレスです。トンネル モードでは、これはローカル トンネル エンドポイントです。

ipVersionFWP_IP_VERSION_V4 の場合に指定します。

localV6AddressBYTE16+0+0

IPsec トラフィックのローカル IPv6 アドレスです。トンネル モードでは、これはローカル トンネル エンドポイントです。

ipVersionFWP_IP_VERSION_V6 の場合に指定します。

共用体: _Anonymous2_e__Union x64 16B / x86 16B

フィールドサイズx64x86説明
remoteV4AddressDWORD4+0+0

IPsec トラフィックのリモート IPv4 アドレスです。トンネル モードでは、これはリモート トンネル エンドポイントです。

ipVersionFWP_IP_VERSION_V4 の場合に指定します。

remoteV6AddressBYTE16+0+0

IPsec トラフィックのリモート IPv6 アドレスです。トンネル モードでは、これはリモート トンネル エンドポイントです。

ipVersionFWP_IP_VERSION_V6 の場合に指定します。

共用体: _Anonymous3_e__Union x64 8B / x86 8B

フィールドサイズx64x86説明
ipsecFilterIdULONGLONG8+0+0

このトラフィックに対応する FWPS トランスポート レイヤー フィルターの LUID です。

trafficTypeIPSEC_TRAFFIC_TYPE_TRANSPORT の場合に利用できます。

tunnelPolicyIdULONGLONG8+0+0

関連付けられたクイック モード (QM) トンネル ポリシーの LUID です。

trafficTypeIPSEC_TRAFFIC_TYPE_TUNNEL の場合に利用できます。

公式ドキュメント

IPSEC_TRAFFIC1 構造体は、IPsec トラフィックを記述するためのパラメーターを指定します。 IPSEC_TRAFFIC0 が利用可能です。

解説(Remarks)

IPSEC_TRAFFIC1 型は、SA に一致するトラフィックの特性を記述します。

IPsec トランスポート モードの場合、localVAddress メンバーと remoteVAddress メンバーが IP アドレスを指定します。ipsecFilterId メンバーは、(トランスポート レイヤー フィルターの条件の一部として) 一致するトラフィックのトランスポート プロトコル情報 (IP プロトコル、ポートなど) を指定します。ただし、localPortremotePort、または ipProtocol メンバーが 0 以外の場合、その値はトランスポート レイヤー フィルターで指定された対応する値を上書きします。

IPsec トンネル モードの場合、localVAddress メンバーと remoteVAddress メンバーは外側 IP ヘッダーのトンネル エンドポイントを指定します。tunnelPolicyId メンバーは、(FwpmIPsecTunnelAdd1 を介して指定されたフィルター条件の一部として) 一致するトラフィックの内側 IP ヘッダーのアドレスとトランスポート プロトコル情報を指定します。トンネル モードでは、localPortremotePortipProtocol の各メンバーを指定しないでください。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での定義

#include <windows.h>

// IPSEC_TRAFFIC1  (x64 72 / x86 72 バイト)
typedef struct IPSEC_TRAFFIC1 {
    FWP_IP_VERSION ipVersion;
    _Anonymous1_e__Union Anonymous1;
    _Anonymous2_e__Union Anonymous2;
    IPSEC_TRAFFIC_TYPE trafficType;
    _Anonymous3_e__Union Anonymous3;
    WORD remotePort;
    WORD localPort;
    BYTE ipProtocol;
    ULONGLONG localIfLuid;
    DWORD realIfProfileId;
} IPSEC_TRAFFIC1;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct IPSEC_TRAFFIC1
{
    public int ipVersion;
    public _Anonymous1_e__Union Anonymous1;
    public _Anonymous2_e__Union Anonymous2;
    public int trafficType;
    public _Anonymous3_e__Union Anonymous3;
    public ushort remotePort;
    public ushort localPort;
    public byte ipProtocol;
    public ulong localIfLuid;
    public uint realIfProfileId;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure IPSEC_TRAFFIC1
    Public ipVersion As Integer
    Public Anonymous1 As _Anonymous1_e__Union
    Public Anonymous2 As _Anonymous2_e__Union
    Public trafficType As Integer
    Public Anonymous3 As _Anonymous3_e__Union
    Public remotePort As UShort
    Public localPort As UShort
    Public ipProtocol As Byte
    Public localIfLuid As ULong
    Public realIfProfileId As UInteger
End Structure
import ctypes
from ctypes import wintypes

class IPSEC_TRAFFIC1(ctypes.Structure):
    _fields_ = [
        ("ipVersion", ctypes.c_int),
        ("Anonymous1", _Anonymous1_e__Union),
        ("Anonymous2", _Anonymous2_e__Union),
        ("trafficType", ctypes.c_int),
        ("Anonymous3", _Anonymous3_e__Union),
        ("remotePort", ctypes.c_ushort),
        ("localPort", ctypes.c_ushort),
        ("ipProtocol", ctypes.c_ubyte),
        ("localIfLuid", ctypes.c_ulonglong),
        ("realIfProfileId", wintypes.DWORD),
    ]
#[repr(C)]
pub struct IPSEC_TRAFFIC1 {
    pub ipVersion: i32,
    pub Anonymous1: _Anonymous1_e__Union,
    pub Anonymous2: _Anonymous2_e__Union,
    pub trafficType: i32,
    pub Anonymous3: _Anonymous3_e__Union,
    pub remotePort: u16,
    pub localPort: u16,
    pub ipProtocol: u8,
    pub localIfLuid: u64,
    pub realIfProfileId: u32,
}
import "golang.org/x/sys/windows"

type IPSEC_TRAFFIC1 struct {
	ipVersion int32
	Anonymous1 _Anonymous1_e__Union
	Anonymous2 _Anonymous2_e__Union
	trafficType int32
	Anonymous3 _Anonymous3_e__Union
	remotePort uint16
	localPort uint16
	ipProtocol byte
	localIfLuid uint64
	realIfProfileId uint32
}
type
  IPSEC_TRAFFIC1 = record
    ipVersion: Integer;
    Anonymous1: _Anonymous1_e__Union;
    Anonymous2: _Anonymous2_e__Union;
    trafficType: Integer;
    Anonymous3: _Anonymous3_e__Union;
    remotePort: Word;
    localPort: Word;
    ipProtocol: Byte;
    localIfLuid: UInt64;
    realIfProfileId: DWORD;
  end;
const IPSEC_TRAFFIC1 = extern struct {
    ipVersion: i32,
    Anonymous1: _Anonymous1_e__Union,
    Anonymous2: _Anonymous2_e__Union,
    trafficType: i32,
    Anonymous3: _Anonymous3_e__Union,
    remotePort: u16,
    localPort: u16,
    ipProtocol: u8,
    localIfLuid: u64,
    realIfProfileId: u32,
};
type
  IPSEC_TRAFFIC1 {.bycopy.} = object
    ipVersion: int32
    Anonymous1: _Anonymous1_e__Union
    Anonymous2: _Anonymous2_e__Union
    trafficType: int32
    Anonymous3: _Anonymous3_e__Union
    remotePort: uint16
    localPort: uint16
    ipProtocol: uint8
    localIfLuid: uint64
    realIfProfileId: uint32
struct IPSEC_TRAFFIC1
{
    int ipVersion;
    _Anonymous1_e__Union Anonymous1;
    _Anonymous2_e__Union Anonymous2;
    int trafficType;
    _Anonymous3_e__Union Anonymous3;
    ushort remotePort;
    ushort localPort;
    ubyte ipProtocol;
    ulong localIfLuid;
    uint realIfProfileId;
}

HSP用 定義

HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; IPSEC_TRAFFIC1 サイズ: 72 バイト(x64)
dim st, 18    ; 4byte整数×18(構造体サイズ 72 / 4 切り上げ)
; ipVersion : FWP_IP_VERSION (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; Anonymous1 : _Anonymous1_e__Union (+4, 16byte)  varptr(st)+4 を基点に操作(16byte:入れ子/配列)
; Anonymous2 : _Anonymous2_e__Union (+20, 16byte)  varptr(st)+20 を基点に操作(16byte:入れ子/配列)
; trafficType : IPSEC_TRAFFIC_TYPE (+36, 4byte)  st.9 = 値  /  値 = st.9   (lpoke/lpeek も可)
; Anonymous3 : _Anonymous3_e__Union (+40, 8byte)  varptr(st)+40 を基点に操作(8byte:入れ子/配列)
; remotePort : WORD (+48, 2byte)  wpoke st,48,値  /  値 = wpeek(st,48)
; localPort : WORD (+50, 2byte)  wpoke st,50,値  /  値 = wpeek(st,50)
; ipProtocol : BYTE (+52, 1byte)  poke st,52,値  /  値 = peek(st,52)
; localIfLuid : ULONGLONG (+56, 8byte)  qpoke st,56,値 / qpeek(st,56)  ※IronHSPのみ。3.7/3.8は lpoke st,56,下位 : lpoke st,60,上位
; realIfProfileId : DWORD (+64, 4byte)  st.16 = 値  /  値 = st.16   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global IPSEC_TRAFFIC1
    #field int ipVersion
    #field byte Anonymous1 16
    #field byte Anonymous2 16
    #field int trafficType
    #field byte Anonymous3 8
    #field short remotePort
    #field short localPort
    #field byte ipProtocol
    #field int64 localIfLuid
    #field int realIfProfileId
#endstruct

stdim st, IPSEC_TRAFFIC1        ; NSTRUCT 変数を確保
st->ipVersion = 100
mes "ipVersion=" + st->ipVersion
; ※union フィールドは byte 列で確保(NSTRUCT は union 非対応)。必要に応じ手動でアクセス。