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 | リスト内の次の IP アダプター アドレス構造体へのポインターです。 |
| Address | SOCKET_ADDRESS | 16/8 | +16 | +12 | このユニキャスト IP アドレス エントリの IP アドレスです。このメンバーには IPv6 アドレスまたは IPv4 アドレスを指定できます。 |
| PrefixOrigin | NL_PREFIX_ORIGIN | 4 | +32 | +20 | IP アドレスのプレフィックス部分 (ネットワーク部) です。このメンバーには、Iptypes.h ヘッダー ファイルで定義されている IP_PREFIX_ORIGIN 列挙型の値のいずれかを指定できます。 |
| SuffixOrigin | NL_SUFFIX_ORIGIN | 4 | +36 | +24 | IP アドレスのサフィックス部分 (ホスト部) です。このメンバーには、Iptypes.h ヘッダー ファイルで定義されている IP_SUFFIX_ORIGIN 列挙型の値のいずれかを指定できます。 |
| DadState | NL_DAD_STATE | 4 | +40 | +28 | 重複アドレス検出 (DAD) の状態です。このメンバーには、Iptypes.h ヘッダー ファイルで定義されている IP_DAD_STATE 列挙型の値のいずれかを指定できます。 重複アドレス検出は、IPv4 アドレスと IPv6 アドレスの両方で利用できます。 |
| ValidLifetime | DWORD | 4 | +44 | +32 | この IP アドレスが有効である最大の期間 (秒単位)。0xffffffff は無限として扱われます。 |
| PreferredLifetime | DWORD | 4 | +48 | +36 | この IP アドレスが有効である推奨の期間 (秒単位)。0xffffffff は無限として扱われます。 |
| LeaseLifetime | DWORD | 4 | +52 | +40 | この IP アドレスが有効であるリース期間 (秒単位)。 |
| OnLinkPrefixLength | BYTE | 1 | +56 | +44 | IP アドレスのプレフィックス部分 (ネットワーク部) の長さ (ビット単位)。ユニキャスト IPv4 アドレスの場合、32 を超える値はすべて不正な値です。ユニキャスト IPv6 アドレスの場合、128 を超える値はすべて不正な値です。 不正な値を表すために、一般に 255 が使用されます。 メモ この構造体メンバーは Windows Vista 以降でのみ使用できます。
|
共用体: _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)を保持する匿名共用体である。 |
公式ドキュメント
IP_ADAPTER_UNICAST_ADDRESS 構造体は、特定のアダプターの IP アドレスのリンク リスト内にある単一のユニキャスト IP アドレスを格納します。
解説(Remarks)
IP_ADAPTER_ADDRESSES 構造体は、GetAdaptersAddresses 関数によって取得されます。IP_ADAPTER_ADDRESSES 構造体の FirstUnicastAddress メンバーは、IP_ADAPTER_UNICAST_ADDRESS 構造体のリンク リストへのポインターです。
IP_ADAPTER_UNICAST_ADDRESS 構造体のサイズは、Windows Vista 以降で変更されました。使用されている IP_ADAPTER_UNICAST_ADDRESS 構造体のバージョンを判別するには、Length メンバーを使用してください。
Windows Vista 以降の IP_ADAPTER_UNICAST_ADDRESS 構造体のバージョンには、新しいメンバーとして OnLinkPrefixLength が追加されています。
この構造体を GetAdaptersAddresses 関数や同様の管理関数と共に使用した場合、重複するアドレスも含め、構成されているすべてのアドレスが示されます。このような重複アドレスのエントリは、アドレスが静的に構成されている場合に発生することがあります。このように報告されることで、管理者によるトラブルシューティングが容易になります。DadState メンバーは、そうした状況の特定とトラブルシューティングに有効です。
Windows SDK では、Windows Vista 以降で使用する構造体のバージョンは IP_ADAPTER_UNICAST_ADDRESS_LH として定義されています。Windows SDK では、Windows XP Service Pack 1 (SP1) 以降を含むそれ以前のシステムで使用するこの構造体のバージョンは IP_ADAPTER_UNICAST_ADDRESS_XP として定義されています。アプリケーションのコンパイル時に、対象プラットフォームが Windows Vista 以降 (NTDDI_VERSION >= NTDDI_VISTA、_WIN32_WINNT >= 0x0600、または WINVER >= 0x0600) である場合、IP_ADAPTER_UNICAST_ADDRESS_LH 構造体が IP_ADAPTER_UNICAST_ADDRESS 構造体として typedef されます。アプリケーションのコンパイル時に、対象プラットフォームが Windows Vista 以降でない場合は、IP_ADAPTER_UNICAST_ADDRESS_XP 構造体が IP_ADAPTER_UNICAST_ADDRESS 構造体として typedef されます。
IP_ADAPTER_UNICAST_ADDRESS 構造体では SOCKET_ADDRESS 構造体が使用されます。Windows Vista 以降向けにリリースされた Microsoft Windows Software Development Kit (SDK) では、ヘッダー ファイルの構成が変更され、SOCKET_ADDRESS 構造体は Ws2def.h ヘッダー ファイルで定義されています。このヘッダー ファイルは Winsock2.h ヘッダー ファイルによって自動的にインクルードされます。Windows Server 2003 および Windows XP 向けにリリースされた Platform Software Development Kit (SDK) では、SOCKET_ADDRESS 構造体は Winsock2.h ヘッダー ファイルで宣言されています。IP_ADAPTER_UNICAST_ADDRESS 構造体を使用するには、Iphlpapi.h ヘッダー ファイルより前に Winsock2.h ヘッダー ファイルをインクルードする必要があります。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での定義
#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 非対応)。必要に応じ手動でアクセス。