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

IP_ADAPTER_ADDRESSES_LH

構造体
サイズx64: 456 バイト / x86: 376 バイト

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

フィールド

フィールドサイズx64x86説明
Anonymous1_Anonymous1_e__Union8+0+0LengthとIfIndexを保持する匿名共用体である。
NextIP_ADAPTER_ADDRESSES_LH*8/4+8+8リスト内の次のアダプターアドレス構造体へのポインター。
AdapterNameLPSTR8/4+16+12これらのアドレスが関連付けられているアダプターの名前を格納する文字の配列。アダプターのフレンドリ名とは異なり、AdapterName に指定されるアダプター名は永続的であり、ユーザーが変更することはできません。
FirstUnicastAddressIP_ADAPTER_UNICAST_ADDRESS_LH*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

アダプターのユーザーフレンドリな名前。例:「ローカル エリア接続 1」。この名前は ipconfig コマンドラインプログラムやネットワーク接続フォルダーなどで表示されます。このメンバーは読み取り専用であり、IP Helper 関数を使用して変更することはできません。

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

PhysicalAddressBYTE8+80+44アダプターのメディアアクセス制御 (MAC) アドレス。たとえばイーサネットネットワークでは、このメンバーはイーサネットのハードウェアアドレスを指定します。
PhysicalAddressLengthDWORD4+88+52PhysicalAddress メンバーに指定されたアドレスの長さ (バイト単位)。データリンク層を持たないインターフェイスの場合、この値は 0 です。
Anonymous2_Anonymous2_e__Union8/4+96+56Flags(DdnsEnabled等のビットフラグ)を保持する匿名共用体である。
MtuDWORD4+104+60最大転送単位 (MTU) のサイズ (バイト単位)。
IfTypeDWORD4+108+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+112+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+116+72

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

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

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

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

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

メモ この構造体メンバーは Windows XP with SP1 以降でのみ利用できます。
TransmitLinkSpeedULONGLONG8+192+144

アダプターの送信リンクの現在の速度 (ビット/秒)。

メモ この構造体メンバーは Windows Vista 以降でのみ利用できます。
ReceiveLinkSpeedULONGLONG8+200+152

アダプターの受信リンクの現在の速度 (ビット/秒)。

メモ この構造体メンバーは Windows Vista 以降でのみ利用できます。
FirstWinsServerAddressIP_ADAPTER_WINS_SERVER_ADDRESS_LH*8/4+208+160

アダプターの Windows インターネットネームサービス (WINS) サーバーアドレスの連結リストの最初の IP_ADAPTER_WINS_SERVER_ADDRESS 構造体へのポインター。

メモ この構造体メンバーは Windows Vista 以降でのみ利用できます。
FirstGatewayAddressIP_ADAPTER_GATEWAY_ADDRESS_LH*8/4+216+164

アダプターのゲートウェイの連結リストの最初の IP_ADAPTER_GATEWAY_ADDRESS 構造体へのポインター。

メモ この構造体メンバーは Windows Vista 以降でのみ利用できます。
Ipv4MetricDWORD4+224+168

アダプターアドレスの IPv4 インターフェイスメトリック。このメンバーは IPv4 アダプターアドレスにのみ適用されます。

IPv4 のルート優先順位の計算に実際に使用されるルートメトリックは、MIB_IPFORWARD_ROW2 構造体の Metric メンバーに指定されたルートメトリックのオフセットと、このメンバーに指定された IPv4 のインターフェイスメトリックの合計です。

メモ この構造体メンバーは Windows Vista 以降でのみ利用できます。
Ipv6MetricDWORD4+228+172

アダプターアドレスの IPv6 インターフェイスメトリック。このメンバーは IPv6 アダプターアドレスにのみ適用されます。

IPv6 のルート優先順位の計算に実際に使用されるルートメトリックは、MIB_IPFORWARD_ROW2 構造体の Metric メンバーに指定されたルートメトリックのオフセットと、このメンバーに指定された IPv4 のインターフェイスメトリックの合計です。

メモ この構造体メンバーは Windows Vista 以降でのみ利用できます。
LuidNET_LUID_LH8+232+176

アダプターアドレスのインターフェイス LUID。

メモ この構造体メンバーは Windows Vista 以降でのみ利用できます。
Dhcpv4ServerSOCKET_ADDRESS16/8+240+184

アダプターアドレスの DHCP サーバーの IPv4 アドレス。このメンバーは、DHCP を使用して構成された IPv4 アダプターアドレスにのみ適用されます。

メモ この構造体メンバーは Windows Vista 以降でのみ利用できます。
CompartmentIdNET_IF_COMPARTMENT_ID4+256+192

アダプターアドレスのルーティングコンパートメント ID。

メモ この構造体メンバーは Windows Vista 以降でのみ利用できます。このメンバーは現在サポートされておらず、将来の使用のために予約されています。
NetworkGuidGUID16+260+196

インターフェイスが属するネットワークに関連付けられている GUID

インターフェイスプロバイダーがネットワーク GUID を提供できない場合、このメンバーはゼロの GUID になることがあります。この場合、インターフェイスは既定のネットワークで NDIS によって登録されています。

メモ この構造体メンバーは Windows Vista 以降でのみ利用できます。
ConnectionTypeNET_IF_CONNECTION_TYPE4+276+212

アダプターアドレスのインターフェイス接続の種類。

このメンバーには、Ifdef.h ヘッダーファイルで定義されている NET_IF_CONNECTION_TYPE 列挙型の値のいずれかを指定できます。

意味
NET_IF_CONNECTION_DEDICATED
1
接続の種類は専用です。メディアセンスが TRUE の場合、接続は自動的に確立されます。たとえば、イーサネット接続は専用です。
NET_IF_CONNECTION_PASSIVE
2
接続の種類はパッシブです。リモート側がローカルステーションへの接続を確立する必要があります。たとえば、RAS インターフェイスはパッシブです。
NET_IF_CONNECTION_DEMAND
3
接続の種類はデマンドダイヤルです。この種類の接続は、ローカルでの動作 (パケットの送信など) に応じて確立されます。
NET_IF_CONNECTION_MAXIMUM
4
NET_IF_CONNECTION_TYPE 列挙型で取り得る最大値。これは ConnectionType メンバーの有効な値ではありません。
メモ この構造体メンバーは Windows Vista 以降でのみ利用できます。
TunnelTypeTUNNEL_TYPE4+280+216

アダプターアドレスがトンネルである場合に、そのトンネルが使用するカプセル化方式。

メモ この構造体メンバーは Windows Vista 以降でのみ利用できます。
トンネルの種類は Internet Assigned Names Authority (IANA) によって定義されます。詳細については、http://www.iana.org/assignments/ianaiftype-mib を参照してください。このメンバーには、Ifdef.h ヘッダーファイルで定義されている TUNNEL_TYPE 列挙型の値のいずれかを指定できます。
意味
TUNNEL_TYPE_NONE
0
トンネルではありません。
TUNNEL_TYPE_OTHER
1
以下のいずれのトンネルの種類にも該当しません。
TUNNEL_TYPE_DIRECT
2
パケットは中間ヘッダーなしで通常の IP ヘッダー内に直接カプセル化され、リモートのトンネルエンドポイントへユニキャストされます。
TUNNEL_TYPE_6TO4
11
IPv6 パケットは中間ヘッダーなしで IPv4 ヘッダー内に直接カプセル化され、6to4 プロトコルによって決定される宛先へユニキャストされます。
TUNNEL_TYPE_ISATAP
13
IPv6 パケットは中間ヘッダーなしで IPv4 ヘッダー内に直接カプセル化され、ISATAP プロトコルによって決定される宛先へユニキャストされます。
TUNNEL_TYPE_TEREDO
14
IPv6 パケットの Teredo カプセル化。
TUNNEL_TYPE_IPHTTPS
15
IPv6 パケットの IP over HTTPS カプセル化。
メモ この列挙値は Windows 7、Windows Server 2008 R2 以降でのみ利用できます。
Dhcpv6ServerSOCKET_ADDRESS16/8+288+220

アダプターアドレスの DHCPv6 サーバーの IPv6 アドレス。このメンバーは、DHCPv6 を使用して構成された IPv6 アダプターアドレスにのみ適用されます。この構造体メンバーは現在サポートされておらず、将来の使用のために予約されています。

メモ この構造体メンバーは Windows Vista 以降でのみ利用できます。
Dhcpv6ClientDuidBYTE130+304+228

DHCPv6 クライアントの DHCP 一意識別子 (DUID)。このメンバーは、DHCPv6 を使用して構成された IPv6 アダプターアドレスにのみ適用されます。

メモ この構造体メンバーは Windows Vista 以降でのみ利用できます。
Dhcpv6ClientDuidLengthDWORD4+436+360

DHCPv6 クライアントの DHCP 一意識別子 (DUID) の長さ (バイト単位)。このメンバーは、DHCPv6 を使用して構成された IPv6 アダプターアドレスにのみ適用されます。

メモ この構造体メンバーは Windows Vista 以降でのみ利用できます。
Dhcpv6IaidDWORD4+440+364

DHCPv6 クライアントによって選択された ID アソシエーションの識別子。このメンバーは、DHCPv6 を使用して構成された IPv6 アダプターアドレスにのみ適用されます。

メモ この構造体メンバーは Windows Vista 以降でのみ利用できます。
FirstDnsSuffixIP_ADAPTER_DNS_SUFFIX*8/4+448+368

アダプターの DNS サフィックスの連結リストの最初の IP_ADAPTER_DNS_SUFFIX 構造体へのポインター。

メモ この構造体メンバーは Windows Vista with SP1 以降、および Windows Server 2008 以降でのみ利用できます。

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

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

共用体: _Anonymous2_e__Union x64 8B / x86 4B

フィールドサイズx64x86説明
FlagsDWORD4+0+0

アダプターのさまざまな設定を指定するフラグのセット。これらの値は 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 のマネージドアドレス構成が有効になっています。
メモ このフラグは、NTDDI バージョンが NTDDI_LONGHORN 以上のターゲットプラットフォーム向けにアプリケーションがコンパイルされている場合に、Windows Vista 以降でのみサポートされます。このフラグは IP_ADAPTER_ADDRESSES_LH 構造体で Ipv6ManagedAddressConfigurationSupported ビットフィールドとして定義されています。
Anonymous_Anonymous_e__Struct8/4+0+0

公式ドキュメント

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 Vista より前の Windows XP with SP1 以降では、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 ヘッダーファイルよりも前にインクルードする必要があります。

この例では、システムに関連付けられているアダプターの IP_ADAPTER_ADDRESSES 構造体を取得し、各アダプターインターフェイスについていくつかのメンバーを出力します。

#include <winsock2.h>
#include <iphlpapi.h>
#include <stdio.h>
#pragma comment(lib, "IPHLPAPI.lib")

#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
#define FREE(x) HeapFree(GetProcessHeap(), 0, (x))

/* Note: could also use malloc() and free() */

int __cdecl main(int argc, char **argv)
{

    /* Declare and initialize variables */

    DWORD dwSize = 0;
    DWORD dwRetVal = 0;

    unsigned int i = 0;

    // Set the flags to pass to GetAdaptersAddresses
    ULONG flags = GAA_FLAG_INCLUDE_PREFIX;

    // default to unspecified address family (both)
    ULONG family = AF_UNSPEC;

    LPVOID lpMsgBuf = NULL;

    PIP_ADAPTER_ADDRESSES pAddresses = NULL;
    ULONG outBufLen = 0;

    PIP_ADAPTER_ADDRESSES pCurrAddresses = NULL;
    PIP_ADAPTER_UNICAST_ADDRESS pUnicast = NULL;
    PIP_ADAPTER_ANYCAST_ADDRESS pAnycast = NULL;
    PIP_ADAPTER_MULTICAST_ADDRESS pMulticast = NULL;
    IP_ADAPTER_DNS_SERVER_ADDRESS *pDnServer = NULL;
    IP_ADAPTER_PREFIX *pPrefix = NULL;

    if (argc != 2) {
        printf(" Usage: getadapteraddresses family\n");
        printf("        getadapteraddresses 4 (for IPv4)\n");
        printf("        getadapteraddresses 6 (for IPv6)\n");
        printf("        getadapteraddresses A (for both IPv4 and IPv6)\n");
        exit(1);
    }

    if (atoi(argv[1]) == 4)
        family = AF_INET;
    else if (atoi(argv[1]) == 6)
        family = AF_INET6;

    outBufLen = sizeof (IP_ADAPTER_ADDRESSES);
    pAddresses = (IP_ADAPTER_ADDRESSES *) MALLOC(outBufLen);

    // Make an initial call to GetAdaptersAddresses to get the 
    // size needed into the outBufLen variable
    if (GetAdaptersAddresses(family, flags, NULL, pAddresses, &outBufLen)
        == ERROR_BUFFER_OVERFLOW) {
        FREE(pAddresses);
        pAddresses = (IP_ADAPTER_ADDRESSES *) MALLOC(outBufLen);
    }

    if (pAddresses == NULL) {
        printf("Memory allocation failed for IP_ADAPTER_ADDRESSES struct\n");
        exit(1);
    }
    // Make a second call to GetAdaptersAddresses to get the
    // actual data we want
    printf("Memory allocated for GetAdapterAddresses = %d bytes\n", outBufLen);
    printf("Calling GetAdaptersAddresses function with family = ");
    if (family == AF_INET)
        printf("AF_INET\n");
    if (family == AF_INET6)
        printf("AF_INET6\n");
    if (family == AF_UNSPEC)
        printf("AF_UNSPEC\n\n");

    dwRetVal =
        GetAdaptersAddresses(family, flags, NULL, pAddresses, &outBufLen);

    if (dwRetVal == NO_ERROR) {
        // If successful, output some information from the data we received
        pCurrAddresses = pAddresses;
        while (pCurrAddresses) {
            printf("\tLength of the IP_ADAPTER_ADDRESS struct: %ld\n",
                   pCurrAddresses->Length);
            printf("\tIfIndex (IPv4 interface): %u\n", pCurrAddresses->IfIndex);
            printf("\tAdapter name: %s\n", pCurrAddresses->AdapterName);

            pUnicast = pCurrAddresses->FirstUnicastAddress;
            if (pUnicast != NULL) {
                for (i = 0; pUnicast != NULL; i++)
                    pUnicast = pUnicast->Next;
                printf("\tNumber of Unicast Addresses: %d\n", i);
            } else
                printf("\tNo Unicast Addresses\n");

            pAnycast = pCurrAddresses->FirstAnycastAddress;
            if (pAnycast) {
                for (i = 0; pAnycast != NULL; i++)
                    pAnycast = pAnycast->Next;
                printf("\tNumber of Anycast Addresses: %d\n", i);
            } else
                printf("\tNo Anycast Addresses\n");

            pMulticast = pCurrAddresses->FirstMulticastAddress;
            if (pMulticast) {
                for (i = 0; pMulticast != NULL; i++)
                    pMulticast = pMulticast->Next;
                printf("\tNumber of Multicast Addresses: %d\n", i);
            } else
                printf("\tNo Multicast Addresses\n");

            pDnServer = pCurrAddresses->FirstDnsServerAddress;
            if (pDnServer) {
                for (i = 0; pDnServer != NULL; i++)
                    pDnServer = pDnServer->Next;
                printf("\tNumber of DNS Server Addresses: %d\n", i);
            } else
                printf("\tNo DNS Server Addresses\n");

            printf("\tDNS Suffix: %wS\n", pCurrAddresses->DnsSuffix);
            printf("\tDescription: %wS\n", pCurrAddresses->Description);
            printf("\tFriendly name: %wS\n", pCurrAddresses->FriendlyName);

            if (pCurrAddresses->PhysicalAddressLength != 0) {
                printf("\tPhysical address: ");
                for (i = 0; i < pCurrAddresses->PhysicalAddressLength;
                     i++) {
                    if (i == (pCurrAddresses->PhysicalAddressLength - 1))
                        printf("%.2X\n",
                               (int) pCurrAddresses->PhysicalAddress[i]);
                    else
                        printf("%.2X-",
                               (int) pCurrAddresses->PhysicalAddress[i]);
                }
            }
            printf("\tFlags: %ld\n", pCurrAddresses->Flags);
            printf("\tMtu: %lu\n", pCurrAddresses->Mtu);
            printf("\tIfType: %ld\n", pCurrAddresses->IfType);
            printf("\tOperStatus: %ld\n", pCurrAddresses->OperStatus);
            printf("\tIpv6IfIndex (IPv6 interface): %u\n",
                   pCurrAddresses->Ipv6IfIndex);
            printf("\tZoneIndices (hex): ");
            for (i = 0; i < 16; i++)
                printf("%lx ", pCurrAddresses->ZoneIndices[i]);
            printf("\n");

            pPrefix = pCurrAddresses->FirstPrefix;
            if (pPrefix) {
                for (i = 0; pPrefix != NULL; i++)
                    pPrefix = pPrefix->Next;
                printf("\tNumber of IP Adapter Prefix entries: %d\n", i);
            } else
                printf("\tNo IP Adapter Prefix entries\n");

            printf("\n");

            pCurrAddresses = pCurrAddresses->Next;
        }
    } else {
        printf("Call to GetAdaptersAddresses failed with error: %d\n",
               dwRetVal);
        if (dwRetVal == ERROR_NO_DATA)
            printf("\tNo addresses were found for the requested parameters\n");
        else {

            if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwRetVal, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),   // Default language
                              (LPTSTR) & lpMsgBuf, 0, NULL)) {
                printf("\tError: %s", lpMsgBuf);
                LocalFree(lpMsgBuf);
                FREE(pAddresses);
                exit(1);
            }
        }
    }
    FREE(pAddresses);
    return 0;
}
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での定義

#include <windows.h>

// NET_LUID_LH  (x64 8 / x86 8 バイト)
typedef struct NET_LUID_LH {
    ULONGLONG Value;
    _Info_e__Struct Info;
} NET_LUID_LH;

// SOCKET_ADDRESS  (x64 16 / x86 8 バイト)
typedef struct SOCKET_ADDRESS {
    SOCKADDR* lpSockaddr;
    INT iSockaddrLength;
} SOCKET_ADDRESS;

// IP_ADAPTER_ADDRESSES_LH  (x64 456 / x86 376 バイト)
typedef struct IP_ADAPTER_ADDRESSES_LH {
    _Anonymous1_e__Union Anonymous1;
    IP_ADAPTER_ADDRESSES_LH* Next;
    LPSTR AdapterName;
    IP_ADAPTER_UNICAST_ADDRESS_LH* 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;
    _Anonymous2_e__Union Anonymous2;
    DWORD Mtu;
    DWORD IfType;
    IF_OPER_STATUS OperStatus;
    DWORD Ipv6IfIndex;
    DWORD ZoneIndices[16];
    IP_ADAPTER_PREFIX_XP* FirstPrefix;
    ULONGLONG TransmitLinkSpeed;
    ULONGLONG ReceiveLinkSpeed;
    IP_ADAPTER_WINS_SERVER_ADDRESS_LH* FirstWinsServerAddress;
    IP_ADAPTER_GATEWAY_ADDRESS_LH* FirstGatewayAddress;
    DWORD Ipv4Metric;
    DWORD Ipv6Metric;
    NET_LUID_LH Luid;
    SOCKET_ADDRESS Dhcpv4Server;
    NET_IF_COMPARTMENT_ID CompartmentId;
    GUID NetworkGuid;
    NET_IF_CONNECTION_TYPE ConnectionType;
    TUNNEL_TYPE TunnelType;
    SOCKET_ADDRESS Dhcpv6Server;
    BYTE Dhcpv6ClientDuid[130];
    DWORD Dhcpv6ClientDuidLength;
    DWORD Dhcpv6Iaid;
    IP_ADAPTER_DNS_SUFFIX* FirstDnsSuffix;
} IP_ADAPTER_ADDRESSES_LH;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct NET_LUID_LH
{
    public ulong Value;
    public _Info_e__Struct Info;
}

[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_ADDRESSES_LH
{
    public _Anonymous1_e__Union Anonymous1;
    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 _Anonymous2_e__Union Anonymous2;
    public uint Mtu;
    public uint IfType;
    public int OperStatus;
    public uint Ipv6IfIndex;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public uint[] ZoneIndices;
    public IntPtr FirstPrefix;
    public ulong TransmitLinkSpeed;
    public ulong ReceiveLinkSpeed;
    public IntPtr FirstWinsServerAddress;
    public IntPtr FirstGatewayAddress;
    public uint Ipv4Metric;
    public uint Ipv6Metric;
    public NET_LUID_LH Luid;
    public SOCKET_ADDRESS Dhcpv4Server;
    public uint CompartmentId;
    public Guid NetworkGuid;
    public int ConnectionType;
    public int TunnelType;
    public SOCKET_ADDRESS Dhcpv6Server;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 130)] public byte[] Dhcpv6ClientDuid;
    public uint Dhcpv6ClientDuidLength;
    public uint Dhcpv6Iaid;
    public IntPtr FirstDnsSuffix;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure NET_LUID_LH
    Public Value As ULong
    Public Info As _Info_e__Struct
End Structure

<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_ADDRESSES_LH
    Public Anonymous1 As _Anonymous1_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 Anonymous2 As _Anonymous2_e__Union
    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
    Public TransmitLinkSpeed As ULong
    Public ReceiveLinkSpeed As ULong
    Public FirstWinsServerAddress As IntPtr
    Public FirstGatewayAddress As IntPtr
    Public Ipv4Metric As UInteger
    Public Ipv6Metric As UInteger
    Public Luid As NET_LUID_LH
    Public Dhcpv4Server As SOCKET_ADDRESS
    Public CompartmentId As UInteger
    Public NetworkGuid As Guid
    Public ConnectionType As Integer
    Public TunnelType As Integer
    Public Dhcpv6Server As SOCKET_ADDRESS
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=130)> Public Dhcpv6ClientDuid() As Byte
    Public Dhcpv6ClientDuidLength As UInteger
    Public Dhcpv6Iaid As UInteger
    Public FirstDnsSuffix As IntPtr
End Structure
import ctypes
from ctypes import wintypes

class NET_LUID_LH(ctypes.Structure):
    _fields_ = [
        ("Value", ctypes.c_ulonglong),
        ("Info", _Info_e__Struct),
    ]

class SOCKET_ADDRESS(ctypes.Structure):
    _fields_ = [
        ("lpSockaddr", ctypes.c_void_p),
        ("iSockaddrLength", ctypes.c_int),
    ]

class IP_ADAPTER_ADDRESSES_LH(ctypes.Structure):
    _fields_ = [
        ("Anonymous1", _Anonymous1_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),
        ("Anonymous2", _Anonymous2_e__Union),
        ("Mtu", wintypes.DWORD),
        ("IfType", wintypes.DWORD),
        ("OperStatus", ctypes.c_int),
        ("Ipv6IfIndex", wintypes.DWORD),
        ("ZoneIndices", wintypes.DWORD * 16),
        ("FirstPrefix", ctypes.c_void_p),
        ("TransmitLinkSpeed", ctypes.c_ulonglong),
        ("ReceiveLinkSpeed", ctypes.c_ulonglong),
        ("FirstWinsServerAddress", ctypes.c_void_p),
        ("FirstGatewayAddress", ctypes.c_void_p),
        ("Ipv4Metric", wintypes.DWORD),
        ("Ipv6Metric", wintypes.DWORD),
        ("Luid", NET_LUID_LH),
        ("Dhcpv4Server", SOCKET_ADDRESS),
        ("CompartmentId", wintypes.DWORD),
        ("NetworkGuid", GUID),
        ("ConnectionType", ctypes.c_int),
        ("TunnelType", ctypes.c_int),
        ("Dhcpv6Server", SOCKET_ADDRESS),
        ("Dhcpv6ClientDuid", ctypes.c_ubyte * 130),
        ("Dhcpv6ClientDuidLength", wintypes.DWORD),
        ("Dhcpv6Iaid", wintypes.DWORD),
        ("FirstDnsSuffix", ctypes.c_void_p),
    ]
#[repr(C)]
pub struct NET_LUID_LH {
    pub Value: u64,
    pub Info: _Info_e__Struct,
}

#[repr(C)]
pub struct SOCKET_ADDRESS {
    pub lpSockaddr: *mut core::ffi::c_void,
    pub iSockaddrLength: i32,
}

#[repr(C)]
pub struct IP_ADAPTER_ADDRESSES_LH {
    pub Anonymous1: _Anonymous1_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 Anonymous2: _Anonymous2_e__Union,
    pub Mtu: u32,
    pub IfType: u32,
    pub OperStatus: i32,
    pub Ipv6IfIndex: u32,
    pub ZoneIndices: [u32; 16],
    pub FirstPrefix: *mut core::ffi::c_void,
    pub TransmitLinkSpeed: u64,
    pub ReceiveLinkSpeed: u64,
    pub FirstWinsServerAddress: *mut core::ffi::c_void,
    pub FirstGatewayAddress: *mut core::ffi::c_void,
    pub Ipv4Metric: u32,
    pub Ipv6Metric: u32,
    pub Luid: NET_LUID_LH,
    pub Dhcpv4Server: SOCKET_ADDRESS,
    pub CompartmentId: u32,
    pub NetworkGuid: GUID,
    pub ConnectionType: i32,
    pub TunnelType: i32,
    pub Dhcpv6Server: SOCKET_ADDRESS,
    pub Dhcpv6ClientDuid: [u8; 130],
    pub Dhcpv6ClientDuidLength: u32,
    pub Dhcpv6Iaid: u32,
    pub FirstDnsSuffix: *mut core::ffi::c_void,
}
import "golang.org/x/sys/windows"

type NET_LUID_LH struct {
	Value uint64
	Info _Info_e__Struct
}

type SOCKET_ADDRESS struct {
	lpSockaddr uintptr
	iSockaddrLength int32
}

type IP_ADAPTER_ADDRESSES_LH struct {
	Anonymous1 _Anonymous1_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
	Anonymous2 _Anonymous2_e__Union
	Mtu uint32
	IfType uint32
	OperStatus int32
	Ipv6IfIndex uint32
	ZoneIndices [16]uint32
	FirstPrefix uintptr
	TransmitLinkSpeed uint64
	ReceiveLinkSpeed uint64
	FirstWinsServerAddress uintptr
	FirstGatewayAddress uintptr
	Ipv4Metric uint32
	Ipv6Metric uint32
	Luid NET_LUID_LH
	Dhcpv4Server SOCKET_ADDRESS
	CompartmentId uint32
	NetworkGuid windows.GUID
	ConnectionType int32
	TunnelType int32
	Dhcpv6Server SOCKET_ADDRESS
	Dhcpv6ClientDuid [130]byte
	Dhcpv6ClientDuidLength uint32
	Dhcpv6Iaid uint32
	FirstDnsSuffix uintptr
}
type
  NET_LUID_LH = record
    Value: UInt64;
    Info: _Info_e__Struct;
  end;

  SOCKET_ADDRESS = record
    lpSockaddr: Pointer;
    iSockaddrLength: Integer;
  end;

  IP_ADAPTER_ADDRESSES_LH = record
    Anonymous1: _Anonymous1_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;
    Anonymous2: _Anonymous2_e__Union;
    Mtu: DWORD;
    IfType: DWORD;
    OperStatus: Integer;
    Ipv6IfIndex: DWORD;
    ZoneIndices: array[0..15] of DWORD;
    FirstPrefix: Pointer;
    TransmitLinkSpeed: UInt64;
    ReceiveLinkSpeed: UInt64;
    FirstWinsServerAddress: Pointer;
    FirstGatewayAddress: Pointer;
    Ipv4Metric: DWORD;
    Ipv6Metric: DWORD;
    Luid: NET_LUID_LH;
    Dhcpv4Server: SOCKET_ADDRESS;
    CompartmentId: DWORD;
    NetworkGuid: TGUID;
    ConnectionType: Integer;
    TunnelType: Integer;
    Dhcpv6Server: SOCKET_ADDRESS;
    Dhcpv6ClientDuid: array[0..129] of Byte;
    Dhcpv6ClientDuidLength: DWORD;
    Dhcpv6Iaid: DWORD;
    FirstDnsSuffix: Pointer;
  end;
const NET_LUID_LH = extern struct {
    Value: u64,
    Info: _Info_e__Struct,
};

const SOCKET_ADDRESS = extern struct {
    lpSockaddr: ?*anyopaque,
    iSockaddrLength: i32,
};

const IP_ADAPTER_ADDRESSES_LH = extern struct {
    Anonymous1: _Anonymous1_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,
    Anonymous2: _Anonymous2_e__Union,
    Mtu: u32,
    IfType: u32,
    OperStatus: i32,
    Ipv6IfIndex: u32,
    ZoneIndices: [16]u32,
    FirstPrefix: ?*anyopaque,
    TransmitLinkSpeed: u64,
    ReceiveLinkSpeed: u64,
    FirstWinsServerAddress: ?*anyopaque,
    FirstGatewayAddress: ?*anyopaque,
    Ipv4Metric: u32,
    Ipv6Metric: u32,
    Luid: NET_LUID_LH,
    Dhcpv4Server: SOCKET_ADDRESS,
    CompartmentId: u32,
    NetworkGuid: GUID,
    ConnectionType: i32,
    TunnelType: i32,
    Dhcpv6Server: SOCKET_ADDRESS,
    Dhcpv6ClientDuid: [130]u8,
    Dhcpv6ClientDuidLength: u32,
    Dhcpv6Iaid: u32,
    FirstDnsSuffix: ?*anyopaque,
};
type
  NET_LUID_LH {.bycopy.} = object
    Value: uint64
    Info: _Info_e__Struct

  SOCKET_ADDRESS {.bycopy.} = object
    lpSockaddr: pointer
    iSockaddrLength: int32

  IP_ADAPTER_ADDRESSES_LH {.bycopy.} = object
    Anonymous1: _Anonymous1_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
    Anonymous2: _Anonymous2_e__Union
    Mtu: uint32
    IfType: uint32
    OperStatus: int32
    Ipv6IfIndex: uint32
    ZoneIndices: array[16, uint32]
    FirstPrefix: pointer
    TransmitLinkSpeed: uint64
    ReceiveLinkSpeed: uint64
    FirstWinsServerAddress: pointer
    FirstGatewayAddress: pointer
    Ipv4Metric: uint32
    Ipv6Metric: uint32
    Luid: NET_LUID_LH
    Dhcpv4Server: SOCKET_ADDRESS
    CompartmentId: uint32
    NetworkGuid: GUID
    ConnectionType: int32
    TunnelType: int32
    Dhcpv6Server: SOCKET_ADDRESS
    Dhcpv6ClientDuid: array[130, uint8]
    Dhcpv6ClientDuidLength: uint32
    Dhcpv6Iaid: uint32
    FirstDnsSuffix: pointer
struct NET_LUID_LH
{
    ulong Value;
    _Info_e__Struct Info;
}

struct SOCKET_ADDRESS
{
    void* lpSockaddr;
    int iSockaddrLength;
}

struct IP_ADAPTER_ADDRESSES_LH
{
    _Anonymous1_e__Union Anonymous1;
    void* Next;
    void* AdapterName;
    void* FirstUnicastAddress;
    void* FirstAnycastAddress;
    void* FirstMulticastAddress;
    void* FirstDnsServerAddress;
    void* DnsSuffix;
    void* Description;
    void* FriendlyName;
    ubyte[8] PhysicalAddress;
    uint PhysicalAddressLength;
    _Anonymous2_e__Union Anonymous2;
    uint Mtu;
    uint IfType;
    int OperStatus;
    uint Ipv6IfIndex;
    uint[16] ZoneIndices;
    void* FirstPrefix;
    ulong TransmitLinkSpeed;
    ulong ReceiveLinkSpeed;
    void* FirstWinsServerAddress;
    void* FirstGatewayAddress;
    uint Ipv4Metric;
    uint Ipv6Metric;
    NET_LUID_LH Luid;
    SOCKET_ADDRESS Dhcpv4Server;
    uint CompartmentId;
    GUID NetworkGuid;
    int ConnectionType;
    int TunnelType;
    SOCKET_ADDRESS Dhcpv6Server;
    ubyte[130] Dhcpv6ClientDuid;
    uint Dhcpv6ClientDuidLength;
    uint Dhcpv6Iaid;
    void* FirstDnsSuffix;
}

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_LH サイズ: 376 バイト(x86)
dim st, 94    ; 4byte整数×94(構造体サイズ 376 / 4 切り上げ)
; Anonymous1 : _Anonymous1_e__Union (+0, 8byte)  varptr(st)+0 を基点に操作(8byte:入れ子/配列)
; Next : IP_ADAPTER_ADDRESSES_LH* (+8, 4byte)  varptr(st)+8 を基点に操作(4byte:入れ子/配列)
; AdapterName : LPSTR (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; FirstUnicastAddress : IP_ADAPTER_UNICAST_ADDRESS_LH* (+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 も可)
; Anonymous2 : _Anonymous2_e__Union (+56, 4byte)  varptr(st)+56 を基点に操作(4byte:入れ子/配列)
; 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:入れ子/配列)
; TransmitLinkSpeed : ULONGLONG (+144, 8byte)  qpoke st,144,値 / qpeek(st,144)  ※IronHSPのみ。3.7/3.8は lpoke st,144,下位 : lpoke st,148,上位
; ReceiveLinkSpeed : ULONGLONG (+152, 8byte)  qpoke st,152,値 / qpeek(st,152)  ※IronHSPのみ。3.7/3.8は lpoke st,152,下位 : lpoke st,156,上位
; FirstWinsServerAddress : IP_ADAPTER_WINS_SERVER_ADDRESS_LH* (+160, 4byte)  varptr(st)+160 を基点に操作(4byte:入れ子/配列)
; FirstGatewayAddress : IP_ADAPTER_GATEWAY_ADDRESS_LH* (+164, 4byte)  varptr(st)+164 を基点に操作(4byte:入れ子/配列)
; Ipv4Metric : DWORD (+168, 4byte)  st.42 = 値  /  値 = st.42   (lpoke/lpeek も可)
; Ipv6Metric : DWORD (+172, 4byte)  st.43 = 値  /  値 = st.43   (lpoke/lpeek も可)
; Luid : NET_LUID_LH (+176, 8byte)  varptr(st)+176 を基点に操作(8byte:入れ子/配列)
; Dhcpv4Server : SOCKET_ADDRESS (+184, 8byte)  varptr(st)+184 を基点に操作(8byte:入れ子/配列)
; CompartmentId : NET_IF_COMPARTMENT_ID (+192, 4byte)  st.48 = 値  /  値 = st.48   (lpoke/lpeek も可)
; NetworkGuid : GUID (+196, 16byte)  varptr(st)+196 を基点に操作(16byte:入れ子/配列)
; ConnectionType : NET_IF_CONNECTION_TYPE (+212, 4byte)  st.53 = 値  /  値 = st.53   (lpoke/lpeek も可)
; TunnelType : TUNNEL_TYPE (+216, 4byte)  st.54 = 値  /  値 = st.54   (lpoke/lpeek も可)
; Dhcpv6Server : SOCKET_ADDRESS (+220, 8byte)  varptr(st)+220 を基点に操作(8byte:入れ子/配列)
; Dhcpv6ClientDuid : BYTE (+228, 130byte)  varptr(st)+228 を基点に操作(130byte:入れ子/配列)
; Dhcpv6ClientDuidLength : DWORD (+360, 4byte)  st.90 = 値  /  値 = st.90   (lpoke/lpeek も可)
; Dhcpv6Iaid : DWORD (+364, 4byte)  st.91 = 値  /  値 = st.91   (lpoke/lpeek も可)
; FirstDnsSuffix : IP_ADAPTER_DNS_SUFFIX* (+368, 4byte)  varptr(st)+368 を基点に操作(4byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; IP_ADAPTER_ADDRESSES_LH サイズ: 456 バイト(x64)
dim st, 114    ; 4byte整数×114(構造体サイズ 456 / 4 切り上げ)
; Anonymous1 : _Anonymous1_e__Union (+0, 8byte)  varptr(st)+0 を基点に操作(8byte:入れ子/配列)
; Next : IP_ADAPTER_ADDRESSES_LH* (+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_LH* (+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 も可)
; Anonymous2 : _Anonymous2_e__Union (+96, 8byte)  varptr(st)+96 を基点に操作(8byte:入れ子/配列)
; Mtu : DWORD (+104, 4byte)  st.26 = 値  /  値 = st.26   (lpoke/lpeek も可)
; IfType : DWORD (+108, 4byte)  st.27 = 値  /  値 = st.27   (lpoke/lpeek も可)
; OperStatus : IF_OPER_STATUS (+112, 4byte)  st.28 = 値  /  値 = st.28   (lpoke/lpeek も可)
; Ipv6IfIndex : DWORD (+116, 4byte)  st.29 = 値  /  値 = st.29   (lpoke/lpeek も可)
; ZoneIndices : DWORD (+120, 64byte)  varptr(st)+120 を基点に操作(64byte:入れ子/配列)
; FirstPrefix : IP_ADAPTER_PREFIX_XP* (+184, 8byte)  varptr(st)+184 を基点に操作(8byte:入れ子/配列)
; TransmitLinkSpeed : ULONGLONG (+192, 8byte)  qpoke st,192,値 / qpeek(st,192)  ※IronHSPのみ。3.7/3.8は lpoke st,192,下位 : lpoke st,196,上位
; ReceiveLinkSpeed : ULONGLONG (+200, 8byte)  qpoke st,200,値 / qpeek(st,200)  ※IronHSPのみ。3.7/3.8は lpoke st,200,下位 : lpoke st,204,上位
; FirstWinsServerAddress : IP_ADAPTER_WINS_SERVER_ADDRESS_LH* (+208, 8byte)  varptr(st)+208 を基点に操作(8byte:入れ子/配列)
; FirstGatewayAddress : IP_ADAPTER_GATEWAY_ADDRESS_LH* (+216, 8byte)  varptr(st)+216 を基点に操作(8byte:入れ子/配列)
; Ipv4Metric : DWORD (+224, 4byte)  st.56 = 値  /  値 = st.56   (lpoke/lpeek も可)
; Ipv6Metric : DWORD (+228, 4byte)  st.57 = 値  /  値 = st.57   (lpoke/lpeek も可)
; Luid : NET_LUID_LH (+232, 8byte)  varptr(st)+232 を基点に操作(8byte:入れ子/配列)
; Dhcpv4Server : SOCKET_ADDRESS (+240, 16byte)  varptr(st)+240 を基点に操作(16byte:入れ子/配列)
; CompartmentId : NET_IF_COMPARTMENT_ID (+256, 4byte)  st.64 = 値  /  値 = st.64   (lpoke/lpeek も可)
; NetworkGuid : GUID (+260, 16byte)  varptr(st)+260 を基点に操作(16byte:入れ子/配列)
; ConnectionType : NET_IF_CONNECTION_TYPE (+276, 4byte)  st.69 = 値  /  値 = st.69   (lpoke/lpeek も可)
; TunnelType : TUNNEL_TYPE (+280, 4byte)  st.70 = 値  /  値 = st.70   (lpoke/lpeek も可)
; Dhcpv6Server : SOCKET_ADDRESS (+288, 16byte)  varptr(st)+288 を基点に操作(16byte:入れ子/配列)
; Dhcpv6ClientDuid : BYTE (+304, 130byte)  varptr(st)+304 を基点に操作(130byte:入れ子/配列)
; Dhcpv6ClientDuidLength : DWORD (+436, 4byte)  st.109 = 値  /  値 = st.109   (lpoke/lpeek も可)
; Dhcpv6Iaid : DWORD (+440, 4byte)  st.110 = 値  /  値 = st.110   (lpoke/lpeek も可)
; FirstDnsSuffix : IP_ADAPTER_DNS_SUFFIX* (+448, 8byte)  varptr(st)+448 を基点に操作(8byte:入れ子/配列)
; ※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 GUID, pack=1
    #field int Data1
    #field short Data2
    #field short Data3
    #field byte Data4 8
#endstruct

#defstruct global IP_ADAPTER_ADDRESSES_LH
    #field byte Anonymous1 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 byte Anonymous2 8
    #field int Mtu
    #field int IfType
    #field int OperStatus
    #field int Ipv6IfIndex
    #field int ZoneIndices 16
    #field intptr FirstPrefix
    #field int64 TransmitLinkSpeed
    #field int64 ReceiveLinkSpeed
    #field intptr FirstWinsServerAddress
    #field intptr FirstGatewayAddress
    #field int Ipv4Metric
    #field int Ipv6Metric
    #field byte Luid 8
    #field SOCKET_ADDRESS Dhcpv4Server
    #field int CompartmentId
    #field GUID NetworkGuid
    #field int ConnectionType
    #field int TunnelType
    #field SOCKET_ADDRESS Dhcpv6Server
    #field byte Dhcpv6ClientDuid 130
    #field int Dhcpv6ClientDuidLength
    #field int Dhcpv6Iaid
    #field intptr FirstDnsSuffix
#endstruct

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