コード例 #1
0
ファイル: MIB_IPNET_TABLE2.cs プロジェクト: QCX51/Hotspot
        /// <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);
            }
        }
コード例 #2
0
        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));
        }
コード例 #3
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));
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        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}");
                    }
                }
            }
        }
コード例 #6
0
        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);
        }
コード例 #7
0
        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));
        }
コード例 #8
0
 private static extern uint GetIpNetEntry2([In, Out] ref MIB_IPNET_ROW2 Row);
コード例 #9
0
 private static extern uint ResolveIpNetEntry2([In, Out] ref MIB_IPNET_ROW2 Row, [In] IntPtr SourceAddress);