ホーム › NetworkManagement.IpHelper › IP_ADAPTER_UNICAST_ADDRESS_LH
IP_ADAPTER_UNICAST_ADDRESS_LH
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| Anonymous | _Anonymous_e__Union | 8 | +0 | +0 | Lengthとフラグ(DnsEligible/Transient)を保持する匿名共用体である。 |
| Next | IP_ADAPTER_UNICAST_ADDRESS_LH* | 8/4 | +8 | +8 | 連結リスト上の次のユニキャストアドレス要素を指すポインタである。末尾はNULL。 |
| Address | SOCKET_ADDRESS | 16/8 | +16 | +12 | ユニキャストIPアドレスを保持するSOCKET_ADDRESS構造体である。 |
| PrefixOrigin | NL_PREFIX_ORIGIN | 4 | +32 | +20 | アドレスプレフィックスの出所(手動/DHCP/RA等)を示す列挙値である。 |
| SuffixOrigin | NL_SUFFIX_ORIGIN | 4 | +36 | +24 | アドレスサフィックスの出所を示す列挙値である。 |
| DadState | NL_DAD_STATE | 4 | +40 | +28 | 重複アドレス検出(DAD)の状態を示す列挙値である。 |
| ValidLifetime | DWORD | 4 | +44 | +32 | アドレスが有効である残り時間を秒単位で示す。無限は0xFFFFFFFF。 |
| PreferredLifetime | DWORD | 4 | +48 | +36 | アドレスが優先される残り時間を秒単位で示す。無限は0xFFFFFFFF。 |
| LeaseLifetime | DWORD | 4 | +52 | +40 | アドレスのDHCPリース残り時間を秒単位で示す。 |
| OnLinkPrefixLength | BYTE | 1 | +56 | +44 | オンリンクサブネットのプレフィックス長(ビット数)を示す。 |
共用体: _Anonymous_e__Union x64 8B / x86 8B
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| Alignment | ULONGLONG | 8 | +0 | +0 | |
| Anonymous | _Anonymous_e__Struct | 8/4 | +0 | +0 | Lengthとフラグ(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 Structureimport 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: uint8struct 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 非対応)。必要に応じ手動でアクセス。