IP_ADAPTER_UNICAST_ADDRESS_XP
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| Anonymous | _Anonymous_e__Union | 8 | +0 | +0 | Lengthとフラグを保持する匿名共用体である。 |
| Next | IP_ADAPTER_UNICAST_ADDRESS_XP* | 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 アドレスが有効であるリース期間 (秒単位)。 |
共用体: _Anonymous_e__Union x64 8B / x86 8B
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| Alignment | ULONGLONG | 8 | +0 | +0 | 予約済みです。構造体のアラインメントを調整するためにコンパイラーが使用します。 |
| Anonymous | _Anonymous_e__Struct | 8/4 | +0 | +0 | Lengthとフラグを保持する匿名共用体である。 |
公式ドキュメント
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_XP (x64 56 / x86 48 バイト)
typedef struct IP_ADAPTER_UNICAST_ADDRESS_XP {
_Anonymous_e__Union Anonymous;
IP_ADAPTER_UNICAST_ADDRESS_XP* Next;
SOCKET_ADDRESS Address;
NL_PREFIX_ORIGIN PrefixOrigin;
NL_SUFFIX_ORIGIN SuffixOrigin;
NL_DAD_STATE DadState;
DWORD ValidLifetime;
DWORD PreferredLifetime;
DWORD LeaseLifetime;
} IP_ADAPTER_UNICAST_ADDRESS_XP;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_XP
{
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;
}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_XP
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
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_XP(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),
]#[repr(C)]
pub struct SOCKET_ADDRESS {
pub lpSockaddr: *mut core::ffi::c_void,
pub iSockaddrLength: i32,
}
#[repr(C)]
pub struct IP_ADAPTER_UNICAST_ADDRESS_XP {
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,
}import "golang.org/x/sys/windows"
type SOCKET_ADDRESS struct {
lpSockaddr uintptr
iSockaddrLength int32
}
type IP_ADAPTER_UNICAST_ADDRESS_XP struct {
Anonymous _Anonymous_e__Union
Next uintptr
Address SOCKET_ADDRESS
PrefixOrigin int32
SuffixOrigin int32
DadState int32
ValidLifetime uint32
PreferredLifetime uint32
LeaseLifetime uint32
}type
SOCKET_ADDRESS = record
lpSockaddr: Pointer;
iSockaddrLength: Integer;
end;
IP_ADAPTER_UNICAST_ADDRESS_XP = record
Anonymous: _Anonymous_e__Union;
Next: Pointer;
Address: SOCKET_ADDRESS;
PrefixOrigin: Integer;
SuffixOrigin: Integer;
DadState: Integer;
ValidLifetime: DWORD;
PreferredLifetime: DWORD;
LeaseLifetime: DWORD;
end;const SOCKET_ADDRESS = extern struct {
lpSockaddr: ?*anyopaque,
iSockaddrLength: i32,
};
const IP_ADAPTER_UNICAST_ADDRESS_XP = extern struct {
Anonymous: _Anonymous_e__Union,
Next: ?*anyopaque,
Address: SOCKET_ADDRESS,
PrefixOrigin: i32,
SuffixOrigin: i32,
DadState: i32,
ValidLifetime: u32,
PreferredLifetime: u32,
LeaseLifetime: u32,
};type
SOCKET_ADDRESS {.bycopy.} = object
lpSockaddr: pointer
iSockaddrLength: int32
IP_ADAPTER_UNICAST_ADDRESS_XP {.bycopy.} = object
Anonymous: _Anonymous_e__Union
Next: pointer
Address: SOCKET_ADDRESS
PrefixOrigin: int32
SuffixOrigin: int32
DadState: int32
ValidLifetime: uint32
PreferredLifetime: uint32
LeaseLifetime: uint32struct SOCKET_ADDRESS
{
void* lpSockaddr;
int iSockaddrLength;
}
struct IP_ADAPTER_UNICAST_ADDRESS_XP
{
_Anonymous_e__Union Anonymous;
void* Next;
SOCKET_ADDRESS Address;
int PrefixOrigin;
int SuffixOrigin;
int DadState;
uint ValidLifetime;
uint PreferredLifetime;
uint LeaseLifetime;
}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_XP サイズ: 48 バイト(x86)
dim st, 12 ; 4byte整数×12(構造体サイズ 48 / 4 切り上げ)
; Anonymous : _Anonymous_e__Union (+0, 8byte) varptr(st)+0 を基点に操作(8byte:入れ子/配列)
; Next : IP_ADAPTER_UNICAST_ADDRESS_XP* (+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 も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; IP_ADAPTER_UNICAST_ADDRESS_XP サイズ: 56 バイト(x64)
dim st, 14 ; 4byte整数×14(構造体サイズ 56 / 4 切り上げ)
; Anonymous : _Anonymous_e__Union (+0, 8byte) varptr(st)+0 を基点に操作(8byte:入れ子/配列)
; Next : IP_ADAPTER_UNICAST_ADDRESS_XP* (+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 も可)
; ※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_XP
#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
#endstruct
stdim st, IP_ADAPTER_UNICAST_ADDRESS_XP ; NSTRUCT 変数を確保
st->PrefixOrigin = 100
mes "PrefixOrigin=" + st->PrefixOrigin
; ※union フィールドは byte 列で確保(NSTRUCT は union 非対応)。必要に応じ手動でアクセス。