#+build windows package sys_windows foreign import "system:iphlpapi.lib" Address_Family :: enum u32 { Unspecified = 0, // Return both IPv4 and IPv6 addresses associated with adapters with them enabled. IPv4 = 2, // Return only IPv4 addresses associated with adapters with it enabled. IPv6 = 23, // Return only IPv6 addresses associated with adapters with it enabled. } GAA_Flag :: enum u32 { Skip_Unicast = 0, // Do not return unicast addresses. Skip_Anycast = 1, // Do not return IPv6 anycast addresses. Skip_Multicast = 2, // Do not return multicast addresses. Skip_DNS_Server = 3, // Do not return addresses of DNS servers. Include_Prefix = 4, // (XP SP1+) Return a list of IP address prefixes on this adapter. When this flag is set, IP address prefixes are returned for both IPv6 and IPv4 addresses. Skip_Friendly_Name = 5, // Do not return the adapter friendly name. Include_WINS_info = 6, // (Vista+) Return addresses of Windows Internet Name Service (WINS) servers. Include_Gateways = 7, // (Vista+) Return the addresses of default gateways. Include_All_Interfaces = 8, // (Vista+) Return addresses for all NDIS interfaces. Include_All_Compartments = 9, // (Reserved, Unsupported) Return addresses in all routing compartments. Include_Tunnel_Binding_Order = 10, // (Vista+) Return the adapter addresses sorted in tunnel binding order. } GAA_Flags :: bit_set[GAA_Flag; u32] IP_Adapter_Addresses :: struct { Raw: struct #raw_union { Alignment: u64, Anonymous: struct { Length: u32, IfIndex: u32, }, }, Next: ^IP_Adapter_Addresses, AdapterName: cstring, FirstUnicastAddress: ^IP_ADAPTER_UNICAST_ADDRESS_LH, FirstAnycastAddress: ^IP_ADAPTER_ANYCAST_ADDRESS_XP, FirstMulticastAddress: ^IP_ADAPTER_MULTICAST_ADDRESS_XP, FirstDnsServerAddress: ^IP_ADAPTER_DNS_SERVER_ADDRESS_XP, DnsSuffix: cstring16, Description: cstring16, FriendlyName: cstring16, PhysicalAddress: [8]u8, PhysicalAddressLength: u32, Anonymous2: struct #raw_union { Flags: u32, Anonymous: struct { _bitfield: u32, }, }, MTU: u32, IfType: u32, OperStatus: IF_OPER_STATUS, Ipv6IfIndex: u32, ZoneIndices: [16]u32, FirstPrefix: rawptr, // ^IP_ADAPTER_PREFIX_XP, TransmitLinkSpeed: u64, ReceiveLinkSpeed: u64, FirstWinsServerAddress: rawptr, // ^IP_ADAPTER_WINS_SERVER_ADDRESS_LH, FirstGatewayAddress: ^IP_ADAPTER_GATEWAY_ADDRESS_LH, Ipv4Metric: u32, Ipv6Metric: u32, Luid: NET_LUID_LH, Dhcpv4Server: SOCKET_ADDRESS, CompartmentId: u32, NetworkGuid: GUID, ConnectionType: NET_IF_CONNECTION_TYPE, TunnelType: TUNNEL_TYPE, Dhcpv6Server: SOCKET_ADDRESS, Dhcpv6ClientDuid: [130]u8, Dhcpv6ClientDuidLength: u32, Dhcpv6Iaid: u32, FirstDnsSuffix: rawptr, // ^IP_ADAPTER_DNS_SUFFIX, } IP_ADAPTER_UNICAST_ADDRESS_LH :: struct { Anonymous: struct #raw_union { Alignment: u64, Anonymous: struct { Length: u32, Flags: u32, }, }, Next: ^IP_ADAPTER_UNICAST_ADDRESS_LH, Address: SOCKET_ADDRESS, PrefixOrigin: NL_PREFIX_ORIGIN, SuffixOrigin: NL_SUFFIX_ORIGIN, DadState: NL_DAD_STATE, ValidLifetime: u32, PreferredLifetime: u32, LeaseLifetime: u32, OnLinkPrefixLength: u8, } IP_ADAPTER_ANYCAST_ADDRESS_XP :: struct { Anonymous: struct #raw_union { Alignment: u64, Anonymous: struct { Length: u32, Flags: u32, }, }, Next: ^IP_ADAPTER_ANYCAST_ADDRESS_XP, Address: SOCKET_ADDRESS, } IP_ADAPTER_MULTICAST_ADDRESS_XP :: struct { Anonymous: struct #raw_union { Alignment: u64, Anonymous: struct { Length: u32, Flags: u32, }, }, Next: ^IP_ADAPTER_MULTICAST_ADDRESS_XP, Address: SOCKET_ADDRESS, } IP_ADAPTER_GATEWAY_ADDRESS_LH :: struct { Anonymous: struct #raw_union { Alignment: u64, Anonymous: struct { Length: u32, Reserved: u32, }, }, Next: ^IP_ADAPTER_GATEWAY_ADDRESS_LH, Address: SOCKET_ADDRESS, } IP_ADAPTER_DNS_SERVER_ADDRESS_XP :: struct { Anonymous: struct #raw_union { Alignment: u64, Anonymous: struct { Length: u32, Reserved: u32, }, }, Next: ^IP_ADAPTER_DNS_SERVER_ADDRESS_XP, Address: SOCKET_ADDRESS, } IF_OPER_STATUS :: enum i32 { Up = 1, Down = 2, Testing = 3, Unknown = 4, Dormant = 5, NotPresent = 6, LowerLayerDown = 7, } NET_LUID_LH :: struct #raw_union { Value: u64, Info: struct { _bitfield: u64, }, } SOCKET_ADDRESS :: struct { lpSockaddr: ^SOCKADDR, iSockaddrLength: i32, } NET_IF_CONNECTION_TYPE :: enum i32 { NET_IF_CONNECTION_DEDICATED = 1, NET_IF_CONNECTION_PASSIVE = 2, NET_IF_CONNECTION_DEMAND = 3, NET_IF_CONNECTION_MAXIMUM = 4, } TUNNEL_TYPE :: enum i32 { TUNNEL_TYPE_NONE = 0, TUNNEL_TYPE_OTHER = 1, TUNNEL_TYPE_DIRECT = 2, TUNNEL_TYPE_6TO4 = 11, TUNNEL_TYPE_ISATAP = 13, TUNNEL_TYPE_TEREDO = 14, TUNNEL_TYPE_IPHTTPS = 15, } NL_PREFIX_ORIGIN :: enum i32 { IpPrefixOriginOther = 0, IpPrefixOriginManual = 1, IpPrefixOriginWellKnown = 2, IpPrefixOriginDhcp = 3, IpPrefixOriginRouterAdvertisement = 4, IpPrefixOriginUnchanged = 16, } NL_SUFFIX_ORIGIN :: enum i32 { NlsoOther = 0, NlsoManual = 1, NlsoWellKnown = 2, NlsoDhcp = 3, NlsoLinkLayerAddress = 4, NlsoRandom = 5, IpSuffixOriginOther = 0, IpSuffixOriginManual = 1, IpSuffixOriginWellKnown = 2, IpSuffixOriginDhcp = 3, IpSuffixOriginLinkLayerAddress = 4, IpSuffixOriginRandom = 5, IpSuffixOriginUnchanged = 16, } NL_DAD_STATE :: enum i32 { NldsInvalid = 0, NldsTentative = 1, NldsDuplicate = 2, NldsDeprecated = 3, NldsPreferred = 4, IpDadStateInvalid = 0, IpDadStateTentative = 1, IpDadStateDuplicate = 2, IpDadStateDeprecated = 3, IpDadStatePreferred = 4, } @(default_calling_convention = "system") foreign iphlpapi { /* The GetAdaptersAddresses function retrieves the addresses associated with the adapters on the local computer. See: https://docs.microsoft.com/en-us/windows/win32/api/iphlpapi/nf-iphlpapi-getadaptersaddresses */ @(link_name="GetAdaptersAddresses") get_adapters_addresses :: proc( family: Address_Family, flags: GAA_Flags, _reserved: rawptr, adapter_addresses: [^]IP_Adapter_Addresses, size: ^u32, ) -> ULONG --- }