IpHlpApi.dll: удаление записи ARP с помощью DeleteIpNetEntry путем передачи MIB_IPNETROW

Согласно информации, которую я нашел, я использую структуру MIB_IPNETROW при обработке моей программы редактирования ARP:

const int MAXLEN_PHYSADDR = 8;
const int ERROR_INSUFFICIENT_BUFFER = 122;


[StructLayout(LayoutKind.Sequential)]
private struct MIB_IPNETROW
{
    [MarshalAs(UnmanagedType.U4)]
    public int dwIndex;
    [MarshalAs(UnmanagedType.U4)]
    public int dwPhysAddrLen;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst =
    MAXLEN_PHYSADDR)]
    public byte[] bPhysAddr;
    [MarshalAs(UnmanagedType.U4)]
    public int dwAddr;
    [MarshalAs(UnmanagedType.U4)]
    public int dwType;
}

И это нормально, когда я получаю таблицу ARP через функцию GetIpNetTable(), но проблема заключается в GetIpNetTable(), который выдает System.AccessViolationException: 'Попытка чтения или записи защищенной памяти. Часто это указывает на то, что другая память повреждена».

Вот код метода (ArpRow просто содержит некоторые поля, например адреса):

public static void DeleteArpNote(ArpRow toDel)
    {
        MIB_IPNETROW pArpEntry = new MIB_IPNETROW();
        pArpEntry.dwPhysAddrLen = 0;
        pArpEntry.dwIndex = toDel.index;
        pArpEntry.dwAddr = BitConverter.ToInt32(toDel.ipAddress.GetAddressBytes(), 0);
        pArpEntry.bPhysAddr = toDel.macAddress.GetAddressBytes();
        pArpEntry.dwType = toDel.type;

        DeleteIpNetEntry(pArpEntry);
    }

person Ivan Borisenko    schedule 25.05.2017    source источник