BSOne.SFC/Tocsg.Module/SocketMon/IPHLPAPI.pas

1965 lines
69 KiB
Plaintext

unit IPHLPAPI;
{$WARN UNSAFE_TYPE off}
{$WARN UNSAFE_CAST off}
{$WARN UNSAFE_CODE off}
{$WARN SYMBOL_PLATFORM OFF}
{$WARN SYMBOL_LIBRARY OFF}
{$WARN SYMBOL_DEPRECATED OFF}
// Magenta Systems Internet Protocol Helper Component
// 26th November 2018 - Release 4.0 (C) Magenta Systems Ltd, 2018
// based on work by by Dirk Claessens
// Copyright by Angus Robertson, Magenta Systems Ltd, England
// delphi@magsys.co.uk, https://www.magsys.co.uk/delphi/
//------------------------------------------------------------------------------
// Partial translation of IPHLPAPI.DLL ( IP-Helper API )
// http://users.pandora.be/dirk.claessens2/
// D. Claessens
//------------------------------------------------------------------------------
{
v1.3 - 18th September 2001
Angus Robertson, Magenta Systems Ltd, England
delphi@magsys.co.uk, http://www.magsys.co.uk/delphi/
All functions are dynamically loaded so program can be used on W95/NT4
Added GetFriendlyIfIndex
v1.4 - 28th February 2002 - Angus
Minor change to TIP_ADAPTER_INFO
v 1.5 - 26 July 2002 - Angus
Added GetPerAdapterInfo and TIP_PER_ADAPTER_INFO
v 1.6 - 19 August 2002 - Angus
Added AllocateAndGetTcpExTableFromStack and AllocateAndGetUdpExTableFromStack,
which are APIs for XP only (not Vista), info from Netstatp at www.sysinternals.com
Added MIB_TCP_STATE constants
v1.8 - 25th October 2005 - Angus
v1.9 - 8th August 2006 - Angus
Corrected IF_xx_ADAPTER type literals, thanks to Jean-Pierre Turchi
v2.0 - 25th February 2007 - Angus
Many more IF_xx_ADAPTER type literals, thanks to Jean-Pierre Turchi
v2.1 - 5th August 2008 - Angus
Updated to be compatible with Delphi 2009
Note there are only ANSI versions of the IP Helper APIs, no Wide/Unicode versions
v2.2 - 16th January 2009 - Angus
Added GetAdaptersAddresses (XP and later) has IPv6 addresses (but IPv6 structures not done yet)
Added GetExtendedTcpTable and GetExtendedUdpTable (XP SP2, W2K3 SP1, Vista and later),
replacements for AllocateAndGetTcpExTableFromStack/etc
v2.3 - 3rd August 2009
Changed ULONGLONG to LONGLONG for Delphi 7 compatability
v2.4 - 8th August 2010
Fixed various cast warning for Delphi 2009 and later
v2.5 - 12th August 2011
Removed packed for 64-bit compatibility in Delphi XE2 and later
v3.0 - 26th November 2018
Only supporting XP SP3 and later, so removed AllocateAndGetTcpExTableFromStack/etc
Added IPv6 support, numerous new structures and functions, Vista and later
Added notification functions for interface changes
Major clean up of Microsoft caps names with underscores to Delphi Txxxx type formats
Pending - IPv6 not yet supported for ARP or IP Routing table, sorry
}
{$ALIGN ON}
{$MINENUMSIZE 4}
{$WEAKPACKAGEUNIT}
interface
uses
Windows, winsock ;
const
VERSION = '4.0';
//------------- headers from Microsoft IPTYPES.H--------------------------------
const
ANY_SIZE = 1;
TCPIP_OWNING_MODULE_SIZE = 16;
MAX_ADAPTER_DESCRIPTION_LENGTH = 128; // arb.
MAX_ADAPTER_NAME_LENGTH = 256; // arb.
MAX_ADAPTER_ADDRESS_LENGTH = 8; // arb.
DEFAULT_MINIMUM_ENTITIES = 32; // arb.
MAX_HOSTNAME_LEN = 128; // arb.
MAX_DOMAIN_NAME_LEN = 128; // arb.
MAX_SCOPE_ID_LEN = 256; // arb.
MAX_DHCPV6_DUID_LENGTH = 130; // RFC 3315
// Node Types ( NETBIOS)
BROADCAST_NODETYPE = 1;
PEER_TO_PEER_NODETYPE = 2;
MIXED_NODETYPE = 4;
HYBRID_NODETYPE = 8;
NETBIOSTypes : array[0..8] of string =
( 'UNKNOWN', 'BROADCAST', 'PEER_TO_PEER', '', 'MIXED', '', '', '', 'HYBRID'
);
// Adapter Types
{ IF_OTHER_ADAPTERTYPE = 1; // 8 August 2006 corrected literals to
MIB_IF_TYPE_xx in ipifcons.h
IF_ETHERNET_ADAPTERTYPE = 6;
IF_TOKEN_RING_ADAPTERTYPE = 9;
IF_FDDI_ADAPTERTYPE = 15;
IF_PPP_ADAPTERTYPE = 23;
IF_LOOPBACK_ADAPTERTYPE = 24;
IF_SLIP_ADAPTERTYPE = 28; }
// Adapted from Ipifcons.h : // JP Turchi, 9 Feb 2007
//MIN_IF_TYPE = 1;
IF_TYPE_OTHER = 1; // None of the below
IF_TYPE_REGULAR_1822 = 2;
IF_TYPE_HDH_1822 = 3;
IF_TYPE_DDN_X25 = 4;
IF_TYPE_RFC877_X25 = 5;
IF_TYPE_ETHERNET_CSMACD = 6;
IF_TYPE_IS088023_CSMACD = 7;
IF_TYPE_ISO88024_TOKENBUS = 8;
IF_TYPE_ISO88025_TOKENRING = 9;
IF_TYPE_ISO88026_MAN = 10;
IF_TYPE_STARLAN = 11;
IF_TYPE_PROTEON_10MBIT = 12;
IF_TYPE_PROTEON_80MBIT = 13;
IF_TYPE_HYPERCHANNEL = 14;
IF_TYPE_FDDI = 15;
IF_TYPE_LAP_B = 16;
IF_TYPE_SDLC = 17;
IF_TYPE_DS1 = 18; // DS1-MIB
IF_TYPE_E1 = 19; // Obsolete; see DS1-MIB
IF_TYPE_BASIC_ISDN = 20;
IF_TYPE_PRIMARY_ISDN = 21;
IF_TYPE_PROP_POINT2POINT_SERIAL = 22; // proprietary serial
IF_TYPE_PPP = 23;
IF_TYPE_SOFTWARE_LOOPBACK = 24;
IF_TYPE_EON = 25; // CLNP over IP
IF_TYPE_ETHERNET_3MBIT = 26;
IF_TYPE_NSIP = 27; // XNS over IP
IF_TYPE_SLIP = 28; // Generic Slip
IF_TYPE_ULTRA = 29; // ULTRA Technologies
IF_TYPE_DS3 = 30; // DS3-MIB
IF_TYPE_SIP = 31; // SMDS, coffee
IF_TYPE_FRAMERELAY = 32; // DTE only
IF_TYPE_RS232 = 33;
IF_TYPE_PARA = 34; // Parallel port
IF_TYPE_ARCNET = 35;
IF_TYPE_ARCNET_PLUS = 36;
IF_TYPE_ATM = 37; // ATM cells
IF_TYPE_MIO_X25 = 38;
IF_TYPE_SONET = 39; // SONET or SDH
IF_TYPE_X25_PLE = 40;
IF_TYPE_ISO88022_LLC = 41;
IF_TYPE_LOCALTALK = 42;
IF_TYPE_SMDS_DXI = 43;
IF_TYPE_FRAMERELAY_SERVICE = 44; // FRNETSERV-MIB
IF_TYPE_V35 = 45;
IF_TYPE_HSSI = 46;
IF_TYPE_HIPPI = 47;
IF_TYPE_MODEM = 48; // Generic Modem
IF_TYPE_AAL5 = 49; // AAL5 over ATM
IF_TYPE_SONET_PATH = 50;
IF_TYPE_SONET_VT = 51;
IF_TYPE_SMDS_ICIP = 52; // SMDS InterCarrier Interface
IF_TYPE_PROP_VIRTUAL = 53; // Proprietary virtual/internal
IF_TYPE_PROP_MULTIPLEXOR = 54; // Proprietary multiplexing
IF_TYPE_IEEE80212 = 55; // 100BaseVG
IF_TYPE_FIBRECHANNEL = 56;
IF_TYPE_HIPPIINTERFACE = 57;
IF_TYPE_FRAMERELAY_INTERCONNECT = 58; // Obsolete, use 32 or 44
IF_TYPE_AFLANE_8023 = 59; // ATM Emulated LAN for 802.3
IF_TYPE_AFLANE_8025 = 60; // ATM Emulated LAN for 802.5
IF_TYPE_CCTEMUL = 61; // ATM Emulated circuit
IF_TYPE_FASTETHER = 62; // Fast Ethernet (100BaseT)
IF_TYPE_ISDN = 63; // ISDN and X.25
IF_TYPE_V11 = 64; // CCITT V.11/X.21
IF_TYPE_V36 = 65; // CCITT V.36
IF_TYPE_G703_64K = 66; // CCITT G703 at 64Kbps
IF_TYPE_G703_2MB = 67; // Obsolete; see DS1-MIB
IF_TYPE_QLLC = 68; // SNA QLLC
IF_TYPE_FASTETHER_FX = 69; // Fast Ethernet (100BaseFX)
IF_TYPE_CHANNEL = 70;
IF_TYPE_IEEE80211 = 71; // Radio spread spectrum
IF_TYPE_IBM370PARCHAN = 72; // IBM System 360/370 OEMI Channel
IF_TYPE_ESCON = 73; // IBM Enterprise Systems Connection
IF_TYPE_DLSW = 74; // Data Link Switching
IF_TYPE_ISDN_S = 75; // ISDN S/T interface
IF_TYPE_ISDN_U = 76; // ISDN U interface
IF_TYPE_LAP_D = 77; // Link Access Protocol D
IF_TYPE_IPSWITCH = 78; // IP Switching Objects
IF_TYPE_RSRB = 79; // Remote Source Route Bridging
IF_TYPE_ATM_LOGICAL = 80; // ATM Logical Port
IF_TYPE_DS0 = 81; // Digital Signal Level 0
IF_TYPE_DS0_BUNDLE = 82; // Group of ds0s on the same ds1
IF_TYPE_BSC = 83; // Bisynchronous Protocol
IF_TYPE_ASYNC = 84; // Asynchronous Protocol
IF_TYPE_CNR = 85; // Combat Net Radio
IF_TYPE_ISO88025R_DTR = 86; // ISO 802.5r DTR
IF_TYPE_EPLRS = 87; // Ext Pos Loc Report Sys
IF_TYPE_ARAP = 88; // Appletalk Remote Access Protocol
IF_TYPE_PROP_CNLS = 89; // Proprietary Connectionless Proto
IF_TYPE_HOSTPAD = 90; // CCITT-ITU X.29 PAD Protocol
IF_TYPE_TERMPAD = 91; // CCITT-ITU X.3 PAD Facility
IF_TYPE_FRAMERELAY_MPI = 92; // Multiproto Interconnect over FR
IF_TYPE_X213 = 93; // CCITT-ITU X213
IF_TYPE_ADSL = 94; // Asymmetric Digital Subscrbr Loop
IF_TYPE_RADSL = 95; // Rate-Adapt Digital Subscrbr Loop
IF_TYPE_SDSL = 96; // Symmetric Digital Subscriber Loop
IF_TYPE_VDSL = 97; // Very H-Speed Digital Subscrb Loop
IF_TYPE_ISO88025_CRFPRINT = 98; // ISO 802.5 CRFP
IF_TYPE_MYRINET = 99; // Myricom Myrinet
IF_TYPE_VOICE_EM = 100; // Voice recEive and transMit
IF_TYPE_VOICE_FXO = 101; // Voice Foreign Exchange Office
IF_TYPE_VOICE_FXS = 102; // Voice Foreign Exchange Station
IF_TYPE_VOICE_ENCAP = 103; // Voice encapsulation
IF_TYPE_VOICE_OVERIP = 104; // Voice over IP encapsulation
IF_TYPE_ATM_DXI = 105; // ATM DXI
IF_TYPE_ATM_FUNI = 106; // ATM FUNI
IF_TYPE_ATM_IMA = 107; // ATM IMA
IF_TYPE_PPPMULTILINKBUNDLE = 108; // PPP Multilink Bundle
IF_TYPE_IPOVER_CDLC = 109; // IBM ipOverCdlc
IF_TYPE_IPOVER_CLAW = 110; // IBM Common Link Access to Workstn
IF_TYPE_STACKTOSTACK = 111; // IBM stackToStack
IF_TYPE_VIRTUALIPADDRESS = 112; // IBM VIPA
IF_TYPE_MPC = 113; // IBM multi-proto channel support
IF_TYPE_IPOVER_ATM = 114; // IBM ipOverAtm
IF_TYPE_ISO88025_FIBER = 115; // ISO 802.5j Fiber Token Ring
IF_TYPE_TDLC = 116; // IBM twinaxial data link control
IF_TYPE_GIGABITETHERNET = 117;
IF_TYPE_HDLC = 118;
IF_TYPE_LAP_F = 119;
IF_TYPE_V37 = 120;
IF_TYPE_X25_MLP = 121; // Multi-Link Protocol
IF_TYPE_X25_HUNTGROUP = 122; // X.25 Hunt Group
IF_TYPE_TRANSPHDLC = 123;
IF_TYPE_INTERLEAVE = 124; // Interleave channel
IF_TYPE_FAST = 125; // Fast channel
IF_TYPE_IP = 126; // IP (for APPN HPR in IP networks)
IF_TYPE_DOCSCABLE_MACLAYER = 127; // CATV Mac Layer
IF_TYPE_DOCSCABLE_DOWNSTREAM = 128; // CATV Downstream interface
IF_TYPE_DOCSCABLE_UPSTREAM = 129; // CATV Upstream interface
IF_TYPE_A12MPPSWITCH = 130; // Avalon Parallel Processor
IF_TYPE_TUNNEL = 131; // Encapsulation interface
IF_TYPE_COFFEE = 132; // Coffee pot
IF_TYPE_CES = 133; // Circuit Emulation Service
IF_TYPE_ATM_SUBINTERFACE = 134; // ATM Sub Interface
IF_TYPE_L2_VLAN = 135; // Layer 2 Virtual LAN using 802.1Q
IF_TYPE_L3_IPVLAN = 136; // Layer 3 Virtual LAN using IP
IF_TYPE_L3_IPXVLAN = 137; // Layer 3 Virtual LAN using IPX
IF_TYPE_DIGITALPOWERLINE = 138; // IP over Power Lines
IF_TYPE_MEDIAMAILOVERIP = 139; // Multimedia Mail over IP
IF_TYPE_DTM = 140; // Dynamic syncronous Transfer Mode
IF_TYPE_DCN = 141; // Data Communications Network
IF_TYPE_IPFORWARD = 142; // IP Forwarding Interface
IF_TYPE_MSDSL = 143; // Multi-rate Symmetric DSL
IF_TYPE_IEEE1394 = 144; // IEEE1394 High Perf Serial Bus
IF_TYPE_IF_GSN = 145; // following added Oct 2014
IF_TYPE_DVBRCC_MACLAYER = 146;
IF_TYPE_DVBRCC_DOWNSTREAM = 147;
IF_TYPE_DVBRCC_UPSTREAM = 148;
IF_TYPE_ATM_VIRTUAL = 149;
IF_TYPE_MPLS_TUNNEL = 150;
IF_TYPE_SRP = 151;
IF_TYPE_VOICEOVERATM = 152;
IF_TYPE_VOICEOVERFRAMERELAY = 153;
IF_TYPE_IDSL = 154;
IF_TYPE_COMPOSITELINK = 155;
IF_TYPE_SS7_SIGLINK = 156;
IF_TYPE_PROP_WIRELESS_P2P = 157;
IF_TYPE_FR_FORWARD = 158;
IF_TYPE_RFC1483 = 159;
IF_TYPE_USB = 160;
IF_TYPE_IEEE8023AD_LAG = 161;
IF_TYPE_BGP_POLICY_ACCOUNTING = 162;
IF_TYPE_FRF16_MFR_BUNDLE = 163;
IF_TYPE_H323_GATEKEEPER = 164;
IF_TYPE_H323_PROXY = 165;
IF_TYPE_MPLS = 166;
IF_TYPE_MF_SIGLINK = 167;
IF_TYPE_HDSL2 = 168;
IF_TYPE_SHDSL = 169;
IF_TYPE_DS1_FDL = 170;
IF_TYPE_POS = 171;
IF_TYPE_DVB_ASI_IN = 172;
IF_TYPE_DVB_ASI_OUT = 173;
IF_TYPE_PLC = 174;
IF_TYPE_NFAS = 175;
IF_TYPE_TR008 = 176;
IF_TYPE_GR303_RDT = 177;
IF_TYPE_GR303_IDT = 178;
IF_TYPE_ISUP = 179;
IF_TYPE_PROP_DOCS_WIRELESS_MACLAYER = 180;
IF_TYPE_PROP_DOCS_WIRELESS_DOWNSTREAM = 181;
IF_TYPE_PROP_DOCS_WIRELESS_UPSTREAM = 182;
IF_TYPE_HIPERLAN2 = 183;
IF_TYPE_PROP_BWA_P2MP = 184;
IF_TYPE_SONET_OVERHEAD_CHANNEL = 185;
IF_TYPE_DIGITAL_WRAPPER_OVERHEAD_CHANNEL = 186;
IF_TYPE_AAL2 = 187;
IF_TYPE_RADIO_MAC = 188;
IF_TYPE_ATM_RADIO = 189;
IF_TYPE_IMT = 190;
IF_TYPE_MVL = 191;
IF_TYPE_REACH_DSL = 192;
IF_TYPE_FR_DLCI_ENDPT = 193;
IF_TYPE_ATM_VCI_ENDPT = 194;
IF_TYPE_OPTICAL_CHANNEL = 195;
IF_TYPE_OPTICAL_TRANSPORT = 196;
IF_TYPE_IEEE80216_WMAN = 237;
IF_TYPE_WWANPP = 243; // WWAN devices based on GSM technology
IF_TYPE_WWANPP2 = 244; // WWAN devices based on CDMA technology
MAX_IF_TYPE = 244;
//-------------from other MS header files---------------------------------------
MAX_INTERFACE_NAME_LEN = 256; { mrapi.h }
MAXLEN_PHYSADDR = 8; { iprtrmib.h }
MAXLEN_IFDESCR = 256; { --"--- }
type
TAddressFamily = Integer;
TNetIfIndex = Integer;
// information for IPv6 stuff missing from winsock
PScopeLevel = ^TScopeLevel;
TScopeLevel = (
ScopeLevelInterface = 1,
ScopeLevelLink = 2,
ScopeLevelSubnet = 3,
ScopeLevelAdmin = 4,
ScopeLevelSite = 5,
ScopeLevelOrganization = 8,
ScopeLevelGlobal = 14,
ScopeLevelCount = 16);
PScopeID = ^TScopeID;
TScopeID = record
Value: ULONG; // Dummy actually a record with C bitfields
end;
PIn6Addr = ^in6_addr;
in6_addr = record
case integer of
0: (S6_addr: array [0..15] of Byte);
1: (u6_addr16: array [0..7] of Word);
end;
PInAddr6 = ^TInAddr6;
TInAddr6 = record
case integer of
0: (S6_addr: array [0..15] of Byte);
1: (u6_addr8: array [0..15] of Byte);
2: (u6_addr16: array [0..7] of Word);
3: (u6_addr32: array [0..3] of Integer);
end;
PSockAddrIn6 = ^TSockAddrIn6;
TSockAddrIn6 = record
sin6_family: u_short; // AF_INET6
sin6_port: u_short; // Transport level port number
sin6_flowinfo: u_long; // IPv6 flow information
sin6_addr: TInAddr6; // IPv6 address
case integer of
0: (sin6_scope_id: u_long); // Set of interfaces for a scope.
1: (sin6_scope_struct: TScopeID);
end;
PIPv6MReq = ^TIPv6MReq;
TIPv6MReq = record
ipv6mr_multiaddr: TInAddr6; // IPv6 multicast address.
ipv6mr_interface: u_long; // Interface index.
end;
sockaddr_in6_w2ksp1 = record
sin6_family: u_short;
sin6_port: u_short;
sin6_flowinfo: u_long;
sin6_addr: TInAddr6;
sin6_scope_id: u_long;
end;
PSockAddrInet = ^TSockAddrInet;
TSockAddrInet = record // both IPv4 and IPv6 versions, check family
case Word of
1: (Ipv4: TSockAddrIn;);
2: (Ipv6: TSockAddrIn6;);
3: (si_family: TAddressFamily;);
end;
// Structure to hold a pair of source, destination addresses. }
type
_sockaddr_in6_pair = record
SourceAddress: PSockAddrIn6;
DestinationAddress: PSockAddrIn6;
end;
TSockAddrIn6Pair = _sockaddr_in6_pair;
PSockAddrIn6Pair = ^_sockaddr_in6_pair;
type
PSocketAddress = ^TSocketAddress;
TSocketAddress = record
lpSockaddr: PSockAddrInet; // both IPv4 and IPv6 versions, check family or length
iSockaddrLength: Integer;
end;
const
{ Address families. - Oct 2014 }
AF_UNSPEC = 0; { unspecified }
AF_UNIX = 1; { local to host (pipes, portals) }
AF_INET = 2; { internetwork: UDP, TCP, etc. }
AF_IMPLINK = 3; { arpanet imp addresses }
AF_PUP = 4; { pup protocols: e.g. BSP }
AF_CHAOS = 5; { mit CHAOS protocols }
AF_NS = 6; { XEROX NS protocols }
AF_IPX = AF_NS; { IPX and SPX }
AF_ISO = 7; { ISO protocols }
AF_OSI = AF_ISO; { OSI is ISO }
AF_ECMA = 8; { european computer manufacturers }
AF_DATAKIT = 9; { datakit protocols }
AF_CCITT = 10; { CCITT protocols, X.25 etc }
AF_SNA = 11; { IBM SNA }
AF_DECnet = 12; { DECnet }
AF_DLI = 13; { Direct data link interface }
AF_LAT = 14; { LAT }
AF_HYLINK = 15; { NSC Hyperchannel }
AF_APPLETALK = 16; { AppleTalk }
AF_NETBIOS = 17; { NetBios-style addresses }
AF_VOICEVIEW = 18; { VoiceView }
AF_FIREFOX = 19; { FireFox }
AF_UNKNOWN1 = 20; { Somebody is using this! }
AF_BAN = 21; { Banyan }
AF_INET6 = 23; { Internetwork Version 6 }
AF_CLUSTER = 24; { Microsoft Wolfpack }
AF_12844 = 25; { IEEE 1284.4 WG AF }
AF_IRDA = 26; { IrDA }
AF_NETDES = 28; { Network Designers OSI & gateway enabled protocols }
AF_TCNPROCESS = 29;
AF_TCNMESSAGE = 30;
AF_ICLFXBM = 31;
AF_MAX = 32;
//------------------------------------------------------------------------------
type
TMacAddress = array[1..MAX_ADAPTER_ADDRESS_LENGTH] of byte;
type
PNetLuid = ^TNetLuid;
TNetLuid = record
case Word of
1: (Value: Int64;);
2: (Reserved: Int64;);
3: (NetLuidIndex: Int64;);
4: (IfType: Int64;);
end;
TIFLuid = TNetLuid;
PIFLuid = PNetLuid;
type
TIpPrefixOrigin = (
IpPrefixOriginOther,
IpPrefixOriginManual,
IpPrefixOriginWellKnown,
IpPrefixOriginDhcp,
IpPrefixOriginRouterAdvertisement);
TIpSuffixOrigin = (
IpSuffixOriginOther,
IpSuffixOriginManual,
IpSuffixOriginWellKnown,
IpSuffixOriginDhcp,
IpSuffixOriginLinkLayerAddress,
IpSuffixOriginRandom);
TIpDadState= (
IpDadStateInvalid,
IpDadStateTentative,
IpDadStateDuplicate,
IpDadStateDeprecated,
IpDadStatePreferred);
//------IP address structures---------------------------------------------------
PIpAddressString = ^TIpAddressString;
TIpAddressString = array[0..15] of AnsiChar; // IP as string
//
PIpAddrString = ^TIpAddrString;
TIpAddrString = record // for use in linked lists
Next: PIpAddrString;
IpAddress: TIpAddressString;
IpMask: TIpAddressString;
Context: DWORD;
end;
//----------Fixed Info STRUCTURES---------------------------------------------
PTFixedInfo = ^TFixedInfo;
TFixedInfo = record
HostName: array[1..MAX_HOSTNAME_LEN + 4] of AnsiChar; // Angus
DomainName: array[1..MAX_DOMAIN_NAME_LEN + 4] of AnsiChar; // Angus
CurrentDNSServer: PIpAddrString;
DNSServerList: TIpAddrString;
NodeType: UINT;
ScopeID: array[1..MAX_SCOPE_ID_LEN + 4] of AnsiChar; // Angus
EnableRouting: UINT;
EnableProxy: UINT;
EnableDNS: UINT;
end;
//----------INTERFACE STRUCTURES-------------------------------------------------
//////////////////////////////////////////////////////////////////////////////
// //
// The following are the the operational states for WAN and LAN interfaces. //
// The order of the states seems weird, but is done for a purpose. All //
// states >= CONNECTED can transmit data right away. States >= DISCONNECTED //
// can tx data but some set up might be needed. States < DISCONNECTED can //
// not transmit data. //
// A card is marked UNREACHABLE if DIM calls InterfaceUnreachable for //
// reasons other than failure to connect. //
// //
// NON_OPERATIONAL -- Valid for LAN Interfaces. Means the card is not //
// working or not plugged in or has no address. //
// UNREACHABLE -- Valid for WAN Interfaces. Means the remote site is //
// not reachable at this time. //
// DISCONNECTED -- Valid for WAN Interfaces. Means the remote site is //
// not connected at this time. //
// CONNECTING -- Valid for WAN Interfaces. Means a connection attempt //
// has been initiated to the remote site. //
// CONNECTED -- Valid for WAN Interfaces. Means the remote site is //
// connected. //
// OPERATIONAL -- Valid for LAN Interfaces. Means the card is plugged //
// in and working. //
// //
// It is the users duty to convert these values to MIB-II values if they //
// are to be used by a subagent //
// //
//////////////////////////////////////////////////////////////////////////////
const
// Angus added from ipifcons.h
IF_OPER_STATUS_NON_OPERATIONAL = 0 ;
IF_OPER_STATUS_UNREACHABLE = 1 ;
IF_OPER_STATUS_DISCONNECTED = 2 ;
IF_OPER_STATUS_CONNECTING = 3 ;
IF_OPER_STATUS_CONNECTED = 4 ;
IF_OPER_STATUS_OPERATIONAL = 5 ;
MIB_IF_TYPE_OTHER = 1 ;
MIB_IF_TYPE_ETHERNET = 6 ;
MIB_IF_TYPE_TOKENRING = 9 ;
MIB_IF_TYPE_FDDI = 15 ;
MIB_IF_TYPE_PPP = 23 ;
MIB_IF_TYPE_LOOPBACK = 24 ;
MIB_IF_TYPE_SLIP = 28 ;
MIB_IF_TYPE_ATM = 37;
MIB_IF_TYPE_IEEE80211 = 71;
MIB_IF_TYPE_TUNNEL = 131;
MIB_IF_TYPE_IEEE1394 = 144;
MIB_IF_TYPE_IEEE80216_WMAN = 237;
MIB_IF_TYPE_WWANPP = 243;
MIB_IF_TYPE_WWANPP2 = 244;
MIB_IF_OPER_STATUS_NON_OPERATIONAL = 0 ;
MIB_IF_OPER_STATUS_UNREACHABLE = 1 ;
MIB_IF_OPER_STATUS_DISCONNECTED = 2 ;
MIB_IF_OPER_STATUS_CONNECTING = 3 ;
MIB_IF_OPER_STATUS_CONNECTED = 4 ;
MIB_IF_OPER_STATUS_OPERATIONAL = 5 ;
MIB_TCP_STATE_CLOSED = 1 ;
MIB_TCP_STATE_LISTEN = 2 ;
MIB_TCP_STATE_SYN_SENT = 3 ;
MIB_TCP_STATE_SYN_RCVD = 4 ;
MIB_TCP_STATE_ESTAB = 5 ;
MIB_TCP_STATE_FIN_WAIT1 = 6 ;
MIB_TCP_STATE_FIN_WAIT2 = 7 ;
MIB_TCP_STATE_CLOSE_WAIT = 8 ;
MIB_TCP_STATE_CLOSING = 9 ;
MIB_TCP_STATE_LAST_ACK = 10 ;
MIB_TCP_STATE_TIME_WAIT = 11 ;
MIB_TCP_STATE_DELETE_TCB = 12 ;
// wtype for MIB_IPADDRROW - Nov 2014
const
MIB_IPADDR_PRIMARY = $0001; // Primary ipaddr
MIB_IPADDR_DYNAMIC = $0004; // Dynamic ipaddr
MIB_IPADDR_DISCONNECTED = $0008; // Address is on disconnected interface
MIB_IPADDR_DELETED = $0040; // Address being deleted
MIB_IPADDR_TRANSIENT = $0080; // Transient address
MIB_IPADDR_DNS_ELIGIBLE = $0100; // Address is published in DNS.
// Bit values of IP_ADAPTER_UNICAST_ADDRESS Flags field.
const
IP_ADAPTER_ADDRESS_DNS_ELIGIBLE = $01;
IP_ADAPTER_ADDRESS_TRANSIENT = $02;
// Bit values of IP_ADAPTER_ADDRESSES Flags field.
const
IP_ADAPTER_DDNS_ENABLED = $00000001;
IP_ADAPTER_REGISTER_ADAPTER_SUFFIX = $00000002;
IP_ADAPTER_DHCP_ENABLED = $00000004;
IP_ADAPTER_RECEIVE_ONLY = $00000008;
IP_ADAPTER_NO_MULTICAST = $00000010;
IP_ADAPTER_IPV6_OTHER_STATEFUL_CONFIG = $00000020;
IP_ADAPTER_NETBIOS_OVER_TCPIP_ENABLED = $00000040;
IP_ADAPTER_IPV4_ENABLED = $00000080;
IP_ADAPTER_IPV6_ENABLED = $00000100;
IP_ADAPTER_IPV6_MANAGE_ADDRESS_CONFIG = $00000200;
// Flags used as argument to GetAdaptersAddresses().
// "SKIP" flags are added when the default is to include the information.
// "INCLUDE" flags are added when the default is to skip the information.
const
GAA_FLAG_SKIP_UNICAST = $0001;
GAA_FLAG_SKIP_ANYCAST = $0002;
GAA_FLAG_SKIP_MULTICAST = $0004;
GAA_FLAG_SKIP_DNS_SERVER = $0008;
GAA_FLAG_INCLUDE_PREFIX = $0010;
GAA_FLAG_SKIP_FRIENDLY_NAME = $0020;
GAA_FLAG_INCLUDE_WINS_INFO = $0040;
GAA_FLAG_INCLUDE_GATEWAYS = $0080;
GAA_FLAG_INCLUDE_ALL_INTERFACES = $0100;
GAA_FLAG_INCLUDE_ALL_COMPARTMENTS = $0200;
GAA_FLAG_INCLUDE_TUNNEL_BINDINGORDER = $0400;
type
// OperStatus for GetAdaptersAddresses().
TIfOperStatus = (
IF_OPER_STATUS_NONE,
IF_OPER_STATUS_UP {= 1},
IF_OPER_STATUS_DOWN {= 2},
IF_OPER_STATUS_TESTING {= 3},
IF_OPER_STATUS_UNKNOWN {= 4},
IF_OPER_STATUS_DORMANT {= 5},
IF_OPER_STATUS_NOT_PRESENT {= 6},
IF_OPER_STATUS_LOWER_LAYER_DOWN {= 7 } );
TAdminStatus = (
IF_ADMIN_STATUS_None,
IF_ADMIN_STATUS_UP, { = 1 }
IF_ADMIN_STATUS_DOWN, { = 2 }
IF_ADMIN_STATUS_TESTING {= 3 } ) ;
{/// Define compartment ID type: }
type
Puint32 = ^DWORD;
TNetIfCompartmentId = Puint32;
TNetIfNetworkGuid = TGUID;
const
NET_IF_COMPARTMENT_ID_UNSPECIFIED = 0;
NET_IF_COMPARTMENT_ID_PRIMARY = 1;
NET_IF_LINK_SPEED_UNKNOWN: Int64 = -1;
// Define datalink interface access types.
type
TNetIfAccessTtype = (
NET_IF_ACCESS_UNKNOWN,
NET_IF_ACCESS_LOOPBACK,
NET_IF_ACCESS_BROADCAST,
NET_IF_ACCESS_POINT_TO_POINT,
NET_IF_ACCESS_POINT_TO_MULTI_POINT,
NET_IF_ACCESS_MAXIMUM );
// Define datalink interface direction types.
TNetIfDirectionType = (
NET_IF_DIRECTION_SENDRECEIVE,
NET_IF_DIRECTION_SENDONLY,
NET_IF_DIRECTION_RECEIVEONLY,
NET_IF_DIRECTION_MAXIMUM );
TNetIfConnectionType = (
NET_IF_CONNECTION_UNKNOWN,
NET_IF_CONNECTION_DEDICATED,
NET_IF_CONNECTION_PASSIVE,
NET_IF_CONNECTION_DEMAND,
NET_IF_CONNECTION_MAXIMUM );
TNetIfMediaConnectState = (
MediaConnectStateUnknown,
MediaConnectStateConnected,
MediaConnectStateDisconnected );
TMibIfTableLevel = (
MibIfTableNormal,
MibIfTableRaw);
// Types of tunnels (sub-type of IF_TYPE when IF_TYPE is IF_TYPE_TUNNEL). }
TTunnelType = (
TUNNEL_TYPE_NONE {= 0},
TUNNEL_TYPE_OTHER {= 1},
TUNNEL_TYPE_DIRECT {= 2},
unused3,
unused4,
unused5,
unused6,
unused7,
unused8,
unused9,
unused10,
TUNNEL_TYPE_6TO4 {= 11},
unused12,
TUNNEL_TYPE_ISATAP {= 13},
TUNNEL_TYPE_TEREDO {= 14} );
// Medium the Ndis Driver is running on (OID_GEN_MEDIA_SUPPORTED/ OID_GEN_MEDIA_IN_USE, MediaType).
TNdisMedium = (
NdisMedium802_3,
NdisMedium802_5,
NdisMediumFddi,
NdisMediumWan,
NdisMediumLocalTalk,
NdisMediumDix,
NdisMediumArcnetRaw,
NdisMediumArcnet878_2,
NdisMediumAtm,
NdisMediumWirelessWan,
NdisMediumIrda,
NdisMediumBpc,
NdisMediumCoWan,
NdisMedium1394,
NdisMediumInfiniBand,
NdisMediumTunnel,
NdisMediumNative802_11,
NdisMediumLoopback,
NdisMediumWiMax,
NdisMediumIP );
// Physical Medium Type definitions. Used with OID_GEN_PHYSICAL_MEDIUM.
TNdisPhysicalMedium = (
NdisPhysicalMediumUnspecified,
NdisPhysicalMediumWirelessLan,
NdisPhysicalMediumCableModem,
NdisPhysicalMediumPhoneLine,
NdisPhysicalMediumPowerLine,
NdisPhysicalMediumDSL, // includes ADSL and UADSL (G.Lite)
NdisPhysicalMediumFibreChannel,
NdisPhysicalMedium1394,
NdisPhysicalMediumWirelessWan,
NdisPhysicalMediumNative802_11,
NdisPhysicalMediumBluetooth,
NdisPhysicalMediumInfiniband,
NdisPhysicalMediumWiMax,
NdisPhysicalMediumUWB,
NdisPhysicalMedium802_3,
NdisPhysicalMedium802_5,
NdisPhysicalMediumIrda,
NdisPhysicalMediumWiredWAN,
NdisPhysicalMediumWiredCoWan,
NdisPhysicalMediumOther,
NdisPhysicalMediumMax); // Not a real physical type, defined as an upper-bound
// Oct 2014
TRouterDiscoveryBehaviour = (RouterDiscoveryDisabled, RouterDiscoveryEnabled,
RouterDiscoveryDhcp, RouterDiscoveryUnchanged = -1);
TBandwidthFlag = (NlbwDisabled, NlbwEnabled, NlbwUnchanged = -1);
TPathBandwidthRod = record
Bandwidth: LONGLONG;
Instability: LONGLONG;
BandwidthPeaked: Boolean;
end;
TNetworkCategort = (NetworkCategoryPublic, NetworkCategoryPrivate,
NetworkCategoryDomainAuthenticated,
NetworkCategoryUnchanged = -1, NetworkCategoryUnknown = -1);
TInterfaceOffloadRod = (NlatUnspecified, NlatUnicast, NlatAnycast, NlatMulticast,
NlatBroadcast, NlatInvalid );
TRouteOrigin = (NlroManual, NlroWellKnown, NlroDHCP, NlroRouterAdvertisement, Nlro6to4);
TNeighborState = (NlnsUnreachable, NlnsIncomplete, NlnsProbe, NlnsDelay,
NlnsStale, NlnsReachable, NlnsPermanent, NlnsMaximum );
TLinkLocalAddressBehavior = (LinkLocalAlwaysOff, LinkLocalDelayed, LinkLocalAlwaysOn,
LinkLocalUnchanged = -1);
TTcpConnectionOffloadState = (
TcpConnectionOffloadStateInHost,
TcpConnectionOffloadStateOffloading,
TcpConnectionOffloadStateOffloaded,
TcpConnectionOffloadStateUploading,
TcpConnectionOffloadStateMax);
// ParameterChange.
TMibNoticationType = (MibParameterNotification,
MibAddInstance, MibDeleteInstance, MibInitialNotification);
// PMIB_NOTIFICATION_TYPE = ^MIB_NOTIFICATION_TYPE;
// RouteProtocol - Too complex for type
const
MibIpProtoOther = 1;
MibIpProtoLocal = 2;
MibIpProtoNetMgmt = 3;
MibIpProtoIcmp = 4;
MibIpProtoEgp = 5;
MibIpProtoGgp = 6;
MibIpProtoHello = 7;
MibIpProtoRip = 8;
MibIpProtoIsIs = 9;
MibIpProtoEsIs = 10;
MibIpProtoCisco = 11;
MibIpProtoBbn = 12;
MibIpProtoOspf = 13;
MibIpProtoBgp = 14;
MibIpProtoNtAutostatic = 10002;
MibIpProtoNTStatic = 10006;
MibIpProtoNTStaticNonDod = 10007;
type
TIpAddressPrefix = record
Prefix: TSockAddrInet;
PrefixLength: byte;
end;
PIpAddressPrefix = ^TIpAddressPrefix;
type
PTMibIfRow = ^TMibIfRow; // Windows 2000 and later, replaced by MibIfRow2
TMibIfRow = record
wszName: array[1..MAX_INTERFACE_NAME_LEN] of WCHAR;
dwIndex: DWORD;
dwType: DWORD; // see MIB_IF_TYPE and IF_TYPE_xx
dwMTU: DWORD;
dwSpeed: DWORD;
dwPhysAddrLen: DWORD;
bPhysAddr: array[1..MAXLEN_PHYSADDR] of byte;
AdminStatus: TAdminStatus; // see MIB_IF_ADMIN_STATUS
OperStatus: TIfOperStatus; // see MIB_IF_OPER_STATUS
dwLastChange: DWORD;
dwInOctets: DWORD;
dwInUcastPkts: DWORD;
dwInNUCastPkts: DWORD;
dwInDiscards: DWORD;
dwInErrors: DWORD;
dwInUnknownProtos: DWORD;
dwOutOctets: DWORD;
dwOutUCastPkts: DWORD;
dwOutNUCastPkts: DWORD;
dwOutDiscards: DWORD;
dwOutErrors: DWORD;
dwOutQLen: DWORD;
dwDescrLen: DWORD;
bDescr: array[1..MAXLEN_IFDESCR] of AnsiChar; //byte;
end;
//
PTMibIfTable = ^TMIBIfTable;
TMibIfTable = record
dwNumEntries: DWORD;
Table: array[0..ANY_SIZE - 1] of TMibIfRow;
end;
// 27 Oct 2014 -
const
// maximum string size in -wchar- units
IF_MAX_STRING_SIZE = 256;
IF_MAX_PHYS_ADDRESS_LENGTH = 32;
type
TInterfaceAndOperStatus = (
HardwareInterface,
FilterInterface,
ConnectorPresent,
NotAuthenticated,
NotMediaConnected,
Paused,
LowPower,
EndPointInterface);
TInterfaceAndOperStatusFlags = set of TInterfaceAndOperStatus;
PMibIFRow2 = ^TMibIFRow2; // Vista and later
TMibIFRow2 = record
InterfaceLuid: TNetLuid;
InterfaceIndex: TNetIfIndex;
// Read-Only fields.
InterfaceGuid: TGUID;
Alias: Array[0..IF_MAX_STRING_SIZE] of WCHAR;
Description: Array[0..IF_MAX_STRING_SIZE] of WCHAR;
PhysicalAddressLength: ULONG;
PhysicalAddress: Array[0..IF_MAX_PHYS_ADDRESS_LENGTH-1] of byte;
PermanentPhysicalAddress: Array[0..IF_MAX_PHYS_ADDRESS_LENGTH-1] of byte;
Mtu: ULONG;
IfType: DWORD; // see MIB_IF_TYPE and IF_TYPE_xx
TunnelType: TTunnelType;
MediaType: TNdisMedium;
PhysicalMediumType: TNdisPhysicalMedium;
AccessType: TNetIfAccessTtype;
DirectionType: TNetIfDirectionType;
InterfaceAndOperStatusFlags: TInterfaceAndOperStatusFlags;
OperStatus: TIfOperStatus;
AdminStatus: TAdminStatus; // see MIB_IF_ADMIN_STATUS
MediaConnectState: TNetIfMediaConnectState;
NetworkGuid: TNetIfNetworkGuid;
ConnectionType: TNetIfConnectionType;
// Statistics.
TransmitLinkSpeed: LONGLONG;
ReceiveLinkSpeed: LONGLONG;
InOctets: LONGLONG;
InUcastPkts: LONGLONG;
InNUcastPkts: LONGLONG;
InDiscards: LONGLONG;
InErrors: LONGLONG;
InUnknownProtos: LONGLONG;
InUcastOctets: LONGLONG;
InMulticastOctets: LONGLONG;
InBroadcastOctets: LONGLONG;
OutOctets: LONGLONG;
OutUcastPkts: LONGLONG;
OutNUcastPkts: LONGLONG;
OutDiscards: LONGLONG;
OutErrors: LONGLONG;
OutUcastOctets: LONGLONG;
OutMulticastOctets: LONGLONG;
OutBroadcastOctets: LONGLONG;
OutQLen: LONGLONG;
end;
PTMibIfTable2 = ^TMIBIfTable2;
TMibIfTable2 = record
NumEntries: DWORD;
Table: array[0..ANY_SIZE - 1] of TMibIfRow2;
end;
//------ADAPTER INFO STRUCTURES-------------------------------------------------
PIpAdapterInfo = ^TIpAdapterInfo;
TIpAdapterInfo = record
Next: PIpAdapterInfo;
ComboIndex: DWORD;
AdapterName: array[1..MAX_ADAPTER_NAME_LENGTH + 4] of AnsiChar; // Angus
Description: array[1..MAX_ADAPTER_DESCRIPTION_LENGTH + 4] of AnsiChar; // Angus
AddressLength: UINT;
Address: array[1..MAX_ADAPTER_ADDRESS_LENGTH] of byte; // Angus
Index: DWORD;
aType: UINT;
DHCPEnabled: UINT;
CurrentIPAddress: PIpAddrString;
IPAddressList: TIpAddrString;
GatewayList: TIpAddrString;
DHCPServer: TIpAddrString;
HaveWINS: BOOL;
PrimaryWINSServer: TIpAddrString;
SecondaryWINSServer: TIpAddrString;
LeaseObtained: LongInt ; // UNIX time, seconds since 1970
LeaseExpires: LongInt; // UNIX time, seconds since 1970
SpareStuff: array [1..200] of AnsiChar ; // Angus - space for IP address lists
end;
PIpPerAdapterInfo = ^TIpPerAdapterInfo; // Angus
TIpPerAdapterInfo = record
AutoconfigEnabled: UINT;
AutoconfigActive: UINT;
CurrentDnsServer: PIpAddrString;
DnsServerList: TIpAddrString;
SpareStuff: array [1..200] of AnsiChar ; // space for IP address lists
end;
// 12 Jan 2009 new stuff for GetAdaptersAddresses, requires winsock2
PIpAdapterUnicastAddress = ^TIpAdapterUnicastAddress;
TIpAdapterUnicastAddress = record
Union: record
case Integer of
0: (Alignment: Int64);
1: (Length: DWORD; Flags: DWORD);
end;
Next: PIpAdapterUnicastAddress;
Address: TSocketAddress;
PrefixOrigin: TIpSuffixOrigin;
SuffixOrigin: TIpSuffixOrigin;
DadState: TIpDadState;
ValidLifetime: ULONG;
PreferredLifetime: ULONG;
LeaseLifetime: ULONG;
end;
PIpAdapterAnycaseAddress = ^TIpAdapterAnycaseAddress;
TIpAdapterAnycaseAddress = record
Union: record
case Integer of
0: (Alignment: int64);
1: (Length: DWORD; Flags: DWORD);
end;
Next: PIpAdapterAnycaseAddress;
Address: TSocketAddress;
end;
PIpAdapterMulticastAddress = ^TIpAdapterMulticastAddress;
TIpAdapterMulticastAddress = record
Union: record
case Integer of
0: (Alignment: Int64);
1: (Length: DWORD; Flags: DWORD);
end;
Next: PIpAdapterMulticastAddress;
Address: TSocketAddress;
end;
PIpAdapterDnsServerAddress = ^TIpAdapterDnsServerAddress;
TIpAdapterDnsServerAddress = record
Union: record
case Integer of
0: (Alignment: Int64);
1: (Length: DWORD; Reserved: DWORD);
end;
Next: PIpAdapterDnsServerAddress;
Address: TSocketAddress;
end;
PIpAdapterPrefix = ^TIpAdapterPrefix;
TIpAdapterPrefix = record
Union: record
case Integer of
0: (Alignment: LONGLONG);
1: (Length: ULONG; Flags: DWORD);
end;
Next: PIpAdapterPrefix;
Address: TSocketAddress;
PrefixLength: ULONG;
end;
PIpAdapterWinsServerAddress = ^TIpAdapterWinsServerAddress;
TIpAdapterWinsServerAddress = record
Union: record
case Integer of
0: (Alignment: Int64);
1: (Length: DWORD; Reserved: DWORD);
end;
Next: PIpAdapterWinsServerAddress;
Address: TSocketAddress;
end;
PIpAdapterGatewayAddress = ^TIpAdapterGatewayAddress;
TIpAdapterGatewayAddress = record
Union: record
case Integer of
0: (Alignment: Int64);
1: (Length: DWORD; Reserved: DWORD);
end;
Next: PIpAdapterGatewayAddress;
Address: TSocketAddress;
end;
// linked records (NEXT) filled by GetAdaptersAddresses(), XP and later, some elements XP SP1, some Vista
// length: XP SP3=144, Vista=
type
PIpAdapterAddresses = ^TIpAdapterAddresses;
TIpAdapterAddresses = record
Union: record
case Integer of
0: (Alignment: int64);
1: (Length: DWORD;
IfIndex: DWORD);
end;
Next: PIpAdapterAddresses;
AdapterName: PAnsiChar;
FirstUnicastAddress: PIpAdapterUnicastAddress;
FirstAnycastAddress: PIpAdapterAnycaseAddress;
FirstMulticastAddress: PIpAdapterMulticastAddress;
FirstDnsServerAddress: PIpAdapterDnsServerAddress;
DnsSuffix: PWCHAR;
Description: PWCHAR;
FriendlyName: PWCHAR;
PhysicalAddress: array [0..MAX_ADAPTER_ADDRESS_LENGTH - 1] of BYTE;
PhysicalAddressLength: DWORD;
Flags: DWORD;
Mtu: DWORD;
IfType: DWORD;
OperStatus: TIfOperStatus; // last element for XP no SP
Ipv6IfIndex: DWORD;
ZoneIndices: array [0..15] of DWORD;
FirstPrefix: PIpAdapterPrefix; // last element for XP SP1
TransmitLinkSpeed: Int64; // following elements Vista and later
ReceiveLinkSpeed: Int64;
FirstWinsServerAddress: PIpAdapterWinsServerAddress;
FirstGatewayAddress: PIpAdapterGatewayAddress;
Ipv4Metric: ULONG;
Ipv6Metric: ULONG;
Luid: TIfLuid;
Dhcpv4Server: TSocketAddress;
CompartmentId: TNetIfCompartmentId;
NetworkGuid: TNetIfNetworkGuid;
ConnectionType: TNetIfConnectionType;
TunnelType: TTunnelType;
// DHCP v6 Info.
Dhcpv6Server: TSocketAddress;
Dhcpv6ClientDuid: array [0..MAX_DHCPV6_DUID_LENGTH] of byte;
Dhcpv6ClientDuidLength: ULONG;
Dhcpv6Iaid: ULONG;
end;
type
PMibIPInterfaceRow = ^TMibIPInterfaceRow;
TMibIPInterfaceRow = record
// Key Structure;
Family: TAddressFamily;
InterfaceLuid: TNetLuid;
InterfaceIndex: TNetIfIndex;
// Read-Write fields.
// Fields currently not exposed.
MaxReassemblySize: ULONG;
InterfaceIdentifier: LONGLONG;
MinRouterAdvertisementInterval: ULONG;
MaxRouterAdvertisementInterval: ULONG;
// Fileds currently exposed.
AdvertisingEnabled: BOOLEAN;
ForwardingEnabled: BOOLEAN;
WeakHostSend: BOOLEAN;
WeakHostReceive: BOOLEAN;
UseAutomaticMetric: BOOLEAN;
UseNeighborUnreachabilityDetection: BOOLEAN;
ManagedAddressConfigurationSupported: BOOLEAN;
OtherStatefulConfigurationSupported: BOOLEAN;
AdvertiseDefaultRoute: BOOLEAN;
RouterDiscoveryBehavior: TRouterDiscoveryBehaviour;
DadTransmits: ULONG; // DupAddrDetectTransmits in RFC 2462.
BaseReachableTime: ULONG;
RetransmitTime: ULONG;
PathMtuDiscoveryTimeout: ULONG; // Path MTU discovery timeout (in ms).
LinkLocalAddressBehavior: TLinkLocalAddressBehavior;
LinkLocalAddressTimeout: ULONG; // In ms.
ZoneIndices : array[0..Ord(ScopeLevelCount)-1] of ULONG; // Zone part of a SCOPE_ID.
SitePrefixLength: ULONG;
Metric: ULONG;
NlMtu: ULONG;
// Read Only fields.
Connected: BOOLEAN;
SupportsWakeUpPatterns: BOOLEAN;
SupportsNeighborDiscovery: BOOLEAN;
SupportsRouterDiscovery: BOOLEAN;
ReachableTime: ULONG;
TransmitOffload: TInterfaceOffloadRod;
ReceiveOffload: TInterfaceOffloadRod;
// Disables using default route on the interface. This flag
// can be used by VPN clients to restrict Split tunnelling.
DisableDefaultRoutes: BOOLEAN;
end;
type
PMibIPInterfaceTable = ^TMibIPInterfaceTable;
TMibIPInterfaceTable = record
NumEntries: ULONG;
Table : array[0..ANY_SIZE-1] of TMibIPInterfaceRow;
end;
type
PMibIpForwardRow2 = ^TMibIpForwardRow2;
TMibIpForwardRow2 = record
InterfaceLuid: TNetLuid;
InterfaceIndex: TNetIfIndex;
DestinationPrefix: TIpAddressPrefix;
NextHop: TSockAddrInet;
// Read-Write Fields.
SitePrefixLength: UCHAR;
ValidLifetime: ULONG;
PreferredLifetime: ULONG;
Metric: ULONG;
Protocol: ULONG; // TRouteProtocol;
Loopback: BOOLEAN;
AutoconfigureAddress: BOOLEAN;
Publish: BOOLEAN;
Immortal: BOOLEAN;
// Read-Only Fields.
Age: ULONG;
Origin: TRouteOrigin;
end;
type
PMibIpForwardTable2 = ^TMibIpForwardTable2;
TMibIpForwardTable2 = record
NumEntries: ULONG;
Table: Array[0..ANY_SIZE-1] of TMibIpForwardRow2;
end;
PMibUnicastIpAddressRow = ^TMibUnicastIpAddressRow;
TMibUnicastIpAddressRow = record
// Key Structure.
Address: TSockAddrInet;
InterfaceLuid: TNetLuid;
InterfaceIndex: TNetIfIndex;
// Read-Write Fileds.
PrefixOrigin: TIpPrefixOrigin;
SuffixOrigin: TIpSuffixOrigin;
ValidLifetime: ULONG;
PreferredLifetime: ULONG;
OnLinkPrefixLength: byte;
SkipAsSource: BOOLEAN;
// Read-Only Fields.
DadState: TIpDadState;
ScopeId: TScopeId;
CreationTimeStamp: TFileTime; {LARGE_INTEGER}
end;
PMibUnicastIpAddressTable = ^TMibUnicastIpAddressTable;
TMibUnicastIpAddressTable = record
NumEntries: ULONG;
Table: Array[0..ANY_SIZE-1] of TMibUnicastIpAddressRow;
end;
PMibAnycastIpAddressRow = ^TMibAnycastIpAddressRow;
TMibAnycastIpAddressRow = record
// Key Structure.
Address: TSockAddrInet;
InterfaceLuid: TNetLuid;
InterfaceIndex: TNetIfIndex;
//Read-Only Fields. }
ScopeId: TScopeId;
end;
PMibAnycastIpAddressTable = ^TMibAnycastIpAddressTable;
TMibAnycastIpAddressTable = record
NumEntries: ULONG;
Table: array[0..ANY_SIZE - 1] of TMibAnycastIpAddressRow;
end;
PMibMulticastIpAddressRow = ^TMibMulticastIpAddressRow;
TMibMulticastIpAddressRow = record
// Key Structure.
Address: TSockAddrInet;
InterfaceIndex: TNetIfIndex;
InterfaceLuid: TNetLuid;
// Read-Only Fields.
ScopeId: TScopeId;
end;
PMibMulticastIpAddressTable = ^TMibMulticastIpAddressTable;
TMibMulticastIpAddressTable = record
NumEntries: ULONG;
Table: array[0..ANY_SIZE - 1] of TMibMulticastIpAddressRow;
end;
//----------------TCP STRUCTURES------------------------------------------------
PTMibTCPRow = ^TMibTCPRow;
TMibTCPRow = record
dwState: DWORD;
dwLocalAddr: DWORD;
dwLocalPort: DWORD;
dwRemoteAddr: DWORD;
dwRemotePort: DWORD;
end;
//
PTMibTCPTable = ^TMibTCPTable;
TMibTCPTable = record
dwNumEntries: DWORD;
Table: array[0..0] of TMibTCPRow;
end;
//
PTMibTCP6Row = ^TMibTCP6Row;
TMibTCP6Row = record
dwState: DWORD;
LocalAddr: IN6_ADDR;
dwLocalScopeId: DWORD;
dwLocalPort: DWORD;
RemoteAddr: IN6_ADDR;
dwRemoteScopeId: DWORD;
dwRemotePort: DWORD;
end;
//
PTMibTCP6Table = ^TMibTCP6Table;
TMibTCP6Table = record
dwNumEntries: DWORD;
Table: array[0..0] of TMibTCP6Row;
end;
//
PTMibTCPRow2 = ^TMibTCPRow2;
TMibTCPRow2 = record
dwState: DWORD;
dwLocalAddr: DWORD;
dwLocalPort: DWORD;
dwRemoteAddr: DWORD;
dwRemotePort: DWORD;
dwOwningPid: LongInt;
dwOffloadState: TTcpConnectionOffloadState;
end;
//
PTMibTCPTable2 = ^TMibTCPTable2;
TMibTCPTable2 = record
dwNumEntries: DWORD;
Table: array[0..0] of TMibTCPRow2;
end;
//
PTMibTCP6Row2 = ^TMibTCP6Row2;
TMibTCP6Row2 = record
LocalAddr: IN6_ADDR;
dwLocalScopeId: DWORD;
dwLocalPort: DWORD;
RemoteAddr: IN6_ADDR;
dwRemoteScopeId: DWORD;
dwRemotePort: DWORD;
dwState: DWORD;
dwOwningPid: LongInt;
dwOffloadState: TTcpConnectionOffloadState;
end;
//
PTMibTCP6Table2 = ^TMibTCP6Table2;
TMibTCP6Table2 = record
dwNumEntries: DWORD;
Table: array[0..0] of TMibTCP6Row2;
end;
//
PTMibTCPStats = ^TMibTCPStats;
TMibTCPStats = record
dwRTOAlgorithm: DWORD;
dwRTOMin: DWORD;
dwRTOMax: DWORD;
dwMaxConn: DWORD;
dwActiveOpens: DWORD;
dwPassiveOpens: DWORD;
dwAttemptFails: DWORD;
dwEstabResets: DWORD;
dwCurrEstab: DWORD;
dwInSegs: DWORD;
dwOutSegs: DWORD;
dwRetransSegs: DWORD;
dwInErrs: DWORD;
dwOutRsts: DWORD;
dwNumConns: DWORD;
end;
//---------UDP STRUCTURES-------------------------------------------------------
PTMibUDPRow = ^TMibUDPRow;
TMibUDPRow = record
dwLocalAddr: DWORD;
dwLocalPort: DWORD;
end;
//
PTMibUDPTable = ^TMIBUDPTable;
TMIBUDPTable = record
dwNumEntries: DWORD;
Table: array[0..ANY_SIZE - 1] of TMibUDPRow;
end;
//
PTMibUDP6Row = ^TMibUDP6Row;
TMibUDP6Row = record
dwLocalAddr: IN6_ADDR;
dwLocalScopeId: DWORD;
dwLocalPort: DWORD;
end;
//
PTMibUDP6Table = ^TMIBUDP6Table;
TMIBUDP6Table = record
dwNumEntries: DWORD;
Table: array[0..ANY_SIZE - 1] of TMibUDP6Row;
end;
//
PTMibUdpStats = ^TMIBUdpStats;
TMIBUdpStats = record
dwInDatagrams: DWORD;
dwNoPorts: DWORD;
dwInErrors: DWORD;
dwOutDatagrams: DWORD;
dwNumAddrs: DWORD;
end;
//-----------IP STRUCTURES------------------------------------------------------
//
PTMibIPNetRow = ^TMibIPNetRow;
TMibIPNetRow = record
dwIndex: DWord;
dwPhysAddrLen: DWord;
bPhysAddr: TMACAddress;
dwAddr: DWord;
dwType: DWord;
end;
//
PTMibIPNetTable = ^TMibIPNetTable;
TMibIPNetTable = record
dwNumEntries: DWORD;
Table: array[0..ANY_SIZE - 1] of TMibIPNetRow;
end;
//
PTMibIPStats = ^TMibIPStats;
TMibIPStats = record
dwForwarding: DWORD;
dwDefaultTTL: DWORD;
dwInReceives: DWORD;
dwInHdrErrors: DWORD;
dwInAddrErrors: DWORD;
dwForwDatagrams: DWORD;
dwInUnknownProtos: DWORD;
dwInDiscards: DWORD;
dwInDelivers: DWORD;
dwOutRequests: DWORD;
dwRoutingDiscards: DWORD;
dwOutDiscards: DWORD;
dwOutNoRoutes: DWORD;
dwReasmTimeOut: DWORD;
dwReasmReqds: DWORD;
dwReasmOKs: DWORD;
dwReasmFails: DWORD;
dwFragOKs: DWORD;
dwFragFails: DWORD;
dwFragCreates: DWORD;
dwNumIf: DWORD;
dwNumAddr: DWORD;
dwNumRoutes: DWORD;
end;
//
PTMibIPAddrRow = ^TMibIPAddrRow;
TMibIPAddrRow = record
dwAddr: DWORD;
dwIndex: DWORD;
dwMask: DWORD;
dwBCastAddr: DWORD;
dwReasmSize: DWORD;
Unused1: WORD;
wType: WORD; // XP and later - MIB_IPADDR_xx literals - Nov 2014
end;
//
PTMibIPAddrTable = ^TMibIPAddrTable;
TMibIPAddrTable = record
dwNumEntries: DWORD;
Table: array[0..ANY_SIZE - 1] of TMibIPAddrRow;
end;
//
PTMibIPForwardRow = ^TMibIPForwardRow;
TMibIPForwardRow = record
dwForwardDest: DWORD;
dwForwardMask: DWORD;
dwForwardPolicy: DWORD;
dwForwardNextHop: DWORD;
dwForwardIFIndex: DWORD;
dwForwardType: DWORD;
dwForwardProto: DWORD;
dwForwardAge: DWORD;
dwForwardNextHopAS: DWORD;
dwForwardMetric1: DWORD;
dwForwardMetric2: DWORD;
dwForwardMetric3: DWORD;
dwForwardMetric4: DWORD;
dwForwardMetric5: DWORD;
end;
//
PTMibIPForwardTable = ^TMibIPForwardTable;
TMibIPForwardTable = record
dwNumEntries: DWORD;
Table: array[0..ANY_SIZE - 1] of TMibIPForwardRow;
end;
//--------ICMP-STRUCTURES------------------------------------------------------
PTMibICMPStats = ^TMibICMPStats;
TMibICMPStats = record
dwMsgs: DWORD;
dwErrors: DWORD;
dwDestUnreachs: DWORD;
dwTimeEcxcds: DWORD;
dwParmProbs: DWORD;
dwSrcQuenchs: DWORD;
dwRedirects: DWORD;
dwEchos: DWORD;
dwEchoReps: DWORD;
dwTimeStamps: DWORD;
dwTimeStampReps: DWORD;
dwAddrMasks: DWORD;
dwAddrReps: DWORD;
end;
PTMibICMPInfo = ^TMibICMPInfo;
TMibICMPInfo = record
InStats: TMibICMPStats;
OutStats: TMibICMPStats;
end;
// 13 Jan 2009 - GetExtendedTcpTable and GetExtendedUdpTable structures, XP SP2, Vista and better
type
TTcpTableClass = (
TCP_TABLE_BASIC_LISTENER,
TCP_TABLE_BASIC_CONNECTIONS,
TCP_TABLE_BASIC_ALL,
TCP_TABLE_OWNER_PID_LISTENER,
TCP_TABLE_OWNER_PID_CONNECTIONS,
TCP_TABLE_OWNER_PID_ALL,
TCP_TABLE_OWNER_MODULE_LISTENER,
TCP_TABLE_OWNER_MODULE_CONNECTIONS,
TCP_TABLE_OWNER_MODULE_ALL) ;
TUdpTableClass = (
UDP_TABLE_BASIC,
UDP_TABLE_OWNER_PID,
UDP_TABLE_OWNER_MODULE );
TTcpIpOwnerModuleInfoClass = (
TcpIpOwnerModuleInfoClassBasic );
TTcpIpOwnerModuleBasicInfo = record
pModuleName: PWCHAR;
pModulePath: PWCHAR;
end;
PTcpIpOwnerModuleBasicInfo = ^TTcpIpOwnerModuleBasicInfo;
TTcpIpOwnerModuleBasicInfoEx = record
TcpIpOwnerModuleBasicInfo: TTcpIpOwnerModuleBasicInfo ;
Buffer: Array[0..1024] of byte; // space for module name and path
end;
TMibTcpRowOwnerPID = record
dwState: LongInt;
dwLocalAddr: DWORD;
dwLocalPort: DWORD;
dwRemoteAddr: DWORD;
dwRemotePort: DWORD;
dwOwningPid: DWORD;
end;
PTMibTcpRowOwnerPID = ^TMibTcpRowOwnerPID;
TMibTcpTableOwnerPID = record
dwNumEntries: DWORD;
table: Array[0..ANY_SIZE-1] of TMibTcpRowOwnerPID;
end;
PTMibTcpTableOwnerPID = ^TMibTcpTableOwnerPID;
TMibTcp6RowOwnerPID = record
ucLocalAddr: TInAddr6;
dwLocalScopeId: DWORD;
dwLocalPort: DWORD;
ucRemoteAddr: TInAddr6;
dwRemoteScopeId: DWORD;
dwRemotePort: DWORD;
dwState: DWORD;
dwOwningPid: DWORD;
end;
PTMibTcp6RowOwnerPID = ^TMibTcp6RowOwnerPID;
TMibTcp6TableOwnerPID = record
dwNumEntries: DWORD;
table: Array[0..ANY_SIZE-1] of TMibTcp6RowOwnerPID;
end;
PTMibTcp6TableOwnerPID = ^TMibTcp6TableOwnerPID;
TMibTcpRowOwnerModule = record
dwState: DWORD;
dwLocalAddr: DWORD;
dwLocalPort: DWORD;
dwRemoteAddr: DWORD;
dwRemotePort: DWORD;
dwOwningPid: DWORD;
liCreateTimestamp: TFileTime; {LARGE_INTEGER}
OwningModuleInfo: Array[0..TCPIP_OWNING_MODULE_SIZE-1] of LONGLONG;
end;
PTMibTcpRowOwnerModule = ^TMibTcpRowOwnerModule;
TMibTcpTableOwnerModule = record
dwNumEntries: DWORD;
table: Array[0..ANY_SIZE-1] of TMibTcpRowOwnerModule;
end;
PTMibTcpTableOwnerModule = ^TMibTcpTableOwnerModule;
// Oct 2014
TMibTcp6RowOwnerModule = record
ucLocalAddr: TInAddr6;
dwLocalScopeId: DWORD;
dwLocalPort: DWORD;
ucRemoteAddr: TInAddr6;
dwRemoteScopeId: DWORD;
dwRemotePort: DWORD;
dwState: DWORD;
dwOwningPid: DWORD;
liCreateTimestamp: TFileTime; {LARGE_INTEGER}
OwningModuleInfo: Array[0..TCPIP_OWNING_MODULE_SIZE-1] of LONGLONG;
end;
PTMibTcp6RowOwnerModule = ^TMibTcp6RowOwnerModule;
TMibTcp6TableOwnerModule = record
dwNumEntries: DWORD;
table: Array[0..ANY_SIZE-1] of TMibTcp6RowOwnerModule;
end;
PTMibTcp6TableOwnerModule = ^TMibTcp6TableOwnerModule;
TMibUdpRowOwnerPID = record
dwLocalAddr: DWORD;
dwLocalPort: DWORD;
dwOwningPid: DWORD;
end;
PTMibUdpRowOwnerPID = ^TMibUdpRowOwnerPID;
_MIB_UDPTABLE_OWNER_PID = record
dwNumEntries: DWORD;
table: Array[0..ANY_SIZE-1] of TMibUdpRowOwnerPID;
end;
TMibUdpTableOwnerPID = _MIB_UDPTABLE_OWNER_PID;
PTMibUdpTableOwnerPID = ^_MIB_UDPTABLE_OWNER_PID;
TMibUdp6RowOwnerPID = record
ucLocalAddr: TInAddr6;
dwLocalScopeId: DWORD;
dwLocalPort: DWORD;
dwOwningPid: DWORD;
end;
PTMibUdp6RowOwnerPID = ^TMibUdp6RowOwnerPID;
TMibUdp6TableOwnerPID = record
dwNumEntries: DWORD;
table: Array[0..ANY_SIZE-1] of TMibUdp6RowOwnerPID;
end;
PTMibUdp6TableOwnerPID = ^TMibUdp6TableOwnerPID;
TMibUdpRowOwnerModule = record
dwLocalAddr: DWORD;
dwLocalPort: DWORD;
dwOwningPid: DWORD;
unknown: DWORD; // Angus - had to add this dummy element so the record is the correct length and timestamp works
liCreateTimestamp: TFileTime; {LARGE_INTEGER}
SpecificPortBind: integer;
OwningModuleInfo: Array[0..TCPIP_OWNING_MODULE_SIZE-1] of LONGLONG;
end;
PTMibUdpRowOwnerModule = ^TMibUdpRowOwnerModule;
TMibUdpTableOwnerModule = record
dwNumEntries: DWORD;
table: Array[0..ANY_SIZE-1] of TMibUdpRowOwnerModule;
end;
PTMibUdpTableOwnerModule = ^TMibUdpTableOwnerModule;
TMibUdp6RowOwnerModule = record
ucLocalAddr: TInAddr6;
dwLocalScopeId: DWORD;
dwLocalPort: DWORD;
dwOwningPid: DWORD;
unknown: DWORD; // Angus - had to add this dummy element so the record is the correct length and timestamp works
liCreateTimestamp: TFileTime; {LARGE_INTEGER}
SpecificPortBind: integer;
OwningModuleInfo: Array[0..TCPIP_OWNING_MODULE_SIZE-1] of LONGLONG;
end;
PTMibUdp6RowOwnerModule = ^TMibUdp6RowOwnerModule;
TMibUdp6TableOwnerModule = record
dwNumEntries: DWORD;
table: Array[0..ANY_SIZE-1] of TMibUdp6RowOwnerModule;
end;
PTMibUdp6TableOwnerModule = ^TMibUdp6TableOwnerModule;
//------------------imports from IPHLPAPI.DLL-----------------------------------
var
GetAdaptersInfo: function ( pAdapterInfo: PIpAdapterInfo; pOutBufLen: PULONG ): DWORD; stdcall;
GetPerAdapterInfo: function (IfIndex: ULONG; pPerAdapterInfo: PIpPerAdapterInfo; pOutBufLen: PULONG):DWORD; stdcall;
GetNetworkParams: function ( FixedInfo: PTFixedInfo; pOutPutLen: PULONG ): DWORD; stdcall;
GetTcpTable: function ( pTCPTable: PTMibTCPTable; pDWSize: PDWORD; bOrder: BOOL ): DWORD; stdcall;
GetTcpStatistics: function ( pStats: PTMibTCPStats ): DWORD; stdcall;
GetUdpTable: function ( pUdpTable: PTMibUDPTable; pDWSize: PDWORD; bOrder: BOOL ): DWORD; stdcall;
GetUdpStatistics: function ( pStats: PTMibUdpStats ): DWORD; stdcall;
GetIpStatistics: function ( pStats: PTMibIPStats ): DWORD; stdcall;
GetIpNetTable: function ( pIpNetTable: PTMibIPNetTable; pdwSize: PULONG; bOrder: BOOL ): DWORD; stdcall;
GetIpAddrTable: function ( pIpAddrTable: PTMibIPAddrTable; pdwSize: PULONG; bOrder: BOOL ): DWORD; stdcall;
GetIpForwardTable: function ( pIPForwardTable: PTMibIPForwardTable; pdwSize: PULONG; bOrder: BOOL ): DWORD; stdCall;
GetIcmpStatistics: function ( pStats: PTMibICMPInfo ): DWORD; stdCall;
GetRTTAndHopCount: function ( DestIPAddress: DWORD; HopCount: PULONG; MaxHops: ULONG; RTT: PULONG ): BOOL; stdCall;
GetIfTable: function ( pIfTable: PTMibIfTable; pdwSize: PULONG; bOrder: boolean ): DWORD; stdCall;
GetIfEntry: function ( pIfRow: PTMibIfRow ): DWORD; stdCall;
// warning - documentation is vague about where the result is provided
GetFriendlyIfIndex: function (var IfIndex: DWORD): DWORD; stdcall;
// 12 Jan 2009 replacement for GetAdaptersInfo, XP and later
GetAdaptersAddresses: function ( Family: LongWord; Flags: LongWord; Reserved: Pointer;
AdapterAddresses: PIpAdapterAddresses; SizePointer: PULONG): DWORD stdcall ;
// 12 Jan 2009 - replacement for AllocateAndGetTcpExTableFromStack - XP SP2, W2K3 SP1, Vista and later
GetExtendedTcpTable: function ( pTCPTable: Pointer; pDWSize: PDWORD;
bOrder: BOOL; ulAf: LongWord; TableClass: TTcpTableClass; Reserved: LongWord): DWORD; stdcall;
GetOwnerModuleFromTcpEntry: function( pTcpEntry: PTMibTcpRowOwnerModule;
InfoClass: TTcpIpOwnerModuleInfoClass; pBuffer: Pointer; pdwSize: PDWORD): LongInt stdcall ;
GetExtendedUdpTable: function ( pUdpTable: Pointer; pdwSize: PDWORD;
bOrder: BOOL; ulAf: LongWord; TableClass: TUdpTableClass; Reserved: LongWord): LongInt stdcall ;
GetOwnerModuleFromUdpEntry: function ( pUdpEntry: PTMibUdpRowOwnerModule;
InfoClass: TTcpIpOwnerModuleInfoClass; pBuffer: Pointer; pdwSize: PDWORD): LongInt stdcall ;
// Nov 2014 - notify IP address and route changes, some Vista and later
type
TIpForwardChangeCallback = procedure (CallerContext: Pointer; Row: PMibIpForwardRow2;
NotificationType: TMibNoticationType); stdcall;
PIpForwardChangeCallback = ^TIpForwardChangeCallback;
TIpInterfaceChangeCallback = procedure (CallerContext: Pointer; Row: PMibIPInterfaceRow;
NotificationType: TMibNoticationType); stdcall;
PIpInterfaceChangeCallback = ^TIpInterfaceChangeCallback;
TUnicastIpAddressChangeCallback = procedure (CallerContext: Pointer; Row: PMibUnicastIpAddressRow;
NotificationType: TMibNoticationType); stdcall;
PUnicastIpAddressChangeCallback = ^TUnicastIpAddressChangeCallback;
TStableUnicastIpAddressTableCallback = procedure (CallerContext: Pointer;
AddressTable: PMibUnicastIpAddressTable); stdcall;
PStableUnicastIpAddressTableCallback = ^TStableUnicastIpAddressTableCallback;
// Nov 2014 - get IP addresses and routes, some Vista and later
var
NotifyAddrChange: function (var Handle: THandle; overlapped: POVERLAPPED): DWORD; stdcall;
NotifyRouteChange: function (var Handle: THandle; overlapped: POVERLAPPED): DWORD; stdcall;
NotifyRouteChange2: function (Family: TAddressFamily; Callback: PIpForwardChangeCallback;
CallerContext: Pointer; InitialNotification: BOOLEAN; var NotificationHandle: THandle): DWORD; stdcall;
CancelIPChangeNotify: function (notifyOverlapped: POVERLAPPED): BOOL; stdcall;
NotifyIpInterfaceChange: function (Family: TAddressFamily; Callback: PIpInterfaceChangeCallback;
CallerContext: Pointer; InitialNotification: BOOLEAN; var NotificationHandle: THandle): DWORD; stdcall;
NotifyUnicastIpAddressChange: function (Family: TAddressFamily; Callback: PUnicastIpAddressChangeCallback;
CallerContext: Pointer; InitialNotification: BOOLEAN; var NotificationHandle: THandle): DWORD; stdcall;
NotifyStableUnicastIpAddressTable: function (Family: TAddressFamily; var Table: PMibUnicastIpAddressTable;
CallerCallback: TStableUnicastIpAddressTableCallback; CallerContext: Pointer; NotificationHandle: PHandle): DWORD; stdcall;
SetUnicastIpAddressEntry: function (const Row: PMibUnicastIpAddressRow): DWORD; stdcall;
CancelMibChangeNotify2: function (NotificationHandle: THandle): DWORD; stdcall;
GetIpInterfaceEntry: function (var Row: PMibIPInterfaceRow): DWORD; stdcall;
GetIpInterfaceTable: function (Family: TAddressFamily; var Table: PMibIPInterfaceTable): DWORD; stdcall;
InitializeIpInterfaceEntry: procedure (var Row: PMibIPInterfaceRow); stdcall;
SetIpInterfaceEntry: function (Row: PMibIPInterfaceRow): DWORD; stdcall;
CreateUnicastIpAddressEntry: function (const Row: PMibUnicastIpAddressRow): DWORD; stdcall;
DeleteUnicastIpAddressEntry: function (const Row: PMibUnicastIpAddressRow): DWORD; stdcall;
GetUnicastIpAddressEntry: function (var Row: PMibUnicastIpAddressRow): DWORD; stdcall;
GetUnicastIpAddressTable: function (Family: TAddressFamily; var Table: PMibUnicastIpAddressTable): DWORD; stdcall;
InitializeUnicastIpAddressEntry: function (var Row: PMibUnicastIpAddressRow): DWORD; stdcall;
CreateAnycastIpAddressEntry: function (const Row: PMibAnycastIpAddressRow): DWORD; stdcall;
DeleteAnycastIpAddressEntry: function (const Row: PMibAnycastIpAddressRow): DWORD; stdcall;
GetAnycastIpAddressEntry: function (var Row: PMibAnycastIpAddressRow): DWORD; stdcall;
GetAnycastIpAddressTable: function (Family: TAddressFamily; var Table: PMibAnycastIpAddressTable): DWORD; stdcall;
GetMulticastIpAddressEntry: function (var Row: PMibMulticastIpAddressRow): DWORD; stdcall;
GetMulticastIpAddressTable: function (Family: TAddressFamily; var Table: PMibMulticastIpAddressTable): DWORD; stdcall;
FreeMibTable: procedure (Memory: Pointer); stdcall;
ConvertInterfaceNameToLuidW: function (const InterfaceName: PWideChar; InterfaceLuid: PNetLuid): DWORD; stdcall;
ConvertInterfaceLuidToNameW: function (const InterfaceLuid: PNetLuid; InterfaceName: PWideChar; Length: DWORD): DWORD; stdcall;
ConvertInterfaceIndexToLuid: function (const InterfaceIndex: TNetIfIndex; InterfaceLuid: PNetLuid): DWORD; stdcall;
// 27 Oct 2014 - IPv6 versions of earlier APIs
GetIfEntry2: function (var pIfRow: PMibIfRow2): DWORD; stdCall;
GetIfTable2: function (var pIfTable: PTMibIfTable2): DWORD; stdCall;
GetIfTable2Ex: function (Level: TMibIfTableLevel; var pIfTable: PTMibIfTable2): DWORD; stdCall;
GetIpForwardTable2: function (Family: TAddressFamily; var pIPForwardTable: PMibIPForwardTable2): DWORD; stdCall;
GetTcp6Table: function (var pTCPTable: PTMibTCP6Table; pDWSize: PDWORD; bOrder: BOOL): DWORD; stdcall;
GetTcpStatisticsEx: function (dwFamily: DWORD; var pStats: PTMibTCPStats): DWORD; stdcall;
GetUdp6Table: function (var pUdpTable: PTMibUDP6Table; pDWSize: PDWORD; bOrder: BOOL ): DWORD; stdcall;
GetUdpStatisticsEx: function (dwFamily: DWORD; var pStats: PTMibUdpStats): DWORD; stdcall;
GetOwnerModuleFromTcp6Entry: function( pTcpEntry: PTMibTcp6RowOwnerModule;
InfoClass: TTcpIpOwnerModuleInfoClass; pBuffer: Pointer; pdwSize: PDWORD): DWORD stdcall ;
GetOwnerModuleFromUdp6Entry: function ( pUdpEntry: PTMibUdp6RowOwnerModule;
InfoClass: TTcpIpOwnerModuleInfoClass; pBuffer: Pointer; pdwSize: PDWORD): DWORD stdcall ;
// Nov 2014-- Vista and later functions from NTDLL
// only ANSI versions since IP address don't need unicode
RtlIpv4AddressToStringA: function (const Addr: PInAddr; S: PAnsiChar): PAnsiChar; stdcall;
RtlIpv4AddressToStringExA: function (const Address: PInAddr; Port: Word;
AddressString: PAnsiChar; var AddressStringLength: DWORD): Longint; stdcall;
RtlIpv4StringToAddressA: function (const S: PAnsiChar; Strict: Boolean;
var Terminator: PAnsiChar; Address: PInAddr): DWORD; stdcall;
RtlIpv4StringToAddressExA: function (const AddressString: PAnsiChar; Strict: Boolean;
Address: PInAddr; var Port: Word): DWORD; stdcall;
RtlIpv6AddressToStringA: function (const Addr: PIn6Addr; S: PAnsiChar): PAnsiChar; stdcall;
RtlIpv6AddressToStringExA: function (const Address: PIn6Addr; ScopeId: DWORD; Port: Word;
AddressString: PAnsiChar; var AddressStringLength: DWORD): DWORD stdcall ;
RtlIpv6StringToAddressA: function (const S: PAnsiChar; var Terminator: PAnsiChar;
Addr: PIn6Addr): DWORD; stdcall;
RtlIpv6StringToAddressExA: function (const AddressString: PAnsiChar; var Address: PIn6Addr;
var ScopeId: DWORD; var Port: Word): DWORD; stdcall;
RtlEthernetAddressToStringA: function (const Addr: Pointer; S: PAnsiChar): PAnsiChar; stdcall;
RtlEthernetStringToAddressA: function (const S: PAnsiChar; var Terminator: PAnsiChar;
var Addr: Pointer): DWORD; stdcall;
// load them
const
IpHlpDLL = 'IPHLPAPI.DLL';
Ntdll = 'NTDLL.DLL';
var
IpHlpModule: THandle;
NtdllModule: THandle;
function LoadIpHlp: Boolean;
implementation
function LoadIpHlp: Boolean;
begin
Result := True;
if IpHlpModule <> 0 then Exit;
// open DLL
IpHlpModule := LoadLibrary (IpHlpDLL);
if IpHlpModule = 0 then
begin
Result := false;
exit ;
end ;
GetAdaptersInfo := GetProcAddress (IpHlpModule, 'GetAdaptersInfo') ;
GetNetworkParams := GetProcAddress (IpHlpModule, 'GetNetworkParams') ;
GetTcpTable := GetProcAddress (IpHlpModule, 'GetTcpTable') ;
GetTcpStatistics := GetProcAddress (IpHlpModule, 'GetTcpStatistics') ;
GetUdpTable := GetProcAddress (IpHlpModule, 'GetUdpTable') ;
GetUdpStatistics := GetProcAddress (IpHlpModule, 'GetUdpStatistics') ;
GetIpStatistics := GetProcAddress (IpHlpModule, 'GetIpStatistics') ;
GetIpNetTable := GetProcAddress (IpHlpModule, 'GetIpNetTable') ;
GetIpAddrTable := GetProcAddress (IpHlpModule, 'GetIpAddrTable') ;
GetIpForwardTable := GetProcAddress (IpHlpModule, 'GetIpForwardTable') ;
GetIcmpStatistics := GetProcAddress (IpHlpModule, 'GetIcmpStatistics') ;
GetRTTAndHopCount := GetProcAddress (IpHlpModule, 'GetRTTAndHopCount') ;
GetIfTable := GetProcAddress (IpHlpModule, 'GetIfTable') ;
GetIfEntry := GetProcAddress (IpHlpModule, 'GetIfEntry') ;
GetFriendlyIfIndex := GetProcAddress (IpHlpModule, 'GetFriendlyIfIndex') ;
GetPerAdapterInfo := GetProcAddress (IpHlpModule, 'GetPerAdapterInfo') ;
GetAdaptersAddresses := GetProcAddress (IpHlpModule, 'GetAdaptersAddresses') ;
GetExtendedTcpTable := GetProcAddress (IpHlpModule, 'GetExtendedTcpTable') ;
GetOwnerModuleFromTcpEntry := GetProcAddress (IpHlpModule, 'GetOwnerModuleFromTcpEntry') ;
GetExtendedUdpTable := GetProcAddress (IpHlpModule, 'GetExtendedUdpTable') ;
GetOwnerModuleFromUdpEntry := GetProcAddress (IpHlpModule, 'GetOwnerModuleFromUdpEntry') ;
NotifyAddrChange := GetProcAddress (IpHlpModule, 'NotifyAddrChange') ;
NotifyRouteChange := GetProcAddress (IpHlpModule, 'NotifyRouteChange') ;
NotifyRouteChange2 := GetProcAddress (IpHlpModule, 'NotifyRouteChange2') ;
CancelIPChangeNotify := GetProcAddress (IpHlpModule, 'CancelIPChangeNotify') ;
NotifyIpInterfaceChange := GetProcAddress (IpHlpModule, 'NotifyIpInterfaceChange') ;
NotifyUnicastIpAddressChange := GetProcAddress (IpHlpModule, 'NotifyUnicastIpAddressChange') ;
CancelMibChangeNotify2 := GetProcAddress (IpHlpModule, 'CancelMibChangeNotify2') ;
GetIfTable2 := GetProcAddress (IpHlpModule, 'GetIfTable2') ;
GetIfTable2Ex := GetProcAddress (IpHlpModule, 'GetIfTable2Ex') ;
GetIfEntry2 := GetProcAddress (IpHlpModule, 'GetIfEntry2') ;
GetIpForwardTable2 := GetProcAddress (IpHlpModule, 'GetIpForwardTable2') ;
GetTcp6Table := GetProcAddress (IpHlpModule, 'GetTcp6Table') ;
GetTcpStatisticsEx := GetProcAddress (IpHlpModule, 'GetTcpStatisticsEx') ;
GetUdp6Table := GetProcAddress (IpHlpModule, 'GetUdp6Table') ;
GetUdpStatisticsEx := GetProcAddress (IpHlpModule, 'GetUdpStatisticsEx') ;
GetOwnerModuleFromTcp6Entry := GetProcAddress (IpHlpModule, 'GetOwnerModuleFromTcp6Entry') ;
GetOwnerModuleFromUdp6Entry := GetProcAddress (IpHlpModule, 'GetOwnerModuleFromUdp6Entry') ;
CreateUnicastIpAddressEntry := GetProcAddress (IpHlpModule, 'CreateUnicastIpAddressEntry') ;
DeleteUnicastIpAddressEntry := GetProcAddress (IpHlpModule, 'DeleteUnicastIpAddressEntry') ;
GetUnicastIpAddressEntry := GetProcAddress (IpHlpModule, 'GetUnicastIpAddressEntry') ;
GetUnicastIpAddressTable := GetProcAddress (IpHlpModule, 'GetUnicastIpAddressTable') ;
InitializeUnicastIpAddressEntry := GetProcAddress (IpHlpModule, 'InitializeUnicastIpAddressEntry') ;
NotifyUnicastIpAddressChange := GetProcAddress (IpHlpModule, 'NotifyUnicastIpAddressChange') ;
NotifyStableUnicastIpAddressTable := GetProcAddress (IpHlpModule, 'NotifyStableUnicastIpAddressTable') ;
SetUnicastIpAddressEntry := GetProcAddress (IpHlpModule, 'SetUnicastIpAddressEntry') ;
CreateAnycastIpAddressEntry := GetProcAddress (IpHlpModule, 'CreateAnycastIpAddressEntry') ;
DeleteAnycastIpAddressEntry := GetProcAddress (IpHlpModule, 'DeleteAnycastIpAddressEntry') ;
GetAnycastIpAddressEntry := GetProcAddress (IpHlpModule, 'GetAnycastIpAddressEntry') ;
GetAnycastIpAddressTable := GetProcAddress (IpHlpModule, 'GetAnycastIpAddressTable') ;
GetMulticastIpAddressEntry := GetProcAddress (IpHlpModule, 'GetMulticastIpAddressEntry') ;
GetMulticastIpAddressTable := GetProcAddress (IpHlpModule, 'GetMulticastIpAddressTable') ;
FreeMibTable := GetProcAddress (IpHlpModule, 'FreeMibTable') ;
ConvertInterfaceNameToLuidW := GetProcAddress (IpHlpModule, 'ConvertInterfaceNameToLuidW') ;
ConvertInterfaceLuidToNameW := GetProcAddress (IpHlpModule, 'ConvertInterfaceLuidToNameW') ;
ConvertInterfaceIndexToLuid := GetProcAddress (IpHlpModule, 'ConvertInterfaceIndexToLuid') ;
NtdllModule := LoadLibrary (Ntdll);
if NtdllModule <> 0 then
begin
RtlIpv4AddressToStringA := GetProcAddress (NtdllModule, 'RtlIpv4AddressToStringA') ;
RtlIpv4AddressToStringExA := GetProcAddress (NtdllModule, 'RtlIpv4AddressToStringExA') ;
RtlIpv4StringToAddressA := GetProcAddress (NtdllModule, 'RtlIpv4StringToAddressA') ;
RtlIpv4StringToAddressExA := GetProcAddress (NtdllModule, 'RtlIpv4StringToAddressExA') ;
RtlIpv6AddressToStringA := GetProcAddress (NtdllModule, 'RtlIpv6AddressToStringA') ;
RtlIpv6AddressToStringExA := GetProcAddress (NtdllModule, 'RtlIpv6AddressToStringExA') ;
RtlIpv6StringToAddressA := GetProcAddress (NtdllModule, 'RtlIpv6StringToAddressA') ;
RtlIpv6StringToAddressExA := GetProcAddress (NtdllModule, 'RtlIpv6StringToAddressExA') ;
RtlEthernetAddressToStringA := GetProcAddress (NtdllModule, 'RtlEthernetAddressToStringA') ;
RtlEthernetStringToAddressA := GetProcAddress (NtdllModule, 'RtlEthernetStringToAddressA') ;
end;
end;
initialization
IpHlpModule := 0 ;
NtdllModule := 0 ;
finalization
if IpHlpModule <> 0 then
begin
FreeLibrary (IpHlpModule) ;
IpHlpModule := 0 ;
end ;
if NtdllModule <> 0 then
begin
FreeLibrary (NtdllModule) ;
NtdllModule := 0 ;
end ;
end.