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

IPSEC_DOSP_OPTIONS0

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

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

フィールド

フィールドサイズx64x86説明
stateIdleTimeoutSecondsDWORD4+0+0アイドルタイムアウトまでの秒数です。この値は 0 より大きくなければなりません。
perIPRateLimitQueueIdleTimeoutSecondsDWORD4+4+4IP ごとのレート制限キューオブジェクトのアイドルタイムアウトです。この値は 0 より大きくなければなりません。
ipV6IPsecUnauthDscpBYTE1+8+8認証されていない受信 IPv6 IPsec トラフィックに対する DSCP マーキングです。この値は 63 以下でなければなりません。このカテゴリの DSCP マーキングを無効にするには、IPSEC_DOSP_DSCP_DISABLE_VALUE を指定します。
ipV6IPsecUnauthRateLimitBytesPerSecDWORD4+12+12認証されていない受信 IPv6 IPsec トラフィックに対するレート制限です。このカテゴリのレート制限を無効にするには、IPSEC_DOSP_RATE_LIMIT_DISABLE_VALUE を指定します。
ipV6IPsecUnauthPerIPRateLimitBytesPerSecDWORD4+16+16内部 IP アドレスごとの、認証されていない受信 IPv6 IPsec トラフィックに対するレート制限です。このカテゴリのレート制限を無効にするには、IPSEC_DOSP_RATE_LIMIT_DISABLE_VALUE を指定します。
ipV6IPsecAuthDscpBYTE1+20+20認証された受信 IPv6 IPsec トラフィックに対する DSCP マーキングです。この値は 63 以下でなければなりません。このカテゴリの DSCP マーキングを無効にするには、IPSEC_DOSP_DSCP_DISABLE_VALUE を指定します。
ipV6IPsecAuthRateLimitBytesPerSecDWORD4+24+24認証された受信 IPv6 IPsec トラフィックに対するレート制限です。このカテゴリのレート制限を無効にするには、IPSEC_DOSP_RATE_LIMIT_DISABLE_VALUE を指定します。
icmpV6DscpBYTE1+28+28受信 ICMPv6 トラフィックに対する DSCP マーキングです。この値は 63 以下でなければなりません。このカテゴリの DSCP マーキングを無効にするには、IPSEC_DOSP_DSCP_DISABLE_VALUE を指定します。
icmpV6RateLimitBytesPerSecDWORD4+32+32受信 ICMPv6 トラフィックに対するレート制限です。このカテゴリのレート制限を無効にするには、IPSEC_DOSP_RATE_LIMIT_DISABLE_VALUE を指定します。
ipV6FilterExemptDscpBYTE1+36+36フィルターの適用が除外される受信 IPv6 トラフィックに対する DSCP マーキングです。この値は 63 以下でなければなりません。このカテゴリの DSCP マーキングを無効にするには、IPSEC_DOSP_DSCP_DISABLE_VALUE を指定します。
ipV6FilterExemptRateLimitBytesPerSecDWORD4+40+40フィルターの適用が除外される受信 IPv6 トラフィックに対するレート制限です。このカテゴリのレート制限を無効にするには、IPSEC_DOSP_RATE_LIMIT_DISABLE_VALUE を指定します。
defBlockExemptDscpBYTE1+44+44既定のブロックが適用除外される受信トラフィックに対する DSCP マーキングです。この値は 63 以下でなければなりません。このカテゴリの DSCP マーキングを無効にするには、IPSEC_DOSP_DSCP_DISABLE_VALUE を指定します。
defBlockExemptRateLimitBytesPerSecDWORD4+48+48既定のブロックが適用除外される受信トラフィックに対するレート制限です。このカテゴリのレート制限を無効にするには、IPSEC_DOSP_RATE_LIMIT_DISABLE_VALUE を指定します。
maxStateEntriesDWORD4+52+52テーブル内の状態エントリの最大数です。この値は 0 より大きくなければなりません。
maxPerIPRateLimitQueuesDWORD4+56+56内部 IP アドレスごとの、認証されていない受信 IPv6 IPsec トラフィック用のレート制限キューの最大数です。この値は 0 より大きくなければなりません。
flagsIPSEC_DOSP_FLAGS4+60+60

次の値の組み合わせです。

IPsec DoS 保護オプションのフラグ 意味
IPSEC_DOSP_FLAG_ENABLE_IKEV1
IKEv1 キーイングモジュールを許可します。既定ではブロックされます。
IPSEC_DOSP_FLAG_ENABLE_IKEV2
IKEv2 キーイングモジュールを許可します。既定ではブロックされます。
IPSEC_DOSP_FLAG_DISABLE_AUTHIP
AuthIP キーイングモジュールをブロックします。既定では許可されます。
IPSEC_DOSP_FLAG_DISABLE_DEFAULT_BLOCK
条件に一致するすべての IPv4 トラフィックと、IPsec 以外の IPv6 トラフィックを許可します。既定では、IPv6 ICMP を除くすべての IPv4 トラフィックおよび IPsec 以外の IPv6 トラフィックがブロックされます。
IPSEC_DOSP_FLAG_FILTER_BLOCK
条件に一致するすべての IPv6 トラフィックをブロックします。
IPSEC_DOSP_FLAG_FILTER_EXEMPT
条件に一致するすべての IPv6 トラフィックを許可します。
numPublicIFLuidsDWORD4+64+64DoS 保護を有効にする、インターネットに面したパブリックインターフェイス識別子の数です。
publicIFLuidsULONGLONG*8/4+72+68DoS 保護を有効にする、インターネットに面したパブリックインターフェイス識別子の配列へのポインターです。
numInternalIFLuidsDWORD4+80+72DoS 保護を有効にする、内部ネットワークに面したインターフェイス識別子の数です。
internalIFLuidsULONGLONG*8/4+88+76DoS 保護を有効にする、内部ネットワークに面したインターフェイス識別子の配列へのポインターです。
publicV6AddrMaskFWP_V6_ADDR_AND_MASK17+96+80このポリシーに対する省略可能なパブリック IPv6 アドレスまたはサブネットです。FWP_V6_ADDR_AND_MASK で指定します。
internalV6AddrMaskFWP_V6_ADDR_AND_MASK17+113+97このポリシーに対する省略可能な内部 IPv6 アドレスまたはサブネットです。FWP_V6_ADDR_AND_MASK で指定します。

公式ドキュメント

IPSEC_DOSP_OPTIONS0 構造体は、IPsec DoS 保護の構成パラメーターを格納するために使用されます。

解説(Remarks)

IPSEC_DOSP_OPTIONS0 は IPSEC_DOSP_OPTIONS の特定の実装です。詳細については、WFP のバージョンに依存しない名前と、特定バージョンの Windows を対象とする方法 を参照してください。

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

各言語での定義

#include <windows.h>

// FWP_V6_ADDR_AND_MASK  (x64 17 / x86 17 バイト)
typedef struct FWP_V6_ADDR_AND_MASK {
    BYTE addr[16];
    BYTE prefixLength;
} FWP_V6_ADDR_AND_MASK;

// IPSEC_DOSP_OPTIONS0  (x64 136 / x86 116 バイト)
typedef struct IPSEC_DOSP_OPTIONS0 {
    DWORD stateIdleTimeoutSeconds;
    DWORD perIPRateLimitQueueIdleTimeoutSeconds;
    BYTE ipV6IPsecUnauthDscp;
    DWORD ipV6IPsecUnauthRateLimitBytesPerSec;
    DWORD ipV6IPsecUnauthPerIPRateLimitBytesPerSec;
    BYTE ipV6IPsecAuthDscp;
    DWORD ipV6IPsecAuthRateLimitBytesPerSec;
    BYTE icmpV6Dscp;
    DWORD icmpV6RateLimitBytesPerSec;
    BYTE ipV6FilterExemptDscp;
    DWORD ipV6FilterExemptRateLimitBytesPerSec;
    BYTE defBlockExemptDscp;
    DWORD defBlockExemptRateLimitBytesPerSec;
    DWORD maxStateEntries;
    DWORD maxPerIPRateLimitQueues;
    IPSEC_DOSP_FLAGS flags;
    DWORD numPublicIFLuids;
    ULONGLONG* publicIFLuids;
    DWORD numInternalIFLuids;
    ULONGLONG* internalIFLuids;
    FWP_V6_ADDR_AND_MASK publicV6AddrMask;
    FWP_V6_ADDR_AND_MASK internalV6AddrMask;
} IPSEC_DOSP_OPTIONS0;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct FWP_V6_ADDR_AND_MASK
{
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] addr;
    public byte prefixLength;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct IPSEC_DOSP_OPTIONS0
{
    public uint stateIdleTimeoutSeconds;
    public uint perIPRateLimitQueueIdleTimeoutSeconds;
    public byte ipV6IPsecUnauthDscp;
    public uint ipV6IPsecUnauthRateLimitBytesPerSec;
    public uint ipV6IPsecUnauthPerIPRateLimitBytesPerSec;
    public byte ipV6IPsecAuthDscp;
    public uint ipV6IPsecAuthRateLimitBytesPerSec;
    public byte icmpV6Dscp;
    public uint icmpV6RateLimitBytesPerSec;
    public byte ipV6FilterExemptDscp;
    public uint ipV6FilterExemptRateLimitBytesPerSec;
    public byte defBlockExemptDscp;
    public uint defBlockExemptRateLimitBytesPerSec;
    public uint maxStateEntries;
    public uint maxPerIPRateLimitQueues;
    public uint flags;
    public uint numPublicIFLuids;
    public IntPtr publicIFLuids;
    public uint numInternalIFLuids;
    public IntPtr internalIFLuids;
    public FWP_V6_ADDR_AND_MASK publicV6AddrMask;
    public FWP_V6_ADDR_AND_MASK internalV6AddrMask;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure FWP_V6_ADDR_AND_MASK
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=16)> Public addr() As Byte
    Public prefixLength As Byte
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure IPSEC_DOSP_OPTIONS0
    Public stateIdleTimeoutSeconds As UInteger
    Public perIPRateLimitQueueIdleTimeoutSeconds As UInteger
    Public ipV6IPsecUnauthDscp As Byte
    Public ipV6IPsecUnauthRateLimitBytesPerSec As UInteger
    Public ipV6IPsecUnauthPerIPRateLimitBytesPerSec As UInteger
    Public ipV6IPsecAuthDscp As Byte
    Public ipV6IPsecAuthRateLimitBytesPerSec As UInteger
    Public icmpV6Dscp As Byte
    Public icmpV6RateLimitBytesPerSec As UInteger
    Public ipV6FilterExemptDscp As Byte
    Public ipV6FilterExemptRateLimitBytesPerSec As UInteger
    Public defBlockExemptDscp As Byte
    Public defBlockExemptRateLimitBytesPerSec As UInteger
    Public maxStateEntries As UInteger
    Public maxPerIPRateLimitQueues As UInteger
    Public flags As UInteger
    Public numPublicIFLuids As UInteger
    Public publicIFLuids As IntPtr
    Public numInternalIFLuids As UInteger
    Public internalIFLuids As IntPtr
    Public publicV6AddrMask As FWP_V6_ADDR_AND_MASK
    Public internalV6AddrMask As FWP_V6_ADDR_AND_MASK
End Structure
import ctypes
from ctypes import wintypes

class FWP_V6_ADDR_AND_MASK(ctypes.Structure):
    _fields_ = [
        ("addr", ctypes.c_ubyte * 16),
        ("prefixLength", ctypes.c_ubyte),
    ]

class IPSEC_DOSP_OPTIONS0(ctypes.Structure):
    _fields_ = [
        ("stateIdleTimeoutSeconds", wintypes.DWORD),
        ("perIPRateLimitQueueIdleTimeoutSeconds", wintypes.DWORD),
        ("ipV6IPsecUnauthDscp", ctypes.c_ubyte),
        ("ipV6IPsecUnauthRateLimitBytesPerSec", wintypes.DWORD),
        ("ipV6IPsecUnauthPerIPRateLimitBytesPerSec", wintypes.DWORD),
        ("ipV6IPsecAuthDscp", ctypes.c_ubyte),
        ("ipV6IPsecAuthRateLimitBytesPerSec", wintypes.DWORD),
        ("icmpV6Dscp", ctypes.c_ubyte),
        ("icmpV6RateLimitBytesPerSec", wintypes.DWORD),
        ("ipV6FilterExemptDscp", ctypes.c_ubyte),
        ("ipV6FilterExemptRateLimitBytesPerSec", wintypes.DWORD),
        ("defBlockExemptDscp", ctypes.c_ubyte),
        ("defBlockExemptRateLimitBytesPerSec", wintypes.DWORD),
        ("maxStateEntries", wintypes.DWORD),
        ("maxPerIPRateLimitQueues", wintypes.DWORD),
        ("flags", wintypes.DWORD),
        ("numPublicIFLuids", wintypes.DWORD),
        ("publicIFLuids", ctypes.c_void_p),
        ("numInternalIFLuids", wintypes.DWORD),
        ("internalIFLuids", ctypes.c_void_p),
        ("publicV6AddrMask", FWP_V6_ADDR_AND_MASK),
        ("internalV6AddrMask", FWP_V6_ADDR_AND_MASK),
    ]
#[repr(C)]
pub struct FWP_V6_ADDR_AND_MASK {
    pub addr: [u8; 16],
    pub prefixLength: u8,
}

#[repr(C)]
pub struct IPSEC_DOSP_OPTIONS0 {
    pub stateIdleTimeoutSeconds: u32,
    pub perIPRateLimitQueueIdleTimeoutSeconds: u32,
    pub ipV6IPsecUnauthDscp: u8,
    pub ipV6IPsecUnauthRateLimitBytesPerSec: u32,
    pub ipV6IPsecUnauthPerIPRateLimitBytesPerSec: u32,
    pub ipV6IPsecAuthDscp: u8,
    pub ipV6IPsecAuthRateLimitBytesPerSec: u32,
    pub icmpV6Dscp: u8,
    pub icmpV6RateLimitBytesPerSec: u32,
    pub ipV6FilterExemptDscp: u8,
    pub ipV6FilterExemptRateLimitBytesPerSec: u32,
    pub defBlockExemptDscp: u8,
    pub defBlockExemptRateLimitBytesPerSec: u32,
    pub maxStateEntries: u32,
    pub maxPerIPRateLimitQueues: u32,
    pub flags: u32,
    pub numPublicIFLuids: u32,
    pub publicIFLuids: *mut core::ffi::c_void,
    pub numInternalIFLuids: u32,
    pub internalIFLuids: *mut core::ffi::c_void,
    pub publicV6AddrMask: FWP_V6_ADDR_AND_MASK,
    pub internalV6AddrMask: FWP_V6_ADDR_AND_MASK,
}
import "golang.org/x/sys/windows"

type FWP_V6_ADDR_AND_MASK struct {
	addr [16]byte
	prefixLength byte
}

type IPSEC_DOSP_OPTIONS0 struct {
	stateIdleTimeoutSeconds uint32
	perIPRateLimitQueueIdleTimeoutSeconds uint32
	ipV6IPsecUnauthDscp byte
	ipV6IPsecUnauthRateLimitBytesPerSec uint32
	ipV6IPsecUnauthPerIPRateLimitBytesPerSec uint32
	ipV6IPsecAuthDscp byte
	ipV6IPsecAuthRateLimitBytesPerSec uint32
	icmpV6Dscp byte
	icmpV6RateLimitBytesPerSec uint32
	ipV6FilterExemptDscp byte
	ipV6FilterExemptRateLimitBytesPerSec uint32
	defBlockExemptDscp byte
	defBlockExemptRateLimitBytesPerSec uint32
	maxStateEntries uint32
	maxPerIPRateLimitQueues uint32
	flags uint32
	numPublicIFLuids uint32
	publicIFLuids uintptr
	numInternalIFLuids uint32
	internalIFLuids uintptr
	publicV6AddrMask FWP_V6_ADDR_AND_MASK
	internalV6AddrMask FWP_V6_ADDR_AND_MASK
}
type
  FWP_V6_ADDR_AND_MASK = record
    addr: array[0..15] of Byte;
    prefixLength: Byte;
  end;

  IPSEC_DOSP_OPTIONS0 = record
    stateIdleTimeoutSeconds: DWORD;
    perIPRateLimitQueueIdleTimeoutSeconds: DWORD;
    ipV6IPsecUnauthDscp: Byte;
    ipV6IPsecUnauthRateLimitBytesPerSec: DWORD;
    ipV6IPsecUnauthPerIPRateLimitBytesPerSec: DWORD;
    ipV6IPsecAuthDscp: Byte;
    ipV6IPsecAuthRateLimitBytesPerSec: DWORD;
    icmpV6Dscp: Byte;
    icmpV6RateLimitBytesPerSec: DWORD;
    ipV6FilterExemptDscp: Byte;
    ipV6FilterExemptRateLimitBytesPerSec: DWORD;
    defBlockExemptDscp: Byte;
    defBlockExemptRateLimitBytesPerSec: DWORD;
    maxStateEntries: DWORD;
    maxPerIPRateLimitQueues: DWORD;
    flags: DWORD;
    numPublicIFLuids: DWORD;
    publicIFLuids: Pointer;
    numInternalIFLuids: DWORD;
    internalIFLuids: Pointer;
    publicV6AddrMask: FWP_V6_ADDR_AND_MASK;
    internalV6AddrMask: FWP_V6_ADDR_AND_MASK;
  end;
const FWP_V6_ADDR_AND_MASK = extern struct {
    addr: [16]u8,
    prefixLength: u8,
};

const IPSEC_DOSP_OPTIONS0 = extern struct {
    stateIdleTimeoutSeconds: u32,
    perIPRateLimitQueueIdleTimeoutSeconds: u32,
    ipV6IPsecUnauthDscp: u8,
    ipV6IPsecUnauthRateLimitBytesPerSec: u32,
    ipV6IPsecUnauthPerIPRateLimitBytesPerSec: u32,
    ipV6IPsecAuthDscp: u8,
    ipV6IPsecAuthRateLimitBytesPerSec: u32,
    icmpV6Dscp: u8,
    icmpV6RateLimitBytesPerSec: u32,
    ipV6FilterExemptDscp: u8,
    ipV6FilterExemptRateLimitBytesPerSec: u32,
    defBlockExemptDscp: u8,
    defBlockExemptRateLimitBytesPerSec: u32,
    maxStateEntries: u32,
    maxPerIPRateLimitQueues: u32,
    flags: u32,
    numPublicIFLuids: u32,
    publicIFLuids: ?*anyopaque,
    numInternalIFLuids: u32,
    internalIFLuids: ?*anyopaque,
    publicV6AddrMask: FWP_V6_ADDR_AND_MASK,
    internalV6AddrMask: FWP_V6_ADDR_AND_MASK,
};
type
  FWP_V6_ADDR_AND_MASK {.bycopy.} = object
    addr: array[16, uint8]
    prefixLength: uint8

  IPSEC_DOSP_OPTIONS0 {.bycopy.} = object
    stateIdleTimeoutSeconds: uint32
    perIPRateLimitQueueIdleTimeoutSeconds: uint32
    ipV6IPsecUnauthDscp: uint8
    ipV6IPsecUnauthRateLimitBytesPerSec: uint32
    ipV6IPsecUnauthPerIPRateLimitBytesPerSec: uint32
    ipV6IPsecAuthDscp: uint8
    ipV6IPsecAuthRateLimitBytesPerSec: uint32
    icmpV6Dscp: uint8
    icmpV6RateLimitBytesPerSec: uint32
    ipV6FilterExemptDscp: uint8
    ipV6FilterExemptRateLimitBytesPerSec: uint32
    defBlockExemptDscp: uint8
    defBlockExemptRateLimitBytesPerSec: uint32
    maxStateEntries: uint32
    maxPerIPRateLimitQueues: uint32
    flags: uint32
    numPublicIFLuids: uint32
    publicIFLuids: pointer
    numInternalIFLuids: uint32
    internalIFLuids: pointer
    publicV6AddrMask: FWP_V6_ADDR_AND_MASK
    internalV6AddrMask: FWP_V6_ADDR_AND_MASK
struct FWP_V6_ADDR_AND_MASK
{
    ubyte[16] addr;
    ubyte prefixLength;
}

struct IPSEC_DOSP_OPTIONS0
{
    uint stateIdleTimeoutSeconds;
    uint perIPRateLimitQueueIdleTimeoutSeconds;
    ubyte ipV6IPsecUnauthDscp;
    uint ipV6IPsecUnauthRateLimitBytesPerSec;
    uint ipV6IPsecUnauthPerIPRateLimitBytesPerSec;
    ubyte ipV6IPsecAuthDscp;
    uint ipV6IPsecAuthRateLimitBytesPerSec;
    ubyte icmpV6Dscp;
    uint icmpV6RateLimitBytesPerSec;
    ubyte ipV6FilterExemptDscp;
    uint ipV6FilterExemptRateLimitBytesPerSec;
    ubyte defBlockExemptDscp;
    uint defBlockExemptRateLimitBytesPerSec;
    uint maxStateEntries;
    uint maxPerIPRateLimitQueues;
    uint flags;
    uint numPublicIFLuids;
    void* publicIFLuids;
    uint numInternalIFLuids;
    void* internalIFLuids;
    FWP_V6_ADDR_AND_MASK publicV6AddrMask;
    FWP_V6_ADDR_AND_MASK internalV6AddrMask;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; IPSEC_DOSP_OPTIONS0 サイズ: 116 バイト(x86)
dim st, 29    ; 4byte整数×29(構造体サイズ 116 / 4 切り上げ)
; stateIdleTimeoutSeconds : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; perIPRateLimitQueueIdleTimeoutSeconds : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; ipV6IPsecUnauthDscp : BYTE (+8, 1byte)  poke st,8,値  /  値 = peek(st,8)
; ipV6IPsecUnauthRateLimitBytesPerSec : DWORD (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; ipV6IPsecUnauthPerIPRateLimitBytesPerSec : DWORD (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; ipV6IPsecAuthDscp : BYTE (+20, 1byte)  poke st,20,値  /  値 = peek(st,20)
; ipV6IPsecAuthRateLimitBytesPerSec : DWORD (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; icmpV6Dscp : BYTE (+28, 1byte)  poke st,28,値  /  値 = peek(st,28)
; icmpV6RateLimitBytesPerSec : DWORD (+32, 4byte)  st.8 = 値  /  値 = st.8   (lpoke/lpeek も可)
; ipV6FilterExemptDscp : BYTE (+36, 1byte)  poke st,36,値  /  値 = peek(st,36)
; ipV6FilterExemptRateLimitBytesPerSec : DWORD (+40, 4byte)  st.10 = 値  /  値 = st.10   (lpoke/lpeek も可)
; defBlockExemptDscp : BYTE (+44, 1byte)  poke st,44,値  /  値 = peek(st,44)
; defBlockExemptRateLimitBytesPerSec : DWORD (+48, 4byte)  st.12 = 値  /  値 = st.12   (lpoke/lpeek も可)
; maxStateEntries : DWORD (+52, 4byte)  st.13 = 値  /  値 = st.13   (lpoke/lpeek も可)
; maxPerIPRateLimitQueues : DWORD (+56, 4byte)  st.14 = 値  /  値 = st.14   (lpoke/lpeek も可)
; flags : IPSEC_DOSP_FLAGS (+60, 4byte)  st.15 = 値  /  値 = st.15   (lpoke/lpeek も可)
; numPublicIFLuids : DWORD (+64, 4byte)  st.16 = 値  /  値 = st.16   (lpoke/lpeek も可)
; publicIFLuids : ULONGLONG* (+68, 4byte)  st.17 = 値  /  値 = st.17   (lpoke/lpeek も可)
; numInternalIFLuids : DWORD (+72, 4byte)  st.18 = 値  /  値 = st.18   (lpoke/lpeek も可)
; internalIFLuids : ULONGLONG* (+76, 4byte)  st.19 = 値  /  値 = st.19   (lpoke/lpeek も可)
; publicV6AddrMask : FWP_V6_ADDR_AND_MASK (+80, 17byte)  varptr(st)+80 を基点に操作(17byte:入れ子/配列)
; internalV6AddrMask : FWP_V6_ADDR_AND_MASK (+97, 17byte)  varptr(st)+97 を基点に操作(17byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; IPSEC_DOSP_OPTIONS0 サイズ: 136 バイト(x64)
dim st, 34    ; 4byte整数×34(構造体サイズ 136 / 4 切り上げ)
; stateIdleTimeoutSeconds : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; perIPRateLimitQueueIdleTimeoutSeconds : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; ipV6IPsecUnauthDscp : BYTE (+8, 1byte)  poke st,8,値  /  値 = peek(st,8)
; ipV6IPsecUnauthRateLimitBytesPerSec : DWORD (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; ipV6IPsecUnauthPerIPRateLimitBytesPerSec : DWORD (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; ipV6IPsecAuthDscp : BYTE (+20, 1byte)  poke st,20,値  /  値 = peek(st,20)
; ipV6IPsecAuthRateLimitBytesPerSec : DWORD (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; icmpV6Dscp : BYTE (+28, 1byte)  poke st,28,値  /  値 = peek(st,28)
; icmpV6RateLimitBytesPerSec : DWORD (+32, 4byte)  st.8 = 値  /  値 = st.8   (lpoke/lpeek も可)
; ipV6FilterExemptDscp : BYTE (+36, 1byte)  poke st,36,値  /  値 = peek(st,36)
; ipV6FilterExemptRateLimitBytesPerSec : DWORD (+40, 4byte)  st.10 = 値  /  値 = st.10   (lpoke/lpeek も可)
; defBlockExemptDscp : BYTE (+44, 1byte)  poke st,44,値  /  値 = peek(st,44)
; defBlockExemptRateLimitBytesPerSec : DWORD (+48, 4byte)  st.12 = 値  /  値 = st.12   (lpoke/lpeek も可)
; maxStateEntries : DWORD (+52, 4byte)  st.13 = 値  /  値 = st.13   (lpoke/lpeek も可)
; maxPerIPRateLimitQueues : DWORD (+56, 4byte)  st.14 = 値  /  値 = st.14   (lpoke/lpeek も可)
; flags : IPSEC_DOSP_FLAGS (+60, 4byte)  st.15 = 値  /  値 = st.15   (lpoke/lpeek も可)
; numPublicIFLuids : DWORD (+64, 4byte)  st.16 = 値  /  値 = st.16   (lpoke/lpeek も可)
; publicIFLuids : ULONGLONG* (+72, 8byte)  qpoke st,72,値 / qpeek(st,72)  ※IronHSPのみ。3.7/3.8は lpoke st,72,下位 : lpoke st,76,上位
; numInternalIFLuids : DWORD (+80, 4byte)  st.20 = 値  /  値 = st.20   (lpoke/lpeek も可)
; internalIFLuids : ULONGLONG* (+88, 8byte)  qpoke st,88,値 / qpeek(st,88)  ※IronHSPのみ。3.7/3.8は lpoke st,88,下位 : lpoke st,92,上位
; publicV6AddrMask : FWP_V6_ADDR_AND_MASK (+96, 17byte)  varptr(st)+96 を基点に操作(17byte:入れ子/配列)
; internalV6AddrMask : FWP_V6_ADDR_AND_MASK (+113, 17byte)  varptr(st)+113 を基点に操作(17byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global FWP_V6_ADDR_AND_MASK
    #field byte addr 16
    #field byte prefixLength
#endstruct

#defstruct global IPSEC_DOSP_OPTIONS0
    #field int stateIdleTimeoutSeconds
    #field int perIPRateLimitQueueIdleTimeoutSeconds
    #field byte ipV6IPsecUnauthDscp
    #field int ipV6IPsecUnauthRateLimitBytesPerSec
    #field int ipV6IPsecUnauthPerIPRateLimitBytesPerSec
    #field byte ipV6IPsecAuthDscp
    #field int ipV6IPsecAuthRateLimitBytesPerSec
    #field byte icmpV6Dscp
    #field int icmpV6RateLimitBytesPerSec
    #field byte ipV6FilterExemptDscp
    #field int ipV6FilterExemptRateLimitBytesPerSec
    #field byte defBlockExemptDscp
    #field int defBlockExemptRateLimitBytesPerSec
    #field int maxStateEntries
    #field int maxPerIPRateLimitQueues
    #field int flags
    #field int numPublicIFLuids
    #field intptr publicIFLuids
    #field int numInternalIFLuids
    #field intptr internalIFLuids
    #field FWP_V6_ADDR_AND_MASK publicV6AddrMask
    #field FWP_V6_ADDR_AND_MASK internalV6AddrMask
#endstruct

stdim st, IPSEC_DOSP_OPTIONS0        ; NSTRUCT 変数を確保
st->stateIdleTimeoutSeconds = 100
mes "stateIdleTimeoutSeconds=" + st->stateIdleTimeoutSeconds