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

IP_ADAPTER_UNICAST_ADDRESS_LH

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

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

フィールド

フィールドサイズx64x86説明
Anonymous_Anonymous_e__Union8+0+0Lengthとフラグ(DnsEligible/Transient)を保持する匿名共用体である。
NextIP_ADAPTER_UNICAST_ADDRESS_LH*8/4+8+8連結リスト上の次のユニキャストアドレス要素を指すポインタである。末尾はNULL。
AddressSOCKET_ADDRESS16/8+16+12ユニキャストIPアドレスを保持するSOCKET_ADDRESS構造体である。
PrefixOriginNL_PREFIX_ORIGIN4+32+20アドレスプレフィックスの出所(手動/DHCP/RA等)を示す列挙値である。
SuffixOriginNL_SUFFIX_ORIGIN4+36+24アドレスサフィックスの出所を示す列挙値である。
DadStateNL_DAD_STATE4+40+28重複アドレス検出(DAD)の状態を示す列挙値である。
ValidLifetimeDWORD4+44+32アドレスが有効である残り時間を秒単位で示す。無限は0xFFFFFFFF。
PreferredLifetimeDWORD4+48+36アドレスが優先される残り時間を秒単位で示す。無限は0xFFFFFFFF。
LeaseLifetimeDWORD4+52+40アドレスのDHCPリース残り時間を秒単位で示す。
OnLinkPrefixLengthBYTE1+56+44オンリンクサブネットのプレフィックス長(ビット数)を示す。

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

フィールドサイズx64x86説明
AlignmentULONGLONG8+0+0
Anonymous_Anonymous_e__Struct8/4+0+0Lengthとフラグ(DnsEligible/Transient)を保持する匿名共用体である。

各言語での定義

#include <windows.h>

// SOCKET_ADDRESS  (x64 16 / x86 8 バイト)
typedef struct SOCKET_ADDRESS {
    SOCKADDR* lpSockaddr;
    INT iSockaddrLength;
} SOCKET_ADDRESS;

// IP_ADAPTER_UNICAST_ADDRESS_LH  (x64 64 / x86 48 バイト)
typedef struct IP_ADAPTER_UNICAST_ADDRESS_LH {
    _Anonymous_e__Union Anonymous;
    IP_ADAPTER_UNICAST_ADDRESS_LH* Next;
    SOCKET_ADDRESS Address;
    NL_PREFIX_ORIGIN PrefixOrigin;
    NL_SUFFIX_ORIGIN SuffixOrigin;
    NL_DAD_STATE DadState;
    DWORD ValidLifetime;
    DWORD PreferredLifetime;
    DWORD LeaseLifetime;
    BYTE OnLinkPrefixLength;
} IP_ADAPTER_UNICAST_ADDRESS_LH;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct SOCKET_ADDRESS
{
    public IntPtr lpSockaddr;
    public int iSockaddrLength;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct IP_ADAPTER_UNICAST_ADDRESS_LH
{
    public _Anonymous_e__Union Anonymous;
    public IntPtr Next;
    public SOCKET_ADDRESS Address;
    public int PrefixOrigin;
    public int SuffixOrigin;
    public int DadState;
    public uint ValidLifetime;
    public uint PreferredLifetime;
    public uint LeaseLifetime;
    public byte OnLinkPrefixLength;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure SOCKET_ADDRESS
    Public lpSockaddr As IntPtr
    Public iSockaddrLength As Integer
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure IP_ADAPTER_UNICAST_ADDRESS_LH
    Public Anonymous As _Anonymous_e__Union
    Public Next As IntPtr
    Public Address As SOCKET_ADDRESS
    Public PrefixOrigin As Integer
    Public SuffixOrigin As Integer
    Public DadState As Integer
    Public ValidLifetime As UInteger
    Public PreferredLifetime As UInteger
    Public LeaseLifetime As UInteger
    Public OnLinkPrefixLength As Byte
End Structure
import ctypes
from ctypes import wintypes

class SOCKET_ADDRESS(ctypes.Structure):
    _fields_ = [
        ("lpSockaddr", ctypes.c_void_p),
        ("iSockaddrLength", ctypes.c_int),
    ]

class IP_ADAPTER_UNICAST_ADDRESS_LH(ctypes.Structure):
    _fields_ = [
        ("Anonymous", _Anonymous_e__Union),
        ("Next", ctypes.c_void_p),
        ("Address", SOCKET_ADDRESS),
        ("PrefixOrigin", ctypes.c_int),
        ("SuffixOrigin", ctypes.c_int),
        ("DadState", ctypes.c_int),
        ("ValidLifetime", wintypes.DWORD),
        ("PreferredLifetime", wintypes.DWORD),
        ("LeaseLifetime", wintypes.DWORD),
        ("OnLinkPrefixLength", ctypes.c_ubyte),
    ]
#[repr(C)]
pub struct SOCKET_ADDRESS {
    pub lpSockaddr: *mut core::ffi::c_void,
    pub iSockaddrLength: i32,
}

#[repr(C)]
pub struct IP_ADAPTER_UNICAST_ADDRESS_LH {
    pub Anonymous: _Anonymous_e__Union,
    pub Next: *mut core::ffi::c_void,
    pub Address: SOCKET_ADDRESS,
    pub PrefixOrigin: i32,
    pub SuffixOrigin: i32,
    pub DadState: i32,
    pub ValidLifetime: u32,
    pub PreferredLifetime: u32,
    pub LeaseLifetime: u32,
    pub OnLinkPrefixLength: u8,
}
import "golang.org/x/sys/windows"

type SOCKET_ADDRESS struct {
	lpSockaddr uintptr
	iSockaddrLength int32
}

type IP_ADAPTER_UNICAST_ADDRESS_LH struct {
	Anonymous _Anonymous_e__Union
	Next uintptr
	Address SOCKET_ADDRESS
	PrefixOrigin int32
	SuffixOrigin int32
	DadState int32
	ValidLifetime uint32
	PreferredLifetime uint32
	LeaseLifetime uint32
	OnLinkPrefixLength byte
}
type
  SOCKET_ADDRESS = record
    lpSockaddr: Pointer;
    iSockaddrLength: Integer;
  end;

  IP_ADAPTER_UNICAST_ADDRESS_LH = record
    Anonymous: _Anonymous_e__Union;
    Next: Pointer;
    Address: SOCKET_ADDRESS;
    PrefixOrigin: Integer;
    SuffixOrigin: Integer;
    DadState: Integer;
    ValidLifetime: DWORD;
    PreferredLifetime: DWORD;
    LeaseLifetime: DWORD;
    OnLinkPrefixLength: Byte;
  end;
const SOCKET_ADDRESS = extern struct {
    lpSockaddr: ?*anyopaque,
    iSockaddrLength: i32,
};

const IP_ADAPTER_UNICAST_ADDRESS_LH = extern struct {
    Anonymous: _Anonymous_e__Union,
    Next: ?*anyopaque,
    Address: SOCKET_ADDRESS,
    PrefixOrigin: i32,
    SuffixOrigin: i32,
    DadState: i32,
    ValidLifetime: u32,
    PreferredLifetime: u32,
    LeaseLifetime: u32,
    OnLinkPrefixLength: u8,
};
type
  SOCKET_ADDRESS {.bycopy.} = object
    lpSockaddr: pointer
    iSockaddrLength: int32

  IP_ADAPTER_UNICAST_ADDRESS_LH {.bycopy.} = object
    Anonymous: _Anonymous_e__Union
    Next: pointer
    Address: SOCKET_ADDRESS
    PrefixOrigin: int32
    SuffixOrigin: int32
    DadState: int32
    ValidLifetime: uint32
    PreferredLifetime: uint32
    LeaseLifetime: uint32
    OnLinkPrefixLength: uint8
struct SOCKET_ADDRESS
{
    void* lpSockaddr;
    int iSockaddrLength;
}

struct IP_ADAPTER_UNICAST_ADDRESS_LH
{
    _Anonymous_e__Union Anonymous;
    void* Next;
    SOCKET_ADDRESS Address;
    int PrefixOrigin;
    int SuffixOrigin;
    int DadState;
    uint ValidLifetime;
    uint PreferredLifetime;
    uint LeaseLifetime;
    ubyte OnLinkPrefixLength;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; IP_ADAPTER_UNICAST_ADDRESS_LH サイズ: 48 バイト(x86)
dim st, 12    ; 4byte整数×12(構造体サイズ 48 / 4 切り上げ)
; Anonymous : _Anonymous_e__Union (+0, 8byte)  varptr(st)+0 を基点に操作(8byte:入れ子/配列)
; Next : IP_ADAPTER_UNICAST_ADDRESS_LH* (+8, 4byte)  varptr(st)+8 を基点に操作(4byte:入れ子/配列)
; Address : SOCKET_ADDRESS (+12, 8byte)  varptr(st)+12 を基点に操作(8byte:入れ子/配列)
; PrefixOrigin : NL_PREFIX_ORIGIN (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; SuffixOrigin : NL_SUFFIX_ORIGIN (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; DadState : NL_DAD_STATE (+28, 4byte)  st.7 = 値  /  値 = st.7   (lpoke/lpeek も可)
; ValidLifetime : DWORD (+32, 4byte)  st.8 = 値  /  値 = st.8   (lpoke/lpeek も可)
; PreferredLifetime : DWORD (+36, 4byte)  st.9 = 値  /  値 = st.9   (lpoke/lpeek も可)
; LeaseLifetime : DWORD (+40, 4byte)  st.10 = 値  /  値 = st.10   (lpoke/lpeek も可)
; OnLinkPrefixLength : BYTE (+44, 1byte)  poke st,44,値  /  値 = peek(st,44)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; IP_ADAPTER_UNICAST_ADDRESS_LH サイズ: 64 バイト(x64)
dim st, 16    ; 4byte整数×16(構造体サイズ 64 / 4 切り上げ)
; Anonymous : _Anonymous_e__Union (+0, 8byte)  varptr(st)+0 を基点に操作(8byte:入れ子/配列)
; Next : IP_ADAPTER_UNICAST_ADDRESS_LH* (+8, 8byte)  varptr(st)+8 を基点に操作(8byte:入れ子/配列)
; Address : SOCKET_ADDRESS (+16, 16byte)  varptr(st)+16 を基点に操作(16byte:入れ子/配列)
; PrefixOrigin : NL_PREFIX_ORIGIN (+32, 4byte)  st.8 = 値  /  値 = st.8   (lpoke/lpeek も可)
; SuffixOrigin : NL_SUFFIX_ORIGIN (+36, 4byte)  st.9 = 値  /  値 = st.9   (lpoke/lpeek も可)
; DadState : NL_DAD_STATE (+40, 4byte)  st.10 = 値  /  値 = st.10   (lpoke/lpeek も可)
; ValidLifetime : DWORD (+44, 4byte)  st.11 = 値  /  値 = st.11   (lpoke/lpeek も可)
; PreferredLifetime : DWORD (+48, 4byte)  st.12 = 値  /  値 = st.12   (lpoke/lpeek も可)
; LeaseLifetime : DWORD (+52, 4byte)  st.13 = 値  /  値 = st.13   (lpoke/lpeek も可)
; OnLinkPrefixLength : BYTE (+56, 1byte)  poke st,56,値  /  値 = peek(st,56)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global SOCKET_ADDRESS
    #field intptr lpSockaddr
    #field int iSockaddrLength
#endstruct

#defstruct global IP_ADAPTER_UNICAST_ADDRESS_LH
    #field byte Anonymous 8
    #field intptr Next
    #field SOCKET_ADDRESS Address
    #field int PrefixOrigin
    #field int SuffixOrigin
    #field int DadState
    #field int ValidLifetime
    #field int PreferredLifetime
    #field int LeaseLifetime
    #field byte OnLinkPrefixLength
#endstruct

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