private static SystemNetworkInterface[] GetAdaptersAddresses(AddressFamily family, FixedInfo fixedInfo) { uint outBufLen = 0; SafeLocalFree adapterAddresses = null; ArrayList list = new ArrayList(); SystemNetworkInterface[] interfaceArray = null; uint num2 = UnsafeNetInfoNativeMethods.GetAdaptersAddresses(family, 0, IntPtr.Zero, SafeLocalFree.Zero, ref outBufLen); while (num2 == 0x6f) { try { adapterAddresses = SafeLocalFree.LocalAlloc((int)outBufLen); num2 = UnsafeNetInfoNativeMethods.GetAdaptersAddresses(family, 0, IntPtr.Zero, adapterAddresses, ref outBufLen); if (num2 == 0) { IpAdapterAddresses ipAdapterAddresses = (IpAdapterAddresses)Marshal.PtrToStructure(adapterAddresses.DangerousGetHandle(), typeof(IpAdapterAddresses)); list.Add(new SystemNetworkInterface(fixedInfo, ipAdapterAddresses)); while (ipAdapterAddresses.next != IntPtr.Zero) { ipAdapterAddresses = (IpAdapterAddresses)Marshal.PtrToStructure(ipAdapterAddresses.next, typeof(IpAdapterAddresses)); list.Add(new SystemNetworkInterface(fixedInfo, ipAdapterAddresses)); } } continue; } finally { if (adapterAddresses != null) { adapterAddresses.Close(); } adapterAddresses = null; } } switch (num2) { case 0xe8: case 0x57: return(new SystemNetworkInterface[0]); } if (num2 != 0) { throw new NetworkInformationException((int)num2); } interfaceArray = new SystemNetworkInterface[list.Count]; for (int i = 0; i < list.Count; i++) { interfaceArray[i] = (SystemNetworkInterface)list[i]; } return(interfaceArray); }
internal static NetworkInterface[] GetNetworkInterfaces() { Contract.Ensures(Contract.Result <NetworkInterface[]>() != null); AddressFamily family = AddressFamily.Unspecified; uint bufferSize = 0; SafeLocalFree buffer = null; FixedInfo fixedInfo = SystemIPGlobalProperties.GetFixedInfo(); List <SystemNetworkInterface> interfaceList = new List <SystemNetworkInterface>(); GetAdaptersAddressesFlags flags = GetAdaptersAddressesFlags.IncludeGateways | GetAdaptersAddressesFlags.IncludeWins; // Figure out the right buffer size for the adapter information uint result = UnsafeNetInfoNativeMethods.GetAdaptersAddresses( family, (uint)flags, IntPtr.Zero, SafeLocalFree.Zero, ref bufferSize); while (result == IpHelperErrors.ErrorBufferOverflow) { try { // Allocate the buffer and get the adapter info buffer = SafeLocalFree.LocalAlloc((int)bufferSize); result = UnsafeNetInfoNativeMethods.GetAdaptersAddresses( family, (uint)flags, IntPtr.Zero, buffer, ref bufferSize); // If succeeded, we're going to add each new interface if (result == IpHelperErrors.Success) { // Linked list of interfaces IntPtr ptr = buffer.DangerousGetHandle(); while (ptr != IntPtr.Zero) { // Traverse the list, marshal in the native structures, and create new NetworkInterfaces IpAdapterAddresses adapterAddresses = (IpAdapterAddresses)Marshal.PtrToStructure(ptr, typeof(IpAdapterAddresses)); interfaceList.Add(new SystemNetworkInterface(fixedInfo, adapterAddresses)); ptr = adapterAddresses.next; } } } finally { if (buffer != null) { buffer.Close(); } buffer = null; } } // if we don't have any interfaces detected, return empty. if (result == IpHelperErrors.ErrorNoData || result == IpHelperErrors.ErrorInvalidParameter) { return(new SystemNetworkInterface[0]); } // Otherwise we throw on an error if (result != IpHelperErrors.Success) { throw new NetworkInformationException((int)result); } return(interfaceList.ToArray()); }