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

OFFLOAD_SECURITY_ASSOCIATION

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

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

フィールド

フィールドサイズx64x86説明
OperationOFFLOAD_OPERATION_E4+0+0SAの操作種別(認証/暗号化/両方)を示す列挙値。
SPIDWORD4+4+4セキュリティパラメータインデックス(SA識別子)。
IntegrityAlgoOFFLOAD_ALGO_INFO12+8+8完全性検証アルゴリズムの情報。
ConfAlgoOFFLOAD_ALGO_INFO12+20+20機密性(暗号化)アルゴリズムの情報。
ReservedOFFLOAD_ALGO_INFO12+32+32予約フィールド(アルゴリズム情報形式)。

各言語での定義

#include <windows.h>

// OFFLOAD_ALGO_INFO  (x64 12 / x86 12 バイト)
typedef struct OFFLOAD_ALGO_INFO {
    DWORD algoIdentifier;
    DWORD algoKeylen;
    DWORD algoRounds;
} OFFLOAD_ALGO_INFO;

// OFFLOAD_SECURITY_ASSOCIATION  (x64 44 / x86 44 バイト)
typedef struct OFFLOAD_SECURITY_ASSOCIATION {
    OFFLOAD_OPERATION_E Operation;
    DWORD SPI;
    OFFLOAD_ALGO_INFO IntegrityAlgo;
    OFFLOAD_ALGO_INFO ConfAlgo;
    OFFLOAD_ALGO_INFO Reserved;
} OFFLOAD_SECURITY_ASSOCIATION;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct OFFLOAD_ALGO_INFO
{
    public uint algoIdentifier;
    public uint algoKeylen;
    public uint algoRounds;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct OFFLOAD_SECURITY_ASSOCIATION
{
    public int Operation;
    public uint SPI;
    public OFFLOAD_ALGO_INFO IntegrityAlgo;
    public OFFLOAD_ALGO_INFO ConfAlgo;
    public OFFLOAD_ALGO_INFO Reserved;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure OFFLOAD_ALGO_INFO
    Public algoIdentifier As UInteger
    Public algoKeylen As UInteger
    Public algoRounds As UInteger
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure OFFLOAD_SECURITY_ASSOCIATION
    Public Operation As Integer
    Public SPI As UInteger
    Public IntegrityAlgo As OFFLOAD_ALGO_INFO
    Public ConfAlgo As OFFLOAD_ALGO_INFO
    Public Reserved As OFFLOAD_ALGO_INFO
End Structure
import ctypes
from ctypes import wintypes

class OFFLOAD_ALGO_INFO(ctypes.Structure):
    _fields_ = [
        ("algoIdentifier", wintypes.DWORD),
        ("algoKeylen", wintypes.DWORD),
        ("algoRounds", wintypes.DWORD),
    ]

class OFFLOAD_SECURITY_ASSOCIATION(ctypes.Structure):
    _fields_ = [
        ("Operation", ctypes.c_int),
        ("SPI", wintypes.DWORD),
        ("IntegrityAlgo", OFFLOAD_ALGO_INFO),
        ("ConfAlgo", OFFLOAD_ALGO_INFO),
        ("Reserved", OFFLOAD_ALGO_INFO),
    ]
#[repr(C)]
pub struct OFFLOAD_ALGO_INFO {
    pub algoIdentifier: u32,
    pub algoKeylen: u32,
    pub algoRounds: u32,
}

#[repr(C)]
pub struct OFFLOAD_SECURITY_ASSOCIATION {
    pub Operation: i32,
    pub SPI: u32,
    pub IntegrityAlgo: OFFLOAD_ALGO_INFO,
    pub ConfAlgo: OFFLOAD_ALGO_INFO,
    pub Reserved: OFFLOAD_ALGO_INFO,
}
import "golang.org/x/sys/windows"

type OFFLOAD_ALGO_INFO struct {
	algoIdentifier uint32
	algoKeylen uint32
	algoRounds uint32
}

type OFFLOAD_SECURITY_ASSOCIATION struct {
	Operation int32
	SPI uint32
	IntegrityAlgo OFFLOAD_ALGO_INFO
	ConfAlgo OFFLOAD_ALGO_INFO
	Reserved OFFLOAD_ALGO_INFO
}
type
  OFFLOAD_ALGO_INFO = record
    algoIdentifier: DWORD;
    algoKeylen: DWORD;
    algoRounds: DWORD;
  end;

  OFFLOAD_SECURITY_ASSOCIATION = record
    Operation: Integer;
    SPI: DWORD;
    IntegrityAlgo: OFFLOAD_ALGO_INFO;
    ConfAlgo: OFFLOAD_ALGO_INFO;
    Reserved: OFFLOAD_ALGO_INFO;
  end;
const OFFLOAD_ALGO_INFO = extern struct {
    algoIdentifier: u32,
    algoKeylen: u32,
    algoRounds: u32,
};

const OFFLOAD_SECURITY_ASSOCIATION = extern struct {
    Operation: i32,
    SPI: u32,
    IntegrityAlgo: OFFLOAD_ALGO_INFO,
    ConfAlgo: OFFLOAD_ALGO_INFO,
    Reserved: OFFLOAD_ALGO_INFO,
};
type
  OFFLOAD_ALGO_INFO {.bycopy.} = object
    algoIdentifier: uint32
    algoKeylen: uint32
    algoRounds: uint32

  OFFLOAD_SECURITY_ASSOCIATION {.bycopy.} = object
    Operation: int32
    SPI: uint32
    IntegrityAlgo: OFFLOAD_ALGO_INFO
    ConfAlgo: OFFLOAD_ALGO_INFO
    Reserved: OFFLOAD_ALGO_INFO
struct OFFLOAD_ALGO_INFO
{
    uint algoIdentifier;
    uint algoKeylen;
    uint algoRounds;
}

struct OFFLOAD_SECURITY_ASSOCIATION
{
    int Operation;
    uint SPI;
    OFFLOAD_ALGO_INFO IntegrityAlgo;
    OFFLOAD_ALGO_INFO ConfAlgo;
    OFFLOAD_ALGO_INFO Reserved;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; OFFLOAD_SECURITY_ASSOCIATION サイズ: 44 バイト(x64)
dim st, 11    ; 4byte整数×11(構造体サイズ 44 / 4 切り上げ)
; Operation : OFFLOAD_OPERATION_E (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; SPI : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; IntegrityAlgo : OFFLOAD_ALGO_INFO (+8, 12byte)  varptr(st)+8 を基点に操作(12byte:入れ子/配列)
; ConfAlgo : OFFLOAD_ALGO_INFO (+20, 12byte)  varptr(st)+20 を基点に操作(12byte:入れ子/配列)
; Reserved : OFFLOAD_ALGO_INFO (+32, 12byte)  varptr(st)+32 を基点に操作(12byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global OFFLOAD_ALGO_INFO
    #field int algoIdentifier
    #field int algoKeylen
    #field int algoRounds
#endstruct

#defstruct global OFFLOAD_SECURITY_ASSOCIATION
    #field int Operation
    #field int SPI
    #field OFFLOAD_ALGO_INFO IntegrityAlgo
    #field OFFLOAD_ALGO_INFO ConfAlgo
    #field OFFLOAD_ALGO_INFO Reserved
#endstruct

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