using System; using System.ComponentModel; using System.Runtime.InteropServices; using Vanara.InteropServices; namespace Vanara.PInvoke { public static partial class IpHlpApi { /// /// The MIB_IFROW structure stores information about a particular interface. /// /// /// /// The dwSpeed member of the MIB_IFROW structure will be incorrect for very high-speed network interfaces (10 Gbit/s /// network adapter, for example) since the maximum value that can be store in a DWORD is 4,294,967,295. Applications should use the /// MIB_IF_ROW2 structure returned by the GetIfEntry2 and GetIfTable2functions or the IP_ADAPTER_ADDRESSES structure returned by the /// GetAdaptersAddressesfunction for determining the speed for very high-speed network interfaces. /// /// /// On the Microsoft Windows Software Development Kit (SDK) released for Windows Vista and later, the organization of header files /// has changed and the MIB_IFROW structure is defined in the Ifmib.h header file not in the Iprtrmib.h header file. Note that /// the Ifmib.h header file is automatically included in Iprtrmib.h which is automatically included in the Iphlpapi.h header file. /// The Ifmib.h and Iprtrmib.h header files should never be used directly. /// /// // https://docs.microsoft.com/en-us/windows/desktop/api/ifmib/ns-ifmib-_mib_ifrow typedef struct _MIB_IFROW { WCHAR // wszName[MAX_INTERFACE_NAME_LEN]; IF_INDEX dwIndex; IFTYPE dwType; DWORD dwMtu; DWORD dwSpeed; DWORD dwPhysAddrLen; UCHAR // bPhysAddr[MAXLEN_PHYSADDR]; DWORD dwAdminStatus; INTERNAL_IF_OPER_STATUS dwOperStatus; DWORD 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; UCHAR // bDescr[MAXLEN_IFDESCR]; } MIB_IFROW, *PMIB_IFROW; [PInvokeData("ifmib.h", MSDNShortId = "b08631e9-6036-4377-b2f2-4ea899acb787")] [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] public struct MIB_IFROW { /// /// Type: WCHAR[MAX_INTERFACE_NAME_LEN] /// A pointer to a Unicode string that contains the name of the interface. /// [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_INTERFACE_NAME_LEN)] public string wszName; /// /// Type: DWORD /// /// The index that identifies the interface. This index value may change when a network adapter is disabled and then enabled, and /// should not be considered persistent. /// /// public uint dwIndex; /// /// Type: DWORD /// /// The interface type as defined by the Internet Assigned Names Authority (IANA). For more information, see /// http://www.iana.org/assignments/ianaiftype-mib. Possible values for the interface type are listed in the Ipifcons.h header file. /// /// The table below lists common values for the interface type although many other values are possible. /// /// /// Value /// Meaning /// /// /// IF_TYPE_OTHER 1 /// Some other type of network interface. /// /// /// IF_TYPE_ETHERNET_CSMACD 6 /// An Ethernet network interface. /// /// /// IF_TYPE_ISO88025_TOKENRING 9 /// A token ring network interface. /// /// /// IF_TYPE_FDDI 15 /// A Fiber Distributed Data Interface (FDDI) network interface. /// /// /// IF_TYPE_PPP 23 /// A PPP network interface. /// /// /// IF_TYPE_SOFTWARE_LOOPBACK 24 /// A software loopback network interface. /// /// /// IF_TYPE_ATM 37 /// An ATM network interface. /// /// /// IF_TYPE_IEEE80211 71 /// An IEEE 802.11 wireless network interface. /// /// /// IF_TYPE_TUNNEL 131 /// A tunnel type encapsulation network interface. /// /// /// IF_TYPE_IEEE1394 144 /// An IEEE 1394 (Firewire) high performance serial bus network interface. /// /// /// IF_TYPE_IEEE80216_WMAN 237 /// A mobile broadband interface for WiMax devices. /// /// /// IF_TYPE_WWANPP 243 /// A mobile broadband interface for GSM-based devices. /// /// /// IF_TYPE_WWANPP2 244 /// An mobile broadband interface for CDMA-based devices. /// /// /// public uint dwType; /// /// Type: DWORD /// The Maximum Transmission Unit (MTU) size in bytes. /// public uint dwMtu; /// /// Type: DWORD /// The speed of the interface in bits per second. /// public uint dwSpeed; /// /// Type: DWORD /// The length, in bytes, of the physical address specified by the bPhysAddr member. /// public uint dwPhysAddrLen; /// /// Type: BYTE[MAXLEN_PHYSADDR] /// The physical address of the adapter for this interface. /// [MarshalAs(UnmanagedType.ByValArray, SizeConst = MAXLEN_PHYSADDR)] public byte[] bPhysAddr; /// /// Type: DWORD /// The interface is administratively enabled or disabled. /// public uint dwAdminStatus; /// /// Type: DWORD /// /// The operational status of the interface. This member can be one of the following values defined in the /// INTERNAL_IF_OPER_STATUS enumeration defined in the Ipifcons.h header file. /// /// /// /// Value /// Meaning /// /// /// IF_OPER_STATUS_NON_OPERATIONAL /// LAN adapter has been disabled, for example because of an address conflict. /// /// /// IF_OPER_STATUS_UNREACHABLE /// WAN adapter that is not connected. /// /// /// IF_OPER_STATUS_DISCONNECTED /// For LAN adapters: network cable disconnected. For WAN adapters: no carrier. /// /// /// IF_OPER_STATUS_CONNECTING /// WAN adapter that is in the process of connecting. /// /// /// IF_OPER_STATUS_CONNECTED /// WAN adapter that is connected to a remote peer. /// /// /// IF_OPER_STATUS_OPERATIONAL /// Default status for LAN adapters /// /// /// public uint dwOperStatus; /// /// Type: DWORD /// /// The length of time, in hundredths of seconds (10^-2 sec), starting from the last computer restart, when the interface entered /// its current operational state. This value rolls over after 2^32 hundredths of a second. /// /// /// The dwLastChange member is not currently supported by NDIS. On Windows Vista and later, NDIS returns zero for this /// member. On earlier versions of Windows, an arbitrary value is returned in this member for the interfaces supported by NDIS. /// For interfaces supported by other interface providers, they might return an appropriate value. /// /// public uint dwLastChange; /// /// Type: DWORD /// The number of octets of data received through this interface. /// public uint dwInOctets; /// /// Type: DWORD /// The number of unicast packets received through this interface. /// public uint dwInUcastPkts; /// /// Type: DWORD /// The number of non-unicast packets received through this interface. Broadcast and multicast packets are included. /// public uint dwInNUcastPkts; /// /// Type: DWORD /// The number of incoming packets that were discarded even though they did not have errors. /// public uint dwInDiscards; /// /// Type: DWORD /// The number of incoming packets that were discarded because of errors. /// public uint dwInErrors; /// /// Type: DWORD /// The number of incoming packets that were discarded because the protocol was unknown. /// public uint dwInUnknownProtos; /// /// Type: DWORD /// The number of octets of data sent through this interface. /// public uint dwOutOctets; /// /// Type: DWORD /// The number of unicast packets sent through this interface. /// public uint dwOutUcastPkts; /// /// Type: DWORD /// The number of non-unicast packets sent through this interface. Broadcast and multicast packets are included. /// public uint dwOutNUcastPkts; /// /// Type: DWORD /// The number of outgoing packets that were discarded even though they did not have errors. /// public uint dwOutDiscards; /// /// Type: DWORD /// The number of outgoing packets that were discarded because of errors. /// public uint dwOutErrors; /// /// Type: DWORD /// The transmit queue length. This field is not currently used. /// public uint dwOutQLen; /// /// Type: DWORD /// The length, in bytes, of the bDescr member. /// public uint dwDescrLen; /// /// Type: BYTE[MAXLEN_IFDESCR] /// A description of the interface. /// [MarshalAs(UnmanagedType.ByValArray, SizeConst = MAXLEN_IFDESCR)] public byte[] bDescr; /// Initializes a new instance of the struct. /// /// The index that identifies the interface. This index value may change when a network adapter is disabled and then enabled, and /// should not be considered persistent. /// public MIB_IFROW(uint ifIndex) : this() { dwIndex = ifIndex; } } /// /// The MIB_IFTABLE structure contains a table of interface entries. /// /// /// /// The GetIfTable function enumerates the interface entries on a local system and returns this information in a MIB_IFTABLE structure. /// /// /// The MIB_IFTABLE structure may contain padding for alignment between the dwNumEntries member and the first MIB_IFROW /// array entry in the table member. Padding for alignment may also be present between the MIB_IFROW array entries in /// the table member. Any access to a MIB_IFROW array entry should assume padding may exist. /// /// /// On the Microsoft Windows Software Development Kit (SDK) released for Windows Vista and later, the organization of header files /// has changed and the MIB_IFTABLE structure is defined in the Ifmib.h header file not in the Iprtrmib.h header file. Note /// that the Ifmib.h header file is automatically included in Ipmib.h header file. This file is automatically included in the /// Iprtrmib.h header file which is automatically included in the Iphlpapi.h header file. The Ifmib.h header file should never be /// used directly. /// /// // https://docs.microsoft.com/en-us/previous-versions/windows/desktop/api/ifmib/ns-ifmib-_mib_iftable typedef struct _MIB_IFTABLE { // DWORD dwNumEntries; MIB_IFROW table[ANY_SIZE]; } MIB_IFTABLE, *PMIB_IFTABLE; [PInvokeData("ifmib.h", MSDNShortId = "7c3ca3d0-b6fe-4e1c-858f-82ffb26622e7")] [CorrespondingType(typeof(MIB_IFROW))] [DefaultProperty(nameof(table))] public class MIB_IFTABLE : SafeElementArray { /// Initializes a new instance of the class. /// Amount of space, in bytes, to reserve. public MIB_IFTABLE(uint byteSize) : base((int)byteSize, 0) { } /// /// The number of interface entries in the array. /// public uint dwNumEntries => Count; /// /// An array of MIB_IFROW structures containing interface entries. /// public MIB_IFROW[] table { get => Elements; set => Elements = value; } /// Performs an implicit conversion from to . /// The MIB_IFTABLE instance. /// The result of the conversion. public static implicit operator IntPtr(MIB_IFTABLE table) => table.DangerousGetHandle(); } } }