ホーム › NetworkManagement.WindowsFilteringPlatform › IPSEC_TUNNEL_POLICY1
IPSEC_TUNNEL_POLICY1
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| flags | IPSEC_POLICY_FLAG | 4 | +0 | +0 | IPsecトンネルポリシーの動作を制御するフラグ。 |
| numIpsecProposals | DWORD | 4 | +4 | +4 | ipsecProposals配列の要素数。 |
| ipsecProposals | IPSEC_PROPOSAL0* | 8/4 | +8 | +8 | IPsecプロポーザルの配列へのポインター。 |
| tunnelEndpoints | IPSEC_TUNNEL_ENDPOINTS1 | 48 | +16 | +16 | トンネルのローカル/リモートエンドポイント(LUID付き)。 |
| saIdleTimeout | IPSEC_SA_IDLE_TIMEOUT0 | 8 | +64 | +64 | SAのアイドルタイムアウト設定。 |
| emPolicy | IKEEXT_EM_POLICY1* | 8/4 | +72 | +72 | 拡張モードポリシーへのポインター。NULL可。 |
各言語での定義
#include <windows.h>
// IPSEC_TUNNEL_ENDPOINTS1 (x64 48 / x86 48 バイト)
typedef struct IPSEC_TUNNEL_ENDPOINTS1 {
FWP_IP_VERSION ipVersion;
_Anonymous1_e__Union Anonymous1;
_Anonymous2_e__Union Anonymous2;
ULONGLONG localIfLuid;
} IPSEC_TUNNEL_ENDPOINTS1;
// IPSEC_SA_IDLE_TIMEOUT0 (x64 8 / x86 8 バイト)
typedef struct IPSEC_SA_IDLE_TIMEOUT0 {
DWORD idleTimeoutSeconds;
DWORD idleTimeoutSecondsFailOver;
} IPSEC_SA_IDLE_TIMEOUT0;
// IPSEC_TUNNEL_POLICY1 (x64 80 / x86 80 バイト)
typedef struct IPSEC_TUNNEL_POLICY1 {
IPSEC_POLICY_FLAG flags;
DWORD numIpsecProposals;
IPSEC_PROPOSAL0* ipsecProposals;
IPSEC_TUNNEL_ENDPOINTS1 tunnelEndpoints;
IPSEC_SA_IDLE_TIMEOUT0 saIdleTimeout;
IKEEXT_EM_POLICY1* emPolicy;
} IPSEC_TUNNEL_POLICY1;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct IPSEC_TUNNEL_ENDPOINTS1
{
public int ipVersion;
public _Anonymous1_e__Union Anonymous1;
public _Anonymous2_e__Union Anonymous2;
public ulong localIfLuid;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct IPSEC_SA_IDLE_TIMEOUT0
{
public uint idleTimeoutSeconds;
public uint idleTimeoutSecondsFailOver;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct IPSEC_TUNNEL_POLICY1
{
public uint flags;
public uint numIpsecProposals;
public IntPtr ipsecProposals;
public IPSEC_TUNNEL_ENDPOINTS1 tunnelEndpoints;
public IPSEC_SA_IDLE_TIMEOUT0 saIdleTimeout;
public IntPtr emPolicy;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure IPSEC_TUNNEL_ENDPOINTS1
Public ipVersion As Integer
Public Anonymous1 As _Anonymous1_e__Union
Public Anonymous2 As _Anonymous2_e__Union
Public localIfLuid As ULong
End Structure
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure IPSEC_SA_IDLE_TIMEOUT0
Public idleTimeoutSeconds As UInteger
Public idleTimeoutSecondsFailOver As UInteger
End Structure
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure IPSEC_TUNNEL_POLICY1
Public flags As UInteger
Public numIpsecProposals As UInteger
Public ipsecProposals As IntPtr
Public tunnelEndpoints As IPSEC_TUNNEL_ENDPOINTS1
Public saIdleTimeout As IPSEC_SA_IDLE_TIMEOUT0
Public emPolicy As IntPtr
End Structureimport ctypes
from ctypes import wintypes
class IPSEC_TUNNEL_ENDPOINTS1(ctypes.Structure):
_fields_ = [
("ipVersion", ctypes.c_int),
("Anonymous1", _Anonymous1_e__Union),
("Anonymous2", _Anonymous2_e__Union),
("localIfLuid", ctypes.c_ulonglong),
]
class IPSEC_SA_IDLE_TIMEOUT0(ctypes.Structure):
_fields_ = [
("idleTimeoutSeconds", wintypes.DWORD),
("idleTimeoutSecondsFailOver", wintypes.DWORD),
]
class IPSEC_TUNNEL_POLICY1(ctypes.Structure):
_fields_ = [
("flags", wintypes.DWORD),
("numIpsecProposals", wintypes.DWORD),
("ipsecProposals", ctypes.c_void_p),
("tunnelEndpoints", IPSEC_TUNNEL_ENDPOINTS1),
("saIdleTimeout", IPSEC_SA_IDLE_TIMEOUT0),
("emPolicy", ctypes.c_void_p),
]#[repr(C)]
pub struct IPSEC_TUNNEL_ENDPOINTS1 {
pub ipVersion: i32,
pub Anonymous1: _Anonymous1_e__Union,
pub Anonymous2: _Anonymous2_e__Union,
pub localIfLuid: u64,
}
#[repr(C)]
pub struct IPSEC_SA_IDLE_TIMEOUT0 {
pub idleTimeoutSeconds: u32,
pub idleTimeoutSecondsFailOver: u32,
}
#[repr(C)]
pub struct IPSEC_TUNNEL_POLICY1 {
pub flags: u32,
pub numIpsecProposals: u32,
pub ipsecProposals: *mut core::ffi::c_void,
pub tunnelEndpoints: IPSEC_TUNNEL_ENDPOINTS1,
pub saIdleTimeout: IPSEC_SA_IDLE_TIMEOUT0,
pub emPolicy: *mut core::ffi::c_void,
}import "golang.org/x/sys/windows"
type IPSEC_TUNNEL_ENDPOINTS1 struct {
ipVersion int32
Anonymous1 _Anonymous1_e__Union
Anonymous2 _Anonymous2_e__Union
localIfLuid uint64
}
type IPSEC_SA_IDLE_TIMEOUT0 struct {
idleTimeoutSeconds uint32
idleTimeoutSecondsFailOver uint32
}
type IPSEC_TUNNEL_POLICY1 struct {
flags uint32
numIpsecProposals uint32
ipsecProposals uintptr
tunnelEndpoints IPSEC_TUNNEL_ENDPOINTS1
saIdleTimeout IPSEC_SA_IDLE_TIMEOUT0
emPolicy uintptr
}type
IPSEC_TUNNEL_ENDPOINTS1 = record
ipVersion: Integer;
Anonymous1: _Anonymous1_e__Union;
Anonymous2: _Anonymous2_e__Union;
localIfLuid: UInt64;
end;
IPSEC_SA_IDLE_TIMEOUT0 = record
idleTimeoutSeconds: DWORD;
idleTimeoutSecondsFailOver: DWORD;
end;
IPSEC_TUNNEL_POLICY1 = record
flags: DWORD;
numIpsecProposals: DWORD;
ipsecProposals: Pointer;
tunnelEndpoints: IPSEC_TUNNEL_ENDPOINTS1;
saIdleTimeout: IPSEC_SA_IDLE_TIMEOUT0;
emPolicy: Pointer;
end;const IPSEC_TUNNEL_ENDPOINTS1 = extern struct {
ipVersion: i32,
Anonymous1: _Anonymous1_e__Union,
Anonymous2: _Anonymous2_e__Union,
localIfLuid: u64,
};
const IPSEC_SA_IDLE_TIMEOUT0 = extern struct {
idleTimeoutSeconds: u32,
idleTimeoutSecondsFailOver: u32,
};
const IPSEC_TUNNEL_POLICY1 = extern struct {
flags: u32,
numIpsecProposals: u32,
ipsecProposals: ?*anyopaque,
tunnelEndpoints: IPSEC_TUNNEL_ENDPOINTS1,
saIdleTimeout: IPSEC_SA_IDLE_TIMEOUT0,
emPolicy: ?*anyopaque,
};type
IPSEC_TUNNEL_ENDPOINTS1 {.bycopy.} = object
ipVersion: int32
Anonymous1: _Anonymous1_e__Union
Anonymous2: _Anonymous2_e__Union
localIfLuid: uint64
IPSEC_SA_IDLE_TIMEOUT0 {.bycopy.} = object
idleTimeoutSeconds: uint32
idleTimeoutSecondsFailOver: uint32
IPSEC_TUNNEL_POLICY1 {.bycopy.} = object
flags: uint32
numIpsecProposals: uint32
ipsecProposals: pointer
tunnelEndpoints: IPSEC_TUNNEL_ENDPOINTS1
saIdleTimeout: IPSEC_SA_IDLE_TIMEOUT0
emPolicy: pointerstruct IPSEC_TUNNEL_ENDPOINTS1
{
int ipVersion;
_Anonymous1_e__Union Anonymous1;
_Anonymous2_e__Union Anonymous2;
ulong localIfLuid;
}
struct IPSEC_SA_IDLE_TIMEOUT0
{
uint idleTimeoutSeconds;
uint idleTimeoutSecondsFailOver;
}
struct IPSEC_TUNNEL_POLICY1
{
uint flags;
uint numIpsecProposals;
void* ipsecProposals;
IPSEC_TUNNEL_ENDPOINTS1 tunnelEndpoints;
IPSEC_SA_IDLE_TIMEOUT0 saIdleTimeout;
void* emPolicy;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; IPSEC_TUNNEL_POLICY1 サイズ: 80 バイト(x86)
dim st, 20 ; 4byte整数×20(構造体サイズ 80 / 4 切り上げ)
; flags : IPSEC_POLICY_FLAG (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; numIpsecProposals : DWORD (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; ipsecProposals : IPSEC_PROPOSAL0* (+8, 4byte) varptr(st)+8 を基点に操作(4byte:入れ子/配列)
; tunnelEndpoints : IPSEC_TUNNEL_ENDPOINTS1 (+16, 48byte) varptr(st)+16 を基点に操作(48byte:入れ子/配列)
; saIdleTimeout : IPSEC_SA_IDLE_TIMEOUT0 (+64, 8byte) varptr(st)+64 を基点に操作(8byte:入れ子/配列)
; emPolicy : IKEEXT_EM_POLICY1* (+72, 4byte) varptr(st)+72 を基点に操作(4byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; IPSEC_TUNNEL_POLICY1 サイズ: 80 バイト(x64)
dim st, 20 ; 4byte整数×20(構造体サイズ 80 / 4 切り上げ)
; flags : IPSEC_POLICY_FLAG (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; numIpsecProposals : DWORD (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; ipsecProposals : IPSEC_PROPOSAL0* (+8, 8byte) varptr(st)+8 を基点に操作(8byte:入れ子/配列)
; tunnelEndpoints : IPSEC_TUNNEL_ENDPOINTS1 (+16, 48byte) varptr(st)+16 を基点に操作(48byte:入れ子/配列)
; saIdleTimeout : IPSEC_SA_IDLE_TIMEOUT0 (+64, 8byte) varptr(st)+64 を基点に操作(8byte:入れ子/配列)
; emPolicy : IKEEXT_EM_POLICY1* (+72, 8byte) varptr(st)+72 を基点に操作(8byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global IPSEC_TUNNEL_ENDPOINTS1
#field int ipVersion
#field byte Anonymous1 16
#field byte Anonymous2 16
#field int64 localIfLuid
#endstruct
#defstruct global IPSEC_SA_IDLE_TIMEOUT0
#field int idleTimeoutSeconds
#field int idleTimeoutSecondsFailOver
#endstruct
#defstruct global IPSEC_TUNNEL_POLICY1
#field int flags
#field int numIpsecProposals
#field intptr ipsecProposals
#field IPSEC_TUNNEL_ENDPOINTS1 tunnelEndpoints
#field IPSEC_SA_IDLE_TIMEOUT0 saIdleTimeout
#field intptr emPolicy
#endstruct
stdim st, IPSEC_TUNNEL_POLICY1 ; NSTRUCT 変数を確保
st->flags = 100
mes "flags=" + st->flags