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();
}
}
}