/// <summary> /// MIB_IF_ROW2 Table[ANY_SIZE]; /// Because the length of the Table field is not fixed, we cannot marshal it /// directly. If we get the pointer of the MIB_IPNET_TABLE2 instance, we have /// to get the MIB_IF_ROW2 instance one by one using the pointer. /// </summary> /// <param name="pMIB_IPNET_TABLE2"> /// A pointer to a MIB_IPNET_TABLE2 structure that contains a table of neighbor /// IP address entries on the local computer. /// </param> /// <returns></returns> public static MIB_IPNET_ROW2[] GetTable(IntPtr pMIB_IPNET_TABLE2) { MIB_IPNET_ROW2[] table = null; try { // Marshal a MIB_IPNET_TABLE2 instance from the pointer. MIB_IPNET_TABLE2 mib_ipnet_table2 = (MIB_IPNET_TABLE2)Marshal.PtrToStructure( pMIB_IPNET_TABLE2, typeof(MIB_IPNET_TABLE2)); // The array length is the NumEntries. table = new MIB_IPNET_ROW2[mib_ipnet_table2.NumEntries]; // Get the start address of the MIB_IPNET_ROW2 array. IntPtr currentPointer = pMIB_IPNET_TABLE2 + 8; for (int i = 0; i < mib_ipnet_table2.NumEntries; i++) { table[i] = (MIB_IPNET_ROW2)Marshal.PtrToStructure( currentPointer, typeof(MIB_IPNET_ROW2)); currentPointer += Marshal.SizeOf(table[i]); } return(table); } catch { return(null); } }
public static bool DeleteIPNetEntry(Guid InterfaceGuid, IPAddress address) { MIB_IPNET_ROW2 row = GetRow(InterfaceGuid, address); uint result = DeleteIpNetEntry2(ref row); if (result != 0) { Trace.WriteLine("DeleteIpNetEntry"); } PrintErrorResult(result); return(!(result != 0)); }
public static PhysicalAddress ResolveIpNetEntry(Guid InterfaceGUID, IPAddress address) { MIB_IPNET_ROW2 row = GetRow(InterfaceGUID, address); uint result = ResolveIpNetEntry2(ref row, IntPtr.Zero); if (result != 0) { Trace.WriteLine("ResolveIpNetEntry"); } PrintErrorResult(result); return(new PhysicalAddress(row.PhysicalAddress)); }
public static MIB_IPNET_ROW2 GetIpNetEntry(Guid InterfaceGuid, IPAddress IpAddress) { MIB_IPNET_ROW2 Row = GetRow(InterfaceGuid, IpAddress); uint result = GetIpNetEntry2(ref Row); if (result != 0) { Trace.WriteLine("GetIpNetEntry"); } PrintErrorResult(result); return(Row); }
public static void SetIpNetEntry(Guid InterfaceGuid, PhysicalAddress oldPhysicalAddress, PhysicalAddress newPhysicalAddress) { IPAddress IPvX = IPAddress.None; uint result; result = GetIpNetTable2(ADDRESS_FAMILY.AF_UNSPEC, out IntPtr plpNetTable); foreach (MIB_IPNET_ROW2 row in GetIpNetTable) { IPvX = row.Address.si_family.Equals(ADDRESS_FAMILY.AF_INET) ? new IPAddress(row.Address.Ipv4.Address) : new IPAddress(row.Address.Ipv6.Address); if (PhysicalAddress.Parse(BitConverter.ToString(row.PhysicalAddress, 0, 6)).Equals(oldPhysicalAddress)) { MIB_IPNET_ROW2 row2 = row; row2.PhysicalAddress = newPhysicalAddress.GetAddressBytes(); if (!(SetIpNetEntry2(ref row2) != 0)) { Trace.WriteLine($"OldMac:{oldPhysicalAddress} NewMac:{newPhysicalAddress}"); } } } }
private static MIB_IPNET_ROW2 GetRow(Guid InterfaceGuid, IPAddress address) { ConvertInterfaceGuidToLuid(ref InterfaceGuid, out NET_LUID NetLUID); MIB_IPNET_ROW2 row = new MIB_IPNET_ROW2(); if (address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) { byte[] IPv4 = address.GetAddressBytes(); row.Address.Ipv4.sin_addr0 = IPv4[0]; row.Address.Ipv4.sin_addr1 = IPv4[1]; row.Address.Ipv4.sin_addr2 = IPv4[2]; row.Address.Ipv4.sin_addr3 = IPv4[3]; row.Address.Ipv4.sin_port = 0; row.Address.si_family = ADDRESS_FAMILY.AF_INET; } else if (address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6) { byte[] IPv6 = address.GetAddressBytes(); row.Address.Ipv6.sin6_addr0 = IPv6[0]; row.Address.Ipv6.sin6_addr1 = IPv6[1]; row.Address.Ipv6.sin6_addr2 = IPv6[2]; row.Address.Ipv6.sin6_addr3 = IPv6[3]; row.Address.Ipv6.sin6_addr4 = IPv6[4]; row.Address.Ipv6.sin6_addr5 = IPv6[5]; row.Address.Ipv6.sin6_addr6 = IPv6[6]; row.Address.Ipv6.sin6_addr7 = IPv6[7]; row.Address.Ipv6.sin6_addr8 = IPv6[8]; row.Address.Ipv6.sin6_addr9 = IPv6[9]; row.Address.Ipv6.sin6_addr10 = IPv6[10]; row.Address.Ipv6.sin6_addr11 = IPv6[11]; row.Address.Ipv6.sin6_addr12 = IPv6[12]; row.Address.Ipv6.sin6_addr13 = IPv6[13]; row.Address.Ipv6.sin6_addr14 = IPv6[14]; row.Address.Ipv6.sin6_addr15 = IPv6[15]; row.Address.Ipv6.sin6_port = 0; row.Address.si_family = ADDRESS_FAMILY.AF_INET6; } row.InterfaceLuid = NetLUID; return(row); }
public static bool SetIpNetEntry(Guid InterfaceGuid, PhysicalAddress macaddr, IPAddress ipaddress) { MIB_IPNET_ROW2 row = GetRow(InterfaceGuid, ipaddress); byte[] PhysicalAddr = macaddr.GetAddressBytes(); row.PhysicalAddress = new byte[32]; row.PhysicalAddressLength = 32; row.PhysicalAddress[0] = PhysicalAddr[0]; row.PhysicalAddress[1] = PhysicalAddr[1]; row.PhysicalAddress[2] = PhysicalAddr[2]; row.PhysicalAddress[3] = PhysicalAddr[3]; row.PhysicalAddress[4] = PhysicalAddr[4]; row.PhysicalAddress[5] = PhysicalAddr[5]; uint result = SetIpNetEntry2(ref row); if (result != 0) { Trace.WriteLine("SetIpNetEntry"); } PrintErrorResult(result); return(!(result != 0)); }
private static extern uint GetIpNetEntry2([In, Out] ref MIB_IPNET_ROW2 Row);
private static extern uint ResolveIpNetEntry2([In, Out] ref MIB_IPNET_ROW2 Row, [In] IntPtr SourceAddress);