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

IP_ADAPTER_ADDRESSES_XP

構造体
サイズx64: 184 バイト / x86: 144 バイト

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

フィールド

フィールドサイズx64x86説明
Anonymous_Anonymous_e__Union8+0+0LengthとIfIndexを保持する匿名共用体である。
NextIP_ADAPTER_ADDRESSES_XP*8/4+8+8リスト内の次のアダプターアドレス構造体へのポインター。
AdapterNameLPSTR8/4+16+12これらのアドレスが関連付けられているアダプターの名前を格納する文字の配列。 アダプターのフレンドリ名とは異なり、AdapterName に指定されるアダプター名は 永続的であり、ユーザーが変更することはできません。
FirstUnicastAddressIP_ADAPTER_UNICAST_ADDRESS_XP*8/4+24+16アダプターの IP ユニキャストアドレスの連結リスト内にある最初の IP_ADAPTER_UNICAST_ADDRESS 構造体への ポインター。
FirstAnycastAddressIP_ADAPTER_ANYCAST_ADDRESS_XP*8/4+32+20アダプターの IP エニーキャストアドレスの連結リスト内にある最初の IP_ADAPTER_ANYCAST_ADDRESS 構造体への ポインター。
FirstMulticastAddressIP_ADAPTER_MULTICAST_ADDRESS_XP*8/4+40+24アダプターの IP マルチキャストアドレスのリスト内にある最初の IP_ADAPTER_MULTICAST_ADDRESS 構造体への ポインター。
FirstDnsServerAddressIP_ADAPTER_DNS_SERVER_ADDRESS_XP*8/4+48+28アダプターの DNS サーバーアドレスの連結リスト内にある最初の IP_ADAPTER_DNS_SERVER_ADDRESS 構造体への ポインター。
DnsSuffixLPWSTR8/4+56+32このアダプターに関連付けられたドメインネームシステム (DNS) サフィックス。
DescriptionLPWSTR8/4+64+36アダプターの説明。このメンバーは読み取り専用です。
FriendlyNameLPWSTR8/4+72+40

アダプターのユーザーフレンドリな名前。たとえば「Local Area Connection 1」です。この名前は、 ipconfig コマンドラインプログラムやネットワーク接続フォルダーなどのコンテキストで表示されます。このメンバーは読み取り専用であり、 IP ヘルパー関数で変更することはできません。

このメンバーは、RFC 2863 に記載されているとおり、 NDIS が使用する ifAlias フィールドです。ifAlias フィールドは、NDIS ドライバーのインストール時に NDIS インターフェイスプロバイダーが設定できます。NDIS ミニポートドライバーの場合、このフィールドは NDIS によって設定されます。

PhysicalAddressBYTE8+80+44アダプターのメディアアクセス制御 (MAC) アドレス。たとえば、イーサネットネットワークでは、このメンバーは イーサネットのハードウェアアドレスを指定します。
PhysicalAddressLengthDWORD4+88+52PhysicalAddress メンバーに指定されたアドレスの長さ (バイト単位)。 データリンク層を持たないインターフェイスの場合、この値は 0 です。
FlagsDWORD4+92+56

アダプターのさまざまな設定を指定するフラグのセット。これらの値は Iptypes.h ヘッダーファイルで定義されています。これらのフラグビットは組み合わせて指定できます。

フラグ 意味
IP_ADAPTER_DDNS_ENABLED
0x0001
このアダプターで動的 DNS が有効です。
IP_ADAPTER_REGISTER_ADAPTER_SUFFIX
0x0002
このアダプターの DNS サフィックスを登録します。
IP_ADAPTER_DHCP_ENABLED
0x0004
このアダプターで動的ホスト構成プロトコル (DHCP) が有効です。
IP_ADAPTER_RECEIVE_ONLY
0x0008
アダプターは受信専用アダプターです。
IP_ADAPTER_NO_MULTICAST
0x0010
アダプターはマルチキャストの受信者ではありません。
IP_ADAPTER_IPV6_OTHER_STATEFUL_CONFIG
0x0020
アダプターは、その他の IPv6 固有のステートフルな構成情報を保持しています。
IP_ADAPTER_NETBIOS_OVER_TCPIP_ENABLED
0x0040
アダプターで NetBIOS over TCP/IP が有効です。
注意 このフラグは、NTDDI バージョンが NTDDI_LONGHORN 以上のターゲットプラットフォーム向けにアプリケーションがコンパイルされている場合に、 Windows Vista 以降でのみサポートされます。このフラグは、 IP_ADAPTER_ADDRESSES_LH 構造体では NetbiosOverTcpipEnabled ビットフィールドとして定義されています。
IP_ADAPTER_IPV4_ENABLED
0x0080
アダプターで IPv4 が有効です。
注意 このフラグは、NTDDI バージョンが NTDDI_LONGHORN 以上のターゲットプラットフォーム向けにアプリケーションがコンパイルされている場合に、 Windows Vista 以降でのみサポートされます。このフラグは、 IP_ADAPTER_ADDRESSES_LH 構造体では Ipv4Enabled ビットフィールドとして定義されています。
IP_ADAPTER_IPV6_ENABLED
0x0100
アダプターで IPv6 が有効です。
注意 このフラグは、NTDDI バージョンが NTDDI_LONGHORN 以上のターゲットプラットフォーム向けにアプリケーションがコンパイルされている場合に、 Windows Vista 以降でのみサポートされます。このフラグは、 IP_ADAPTER_ADDRESSES_LH 構造体では Ipv6Enabled ビットフィールドとして定義されています。
IP_ADAPTER_IPV6_MANAGE_ADDRESS_CONFIG
0x0200
アダプターで IPv6 の管理されたアドレス構成 (managed address configuration) が有効です。
注意 このフラグは、NTDDI バージョンが NTDDI_LONGHORN 以上のターゲットプラットフォーム向けにアプリケーションがコンパイルされている場合に、 Windows Vista 以降でのみサポートされます。このフラグは、 IP_ADAPTER_ADDRESSES_LH 構造体では Ipv6ManagedAddressConfigurationSupported ビットフィールドとして定義されています。
MtuDWORD4+96+60最大転送単位 (MTU) のサイズ (バイト単位)。
IfTypeDWORD4+100+64

Internet Assigned Names Authority (IANA) によって定義されたインターフェイスの種類。インターフェイスの種類に 指定できる値は、Ipifcons.h ヘッダーファイルに列挙されています。

次の表に、インターフェイスの種類として代表的な値を示します。ただし、これ以外にも多くの値が存在します。

意味
IF_TYPE_OTHER
1
その他の種類のネットワークインターフェイス。
IF_TYPE_ETHERNET_CSMACD
6
イーサネットのネットワークインターフェイス。
IF_TYPE_ISO88025_TOKENRING
9
トークンリングのネットワークインターフェイス。
IF_TYPE_PPP
23
PPP のネットワークインターフェイス。
IF_TYPE_SOFTWARE_LOOPBACK
24
ソフトウェアループバックのネットワークインターフェイス。
IF_TYPE_ATM
37
ATM のネットワークインターフェイス。
IF_TYPE_IEEE80211
71
IEEE 802.11 ワイヤレスネットワークインターフェイス。

Windows Vista 以降では、ワイヤレスネットワークカードは IF_TYPE_IEEE80211 として報告されます。それ以前のバージョンの Windows では、ワイヤレス ネットワークカードは IF_TYPE_ETHERNET_CSMACD として報告されます。

Windows XP with SP3、および Wireless LAN API for Windows XP with SP2 をインストールした Windows XP with SP2 x86 では、WlanEnumInterfaces 関数を使用して、ローカルコンピューター上のワイヤレスインターフェイスを列挙できます。

IF_TYPE_TUNNEL
131
トンネル型カプセル化のネットワークインターフェイス。
IF_TYPE_IEEE1394
144
IEEE 1394 (FireWire) 高性能シリアルバスのネットワークインターフェイス。
OperStatusIF_OPER_STATUS4+104+68

RFC 2863 で定義されているインターフェイスの動作状態。詳細については、 http://www.ietf.org/rfc/rfc2863.txt を参照してください。この メンバーには、Iftypes.h ヘッダーファイルで定義されている IF_OPER_STATUS 列挙型の値のいずれかを指定できます。Windows Vista 以降ではヘッダーファイルの構成が 変更され、この列挙型は Ifdef.h ヘッダーファイルで定義されています。

意味
IfOperStatusUp
1
インターフェイスは動作中であり、パケットを転送できます。
IfOperStatusDown
2
インターフェイスは停止しており、パケットを転送できる状態ではありません。 IfOperStatusDown 状態には、AdminStatus メンバーの値に応じて 2 つの意味があります。AdminStatusNET_IF_ADMIN_STATUS_DOWN に設定されておらず、ifOperStatusIfOperStatusDown に設定されている場合は、インターフェイスに障害が発生していると見なされます。 AdminStatusIfOperStatusDown に設定されている場合は、 通常 ifOperStatusIfOperStatusDown または IfOperStatusNotPresent に設定されますが、 インターフェイスに必ずしも障害があるわけではありません。
IfOperStatusTesting
3
インターフェイスはテストモードです。
IfOperStatusUnknown
4
インターフェイスの動作状態は不明です。
IfOperStatusDormant
5
インターフェイスは実際にはパケットを転送できる状態 (動作中) ではありませんが、何らかの外部イベントを待機する 保留状態にあります。オンデマンドインターフェイスの場合、この状態は、インターフェイスを IfOperStatusUp 状態にするイベントを待機している状況を表します。
IfOperStatusNotPresent
6
IfOperStatusDown 状態をさらに細分化した状態で、該当する インターフェイスが停止している理由が、管理対象システムに何らかのコンポーネント (通常はハードウェアコンポーネント) が 存在しないためであることを示します。
IfOperStatusLowerLayerDown
7
IfOperStatusDown 状態をさらに細分化した状態です。この状態は、 このインターフェイスが 1 つ以上の他のインターフェイスの上位で動作しており、それらの下位層インターフェイスの 1 つ以上が停止しているために、このインターフェイスが停止していることを示します。
Ipv6IfIndexDWORD4+108+72

IPv6 IP アドレスのインターフェイスインデックス。インターフェイスで IPv6 が利用できない場合、このメンバーは 0 です。

注意 この構造体メンバーは、Windows XP with SP1 以降でのみ利用できます。
ZoneIndicesDWORD64+112+76

sockaddr 構造体を構成するために使用される、 各スコープレベルのスコープ ID の配列。配列のインデックスには SCOPE_LEVEL 列挙型を使用します。 IPv6 では、1 つのインターフェイスにスコープ ID に基づく複数の IPv6 マルチキャストアドレスを割り当てることができます。

注意 この構造体メンバーは、Windows XP with SP1 以降でのみ利用できます。
FirstPrefixIP_ADAPTER_PREFIX_XP*8/4+176+140

アダプターの IP アダプタープレフィックスの連結リスト内にある最初の IP_ADAPTER_PREFIX 構造体へのポインター。

注意 この構造体メンバーは、Windows XP with SP1 以降でのみ利用できます。

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

フィールドサイズx64x86説明
AlignmentULONGLONG8+0+0予約済みです。構造体を整列するためにコンパイラーが使用します。
Anonymous_Anonymous_e__Struct8/4+0+0LengthとIfIndexを保持する匿名共用体である。

公式ドキュメント

IP_ADAPTER_ADDRESSES 構造体は、特定のアダプターに関するアドレスの連結リストの ヘッダーノードです。この構造体は、同時に IP_ADAPTER_ADDRESSES 構造体の連結リストの一部として使用することもできます。

解説(Remarks)

GetAdaptersAddresses 関数は、 IPv4 アドレスと IPv6 アドレスの情報を取得し、その情報を IP_ADAPTER_ADDRESSES 構造体の連結リストとして返します。

IfIndex メンバーおよび Ipv6IfIndex メンバーに指定されるアダプターのインデックス値は、アダプターを 無効にしてから有効にした場合や、その他の状況で変化する可能性があるため、永続的なものと見なさないでください。

IfType メンバーの値は、Ipifcons.h ヘッダーファイルで定義されています。現在サポートされているのは、 IfType メンバーの説明に記載されている値のみです。

IP_ADAPTER_ADDRESSES 構造体のサイズは、 Windows XP with SP1 以降で変更されています。IP_ADAPTER_ADDRESSES 構造体のサイズは、 Windows Vista 以降でも変更されています。さらに、 IP_ADAPTER_ADDRESSES 構造体のサイズは、 Windows Vista with SP1 以降および Windows Server 2008 以降でも変更されています。どのバージョンの IP_ADAPTER_ADDRESSES 構造体が使用されているかを判断するには、Length メンバーを 使用してください。

Windows XP with SP1 以降における IP_ADAPTER_ADDRESSES 構造体のバージョンでは、次のメンバーが新たに追加されています。 Ipv6IfIndexZoneIndicesFirstPrefix

Windows Vista 以降における IP_ADAPTER_ADDRESSES 構造体のバージョンでは、次のメンバーが新たに追加されています。 TransmitLinkSpeedReceiveLinkSpeedFirstWinsServerAddressFirstGatewayAddressIpv4MetricIpv6MetricLuidDhcpv4ServerCompartmentIdNetworkGuidConnectionTypeTunnelTypeDhcpv6ServerDhcpv6ClientDuidDhcpv6ClientDuidLengthDhcpv6Iaid

Windows Vista with SP1 以降および Windows Server 2008 以降における IP_ADAPTER_ADDRESSES 構造体のバージョンでは、次のメンバーが新たに追加されています。 FirstDnsSuffix

Ipv4Metric メンバーおよび Ipv6Metric メンバーは、ローカルコンピューター上の複数の インターフェイスに接続されているルートについて、ルートメトリックの優先順位を決めるために使用されます。

GetAdaptersAddresses 関数が返す、FirstUnicastAddress メンバーが指す連結された IP_ADAPTER_UNICAST_ADDRESS 構造体の順序は、IP アドレスがアダプターに追加された順序を反映しておらず、Windows のバージョンによって異なる場合があります。同様に、FirstAnycastAddress メンバーが指す連結された IP_ADAPTER_ANYCAST_ADDRESS 構造体の順序や、FirstMulticastAddress メンバーが指す連結された IP_ADAPTER_MULTICAST_ADDRESS 構造体の順序も、IP アドレスがアダプターに追加された順序を反映しておらず、Windows のバージョンによって異なる場合があります。

また、FirstUnicastAddress メンバーが指す連結された IP_ADAPTER_UNICAST_ADDRESS 構造体と、FirstPrefix メンバーが指す連結された IP_ADAPTER_PREFIX 構造体は、オペレーティングシステムによって別々の内部連結リストとして管理されています。そのため、FirstUnicastAddress メンバーが指す連結された IP_ADAPTER_UNICAST_ADDRESS 構造体の順序は、FirstPrefix メンバーが指す連結された IP_ADAPTER_PREFIX 構造体の順序とは何の関係もありません。

Windows Vista 以降では、FirstPrefix メンバーが指す連結された IP_ADAPTER_PREFIX 構造体には、アダプターに割り当てられた IP アドレスごとに 3 つの IP アダプタープレフィックスが含まれます。これらは、ホスト IP アドレスのプレフィックス、サブネット IP アドレスのプレフィックス、およびサブネットブロードキャスト IP アドレスのプレフィックスです。さらに、アダプターごとにマルチキャストアドレスのプレフィックスとブロードキャストアドレスのプレフィックスが 1 つずつ存在します。

Windows XP with SP1 以降 Windows Vista より前のバージョンでは、FirstPrefix メンバーが指す連結された IP_ADAPTER_PREFIX 構造体には、アダプターに割り当てられた IP アドレスごとに 1 つの IP アダプタープレフィックスのみが含まれます。

Windows SDK では、Windows Vista 以降で使用する構造体のバージョンは IP_ADAPTER_ADDRESSES_LH として定義されています。 Microsoft Windows Software Development Kit (SDK) では、Windows XP with SP1 以降を含む それ以前のシステムで使用するこの構造体のバージョンは IP_ADAPTER_ADDRESSES_XP として定義されています。アプリケーションのコンパイル時に、ターゲットプラットフォームが Windows Vista 以降である場合 (NTDDI_VERSION >= NTDDI_LONGHORN_WIN32_WINNT >= 0x0600、または WINVER >= 0x0600)、 IP_ADAPTER_ADDRESSES_LH 構造体が IP_ADAPTER_ADDRESSES 構造体として typedef されます。アプリケーションのコンパイル時に、ターゲット プラットフォームが Windows Vista 以降でない場合は、 IP_ADAPTER_ADDRESSES_XP 構造体が IP_ADAPTER_ADDRESSES 構造体として typedef されます。

IP_ADAPTER_ADDRESSES 構造体では SOCKET_ADDRESS 構造体が使用されます。 Windows Vista 以降向けにリリースされた Windows SDK では、ヘッダーファイルの構成が 変更されており、SOCKET_ADDRESS 構造体は Ws2def.h ヘッダーファイルで 定義されています。このヘッダーファイルは Winsock2.h ヘッダーファイルによって自動的にインクルードされます。 Windows Server 2003 および Windows XP 向けにリリースされた Platform Software Development Kit (SDK) では、 SOCKET_ADDRESS 構造体は Winsock2.h ヘッダーファイルで宣言されています。 IP_ADAPTER_ADDRESSES 構造体を使用するには、 Winsock2.h ヘッダーファイルを Iphlpapi.h ヘッダーファイルよりも前にインクルードする必要があります。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での定義

#include <windows.h>

// IP_ADAPTER_ADDRESSES_XP  (x64 184 / x86 144 バイト)
typedef struct IP_ADAPTER_ADDRESSES_XP {
    _Anonymous_e__Union Anonymous;
    IP_ADAPTER_ADDRESSES_XP* Next;
    LPSTR AdapterName;
    IP_ADAPTER_UNICAST_ADDRESS_XP* FirstUnicastAddress;
    IP_ADAPTER_ANYCAST_ADDRESS_XP* FirstAnycastAddress;
    IP_ADAPTER_MULTICAST_ADDRESS_XP* FirstMulticastAddress;
    IP_ADAPTER_DNS_SERVER_ADDRESS_XP* FirstDnsServerAddress;
    LPWSTR DnsSuffix;
    LPWSTR Description;
    LPWSTR FriendlyName;
    BYTE PhysicalAddress[8];
    DWORD PhysicalAddressLength;
    DWORD Flags;
    DWORD Mtu;
    DWORD IfType;
    IF_OPER_STATUS OperStatus;
    DWORD Ipv6IfIndex;
    DWORD ZoneIndices[16];
    IP_ADAPTER_PREFIX_XP* FirstPrefix;
} IP_ADAPTER_ADDRESSES_XP;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct IP_ADAPTER_ADDRESSES_XP
{
    public _Anonymous_e__Union Anonymous;
    public IntPtr Next;
    public IntPtr AdapterName;
    public IntPtr FirstUnicastAddress;
    public IntPtr FirstAnycastAddress;
    public IntPtr FirstMulticastAddress;
    public IntPtr FirstDnsServerAddress;
    public IntPtr DnsSuffix;
    public IntPtr Description;
    public IntPtr FriendlyName;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public byte[] PhysicalAddress;
    public uint PhysicalAddressLength;
    public uint Flags;
    public uint Mtu;
    public uint IfType;
    public int OperStatus;
    public uint Ipv6IfIndex;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public uint[] ZoneIndices;
    public IntPtr FirstPrefix;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure IP_ADAPTER_ADDRESSES_XP
    Public Anonymous As _Anonymous_e__Union
    Public Next As IntPtr
    Public AdapterName As IntPtr
    Public FirstUnicastAddress As IntPtr
    Public FirstAnycastAddress As IntPtr
    Public FirstMulticastAddress As IntPtr
    Public FirstDnsServerAddress As IntPtr
    Public DnsSuffix As IntPtr
    Public Description As IntPtr
    Public FriendlyName As IntPtr
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=8)> Public PhysicalAddress() As Byte
    Public PhysicalAddressLength As UInteger
    Public Flags As UInteger
    Public Mtu As UInteger
    Public IfType As UInteger
    Public OperStatus As Integer
    Public Ipv6IfIndex As UInteger
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=16)> Public ZoneIndices() As UInteger
    Public FirstPrefix As IntPtr
End Structure
import ctypes
from ctypes import wintypes

class IP_ADAPTER_ADDRESSES_XP(ctypes.Structure):
    _fields_ = [
        ("Anonymous", _Anonymous_e__Union),
        ("Next", ctypes.c_void_p),
        ("AdapterName", ctypes.c_void_p),
        ("FirstUnicastAddress", ctypes.c_void_p),
        ("FirstAnycastAddress", ctypes.c_void_p),
        ("FirstMulticastAddress", ctypes.c_void_p),
        ("FirstDnsServerAddress", ctypes.c_void_p),
        ("DnsSuffix", ctypes.c_void_p),
        ("Description", ctypes.c_void_p),
        ("FriendlyName", ctypes.c_void_p),
        ("PhysicalAddress", ctypes.c_ubyte * 8),
        ("PhysicalAddressLength", wintypes.DWORD),
        ("Flags", wintypes.DWORD),
        ("Mtu", wintypes.DWORD),
        ("IfType", wintypes.DWORD),
        ("OperStatus", ctypes.c_int),
        ("Ipv6IfIndex", wintypes.DWORD),
        ("ZoneIndices", wintypes.DWORD * 16),
        ("FirstPrefix", ctypes.c_void_p),
    ]
#[repr(C)]
pub struct IP_ADAPTER_ADDRESSES_XP {
    pub Anonymous: _Anonymous_e__Union,
    pub Next: *mut core::ffi::c_void,
    pub AdapterName: *mut core::ffi::c_void,
    pub FirstUnicastAddress: *mut core::ffi::c_void,
    pub FirstAnycastAddress: *mut core::ffi::c_void,
    pub FirstMulticastAddress: *mut core::ffi::c_void,
    pub FirstDnsServerAddress: *mut core::ffi::c_void,
    pub DnsSuffix: *mut core::ffi::c_void,
    pub Description: *mut core::ffi::c_void,
    pub FriendlyName: *mut core::ffi::c_void,
    pub PhysicalAddress: [u8; 8],
    pub PhysicalAddressLength: u32,
    pub Flags: u32,
    pub Mtu: u32,
    pub IfType: u32,
    pub OperStatus: i32,
    pub Ipv6IfIndex: u32,
    pub ZoneIndices: [u32; 16],
    pub FirstPrefix: *mut core::ffi::c_void,
}
import "golang.org/x/sys/windows"

type IP_ADAPTER_ADDRESSES_XP struct {
	Anonymous _Anonymous_e__Union
	Next uintptr
	AdapterName uintptr
	FirstUnicastAddress uintptr
	FirstAnycastAddress uintptr
	FirstMulticastAddress uintptr
	FirstDnsServerAddress uintptr
	DnsSuffix uintptr
	Description uintptr
	FriendlyName uintptr
	PhysicalAddress [8]byte
	PhysicalAddressLength uint32
	Flags uint32
	Mtu uint32
	IfType uint32
	OperStatus int32
	Ipv6IfIndex uint32
	ZoneIndices [16]uint32
	FirstPrefix uintptr
}
type
  IP_ADAPTER_ADDRESSES_XP = record
    Anonymous: _Anonymous_e__Union;
    Next: Pointer;
    AdapterName: Pointer;
    FirstUnicastAddress: Pointer;
    FirstAnycastAddress: Pointer;
    FirstMulticastAddress: Pointer;
    FirstDnsServerAddress: Pointer;
    DnsSuffix: Pointer;
    Description: Pointer;
    FriendlyName: Pointer;
    PhysicalAddress: array[0..7] of Byte;
    PhysicalAddressLength: DWORD;
    Flags: DWORD;
    Mtu: DWORD;
    IfType: DWORD;
    OperStatus: Integer;
    Ipv6IfIndex: DWORD;
    ZoneIndices: array[0..15] of DWORD;
    FirstPrefix: Pointer;
  end;
const IP_ADAPTER_ADDRESSES_XP = extern struct {
    Anonymous: _Anonymous_e__Union,
    Next: ?*anyopaque,
    AdapterName: ?*anyopaque,
    FirstUnicastAddress: ?*anyopaque,
    FirstAnycastAddress: ?*anyopaque,
    FirstMulticastAddress: ?*anyopaque,
    FirstDnsServerAddress: ?*anyopaque,
    DnsSuffix: ?*anyopaque,
    Description: ?*anyopaque,
    FriendlyName: ?*anyopaque,
    PhysicalAddress: [8]u8,
    PhysicalAddressLength: u32,
    Flags: u32,
    Mtu: u32,
    IfType: u32,
    OperStatus: i32,
    Ipv6IfIndex: u32,
    ZoneIndices: [16]u32,
    FirstPrefix: ?*anyopaque,
};
type
  IP_ADAPTER_ADDRESSES_XP {.bycopy.} = object
    Anonymous: _Anonymous_e__Union
    Next: pointer
    AdapterName: pointer
    FirstUnicastAddress: pointer
    FirstAnycastAddress: pointer
    FirstMulticastAddress: pointer
    FirstDnsServerAddress: pointer
    DnsSuffix: pointer
    Description: pointer
    FriendlyName: pointer
    PhysicalAddress: array[8, uint8]
    PhysicalAddressLength: uint32
    Flags: uint32
    Mtu: uint32
    IfType: uint32
    OperStatus: int32
    Ipv6IfIndex: uint32
    ZoneIndices: array[16, uint32]
    FirstPrefix: pointer
struct IP_ADAPTER_ADDRESSES_XP
{
    _Anonymous_e__Union Anonymous;
    void* Next;
    void* AdapterName;
    void* FirstUnicastAddress;
    void* FirstAnycastAddress;
    void* FirstMulticastAddress;
    void* FirstDnsServerAddress;
    void* DnsSuffix;
    void* Description;
    void* FriendlyName;
    ubyte[8] PhysicalAddress;
    uint PhysicalAddressLength;
    uint Flags;
    uint Mtu;
    uint IfType;
    int OperStatus;
    uint Ipv6IfIndex;
    uint[16] ZoneIndices;
    void* FirstPrefix;
}

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_ADDRESSES_XP サイズ: 144 バイト(x86)
dim st, 36    ; 4byte整数×36(構造体サイズ 144 / 4 切り上げ)
; Anonymous : _Anonymous_e__Union (+0, 8byte)  varptr(st)+0 を基点に操作(8byte:入れ子/配列)
; Next : IP_ADAPTER_ADDRESSES_XP* (+8, 4byte)  varptr(st)+8 を基点に操作(4byte:入れ子/配列)
; AdapterName : LPSTR (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; FirstUnicastAddress : IP_ADAPTER_UNICAST_ADDRESS_XP* (+16, 4byte)  varptr(st)+16 を基点に操作(4byte:入れ子/配列)
; FirstAnycastAddress : IP_ADAPTER_ANYCAST_ADDRESS_XP* (+20, 4byte)  varptr(st)+20 を基点に操作(4byte:入れ子/配列)
; FirstMulticastAddress : IP_ADAPTER_MULTICAST_ADDRESS_XP* (+24, 4byte)  varptr(st)+24 を基点に操作(4byte:入れ子/配列)
; FirstDnsServerAddress : IP_ADAPTER_DNS_SERVER_ADDRESS_XP* (+28, 4byte)  varptr(st)+28 を基点に操作(4byte:入れ子/配列)
; DnsSuffix : LPWSTR (+32, 4byte)  st.8 = 値  /  値 = st.8   (lpoke/lpeek も可)
; Description : LPWSTR (+36, 4byte)  st.9 = 値  /  値 = st.9   (lpoke/lpeek も可)
; FriendlyName : LPWSTR (+40, 4byte)  st.10 = 値  /  値 = st.10   (lpoke/lpeek も可)
; PhysicalAddress : BYTE (+44, 8byte)  varptr(st)+44 を基点に操作(8byte:入れ子/配列)
; PhysicalAddressLength : DWORD (+52, 4byte)  st.13 = 値  /  値 = st.13   (lpoke/lpeek も可)
; Flags : DWORD (+56, 4byte)  st.14 = 値  /  値 = st.14   (lpoke/lpeek も可)
; Mtu : DWORD (+60, 4byte)  st.15 = 値  /  値 = st.15   (lpoke/lpeek も可)
; IfType : DWORD (+64, 4byte)  st.16 = 値  /  値 = st.16   (lpoke/lpeek も可)
; OperStatus : IF_OPER_STATUS (+68, 4byte)  st.17 = 値  /  値 = st.17   (lpoke/lpeek も可)
; Ipv6IfIndex : DWORD (+72, 4byte)  st.18 = 値  /  値 = st.18   (lpoke/lpeek も可)
; ZoneIndices : DWORD (+76, 64byte)  varptr(st)+76 を基点に操作(64byte:入れ子/配列)
; FirstPrefix : IP_ADAPTER_PREFIX_XP* (+140, 4byte)  varptr(st)+140 を基点に操作(4byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; IP_ADAPTER_ADDRESSES_XP サイズ: 184 バイト(x64)
dim st, 46    ; 4byte整数×46(構造体サイズ 184 / 4 切り上げ)
; Anonymous : _Anonymous_e__Union (+0, 8byte)  varptr(st)+0 を基点に操作(8byte:入れ子/配列)
; Next : IP_ADAPTER_ADDRESSES_XP* (+8, 8byte)  varptr(st)+8 を基点に操作(8byte:入れ子/配列)
; AdapterName : LPSTR (+16, 8byte)  qpoke st,16,値 / qpeek(st,16)  ※IronHSPのみ。3.7/3.8は lpoke st,16,下位 : lpoke st,20,上位
; FirstUnicastAddress : IP_ADAPTER_UNICAST_ADDRESS_XP* (+24, 8byte)  varptr(st)+24 を基点に操作(8byte:入れ子/配列)
; FirstAnycastAddress : IP_ADAPTER_ANYCAST_ADDRESS_XP* (+32, 8byte)  varptr(st)+32 を基点に操作(8byte:入れ子/配列)
; FirstMulticastAddress : IP_ADAPTER_MULTICAST_ADDRESS_XP* (+40, 8byte)  varptr(st)+40 を基点に操作(8byte:入れ子/配列)
; FirstDnsServerAddress : IP_ADAPTER_DNS_SERVER_ADDRESS_XP* (+48, 8byte)  varptr(st)+48 を基点に操作(8byte:入れ子/配列)
; DnsSuffix : LPWSTR (+56, 8byte)  qpoke st,56,値 / qpeek(st,56)  ※IronHSPのみ。3.7/3.8は lpoke st,56,下位 : lpoke st,60,上位
; Description : LPWSTR (+64, 8byte)  qpoke st,64,値 / qpeek(st,64)  ※IronHSPのみ。3.7/3.8は lpoke st,64,下位 : lpoke st,68,上位
; FriendlyName : LPWSTR (+72, 8byte)  qpoke st,72,値 / qpeek(st,72)  ※IronHSPのみ。3.7/3.8は lpoke st,72,下位 : lpoke st,76,上位
; PhysicalAddress : BYTE (+80, 8byte)  varptr(st)+80 を基点に操作(8byte:入れ子/配列)
; PhysicalAddressLength : DWORD (+88, 4byte)  st.22 = 値  /  値 = st.22   (lpoke/lpeek も可)
; Flags : DWORD (+92, 4byte)  st.23 = 値  /  値 = st.23   (lpoke/lpeek も可)
; Mtu : DWORD (+96, 4byte)  st.24 = 値  /  値 = st.24   (lpoke/lpeek も可)
; IfType : DWORD (+100, 4byte)  st.25 = 値  /  値 = st.25   (lpoke/lpeek も可)
; OperStatus : IF_OPER_STATUS (+104, 4byte)  st.26 = 値  /  値 = st.26   (lpoke/lpeek も可)
; Ipv6IfIndex : DWORD (+108, 4byte)  st.27 = 値  /  値 = st.27   (lpoke/lpeek も可)
; ZoneIndices : DWORD (+112, 64byte)  varptr(st)+112 を基点に操作(64byte:入れ子/配列)
; FirstPrefix : IP_ADAPTER_PREFIX_XP* (+176, 8byte)  varptr(st)+176 を基点に操作(8byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global IP_ADAPTER_ADDRESSES_XP
    #field byte Anonymous 8
    #field intptr Next
    #field intptr AdapterName
    #field intptr FirstUnicastAddress
    #field intptr FirstAnycastAddress
    #field intptr FirstMulticastAddress
    #field intptr FirstDnsServerAddress
    #field intptr DnsSuffix
    #field intptr Description
    #field intptr FriendlyName
    #field byte PhysicalAddress 8
    #field int PhysicalAddressLength
    #field int Flags
    #field int Mtu
    #field int IfType
    #field int OperStatus
    #field int Ipv6IfIndex
    #field int ZoneIndices 16
    #field intptr FirstPrefix
#endstruct

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