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リスト内の次の IP アダプター アドレス構造体へのポインターです。
AddressSOCKET_ADDRESS16/8+16+12このユニキャスト IP アドレス エントリの IP アドレスです。このメンバーには IPv6 アドレスまたは IPv4 アドレスを指定できます。
PrefixOriginNL_PREFIX_ORIGIN4+32+20IP アドレスのプレフィックス部分 (ネットワーク部) です。このメンバーには、Iptypes.h ヘッダー ファイルで定義されている IP_PREFIX_ORIGIN 列挙型の値のいずれかを指定できます。
SuffixOriginNL_SUFFIX_ORIGIN4+36+24IP アドレスのサフィックス部分 (ホスト部) です。このメンバーには、Iptypes.h ヘッダー ファイルで定義されている IP_SUFFIX_ORIGIN 列挙型の値のいずれかを指定できます。
DadStateNL_DAD_STATE4+40+28重複アドレス検出 (DAD) の状態です。このメンバーには、Iptypes.h ヘッダー ファイルで定義されている IP_DAD_STATE 列挙型の値のいずれかを指定できます。 重複アドレス検出は、IPv4 アドレスと IPv6 アドレスの両方で利用できます。
ValidLifetimeDWORD4+44+32この IP アドレスが有効である最大の期間 (秒単位)。0xffffffff は無限として扱われます。
PreferredLifetimeDWORD4+48+36この IP アドレスが有効である推奨の期間 (秒単位)。0xffffffff は無限として扱われます。
LeaseLifetimeDWORD4+52+40この IP アドレスが有効であるリース期間 (秒単位)。
OnLinkPrefixLengthBYTE1+56+44

IP アドレスのプレフィックス部分 (ネットワーク部) の長さ (ビット単位)。ユニキャスト IPv4 アドレスの場合、32 を超える値はすべて不正な値です。ユニキャスト IPv6 アドレスの場合、128 を超える値はすべて不正な値です。 不正な値を表すために、一般に 255 が使用されます。

メモ この構造体メンバーは Windows Vista 以降でのみ使用できます。

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

フィールドサイズx64x86説明
AlignmentULONGLONG8+0+0
Anonymous_Anonymous_e__Struct8/4+0+0Lengthとフラグ(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 の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
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 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 非対応)。必要に応じ手動でアクセス。