Private Const MAX_ADAPTER_NAME_LENGTH As Int32 = 256
Private Const MAX_ADAPTER_DESCRIPTION_LENGTH As Int32 = 128
Private Const MAX_ADAPTER_ADDRESS_LENGTH As Int32 = 8
<DllImport("iphlpapi.dll", EntryPoint:="GetAdaptersInfo", CharSet:=CharSet.Ansi)> _
Private Shared Function GetAdaptersInfo( _
ByVal pAdapterInfo As IntPtr, _
ByRef pBufOutLen As UInt64) As Int32
End Function
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi)> _
Private Structure IP_ADAPTER_INFO
Dim [Next] As IntPtr
Dim ComboIndex As Int32
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=(MAX_ADAPTER_NAME_LENGTH + 4))> _
Dim AdapterName As String
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=(MAX_ADAPTER_DESCRIPTION_LENGTH + 4))> _
Dim Description As String
Dim AddressLength As UInt32
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=(MAX_ADAPTER_ADDRESS_LENGTH))> _
Dim Address() As Byte
Dim Index As Int32
Dim Type As UInt32
Dim DhcpEnabled As UInt32
Dim CurrentIpAddress As IP_ADDRESS_STRING
Dim IpAddressList As IP_ADDRESS_STRING
Dim GatewayList As IP_ADDRESS_STRING
Dim DhcpServer As IP_ADDRESS_STRING
Dim HaveWins As Boolean
Dim PrimaryWinsServer As IP_ADDRESS_STRING
Dim SecondaryWinsServer As IP_ADDRESS_STRING
Dim LeaseObtained As Int32
Dim LeaseExpires As Int32
End Structure
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi)> _
Private Structure IP_ADDRESS_STRING
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=(4 * 4))> _
Dim value As String
End Structure
Public Sub GetAdapters()
Dim structSize As Int32 = Marshal.SizeOf(GetType(IP_ADAPTER_INFO))
Dim pArray As IntPtr = Marshal.AllocHGlobal(structSize)
Dim len As UInt64 = Convert.ToUInt64(structSize)
Dim ret As Int32 = GetAdaptersInfo(pArray, len)
If ret = 111 Then
' Buffer was too small, reallocate the correct size for the buffer.
pArray = Marshal.ReAllocHGlobal(pArray, New IntPtr(Convert.ToInt64(len)))
ret = GetAdaptersInfo(pArray, len)
End If
If ret = 0 Then
' Call succeeded
Dim pEntry As IntPtr = pArray
Do
' Retrieve the adapter info from the memory address.
Dim Entry As IP_ADAPTER_INFO = CType(Marshal.PtrToStructure(pEntry, GetType(IP_ADAPTER_INFO)), IP_ADAPTER_INFO)
pEntry = Entry.Next
Loop Until IntPtr.op_Equality(pEntry, IntPtr.Zero)
End If
Marshal.FreeHGlobal(pArray)
End Sub