как можно вывести arp таблицу в файл либо в memo, и тд
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,commctrl;
const
IPHLPAPI = 'IPHLPAPI.DLL';
MAX_ADAPTER_ADDRESS_LENGTH = 8;
type
TMacAddress = array[0..MAX_ADAPTER_ADDRESS_LENGTH - 1] of Byte;
PMibIPNetRow = ^TMibIPNetRow;
TMibIPNetRow = packed record
dwIndex : DWORD;
dwPhysAddrLen : DWORD;
bPhysAddr : TMACAddress;
dwAddr : DWORD;
dwType : DWORD;
end;
PMibIPNetTable = ^TMibIPNetTable;
TMibIPNetTable = packed record
dwNumEntries : DWORD;
Table: PMibIPNetRow;
end;
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{$APPTYPE CONSOLE}
function GetIpNetTable(pIpNetTable: PMibIPNetTable;
pdwSize: PULONG; bOrder: Boolean): DWORD; stdcall; external IPHLPAPI;
function GetMAC(const Value: TMacAddress; const Length: DWORD): String;
var
I: Integer;
begin
// IP адрес представляет из себя 8 байт (2 байта зарезервированно)
// Извлекаем каждый байт и преобразуем его в строку
if Length = 0 then Result := '00-00-00-00-00-00' else
begin
Result := '';
for i:= 0 to Length -2 do
Result := Result + IntToHex(Value[i], 2) + '-';
Result := Result + IntToHex(Value[Length-1], 2);
end;
end;
function GetDottedIPFromInAddr(const InAddr: Integer): String;
begin
// IP адрес представляет из себя 4 байта расположенных в обратном порядке
// Извлекаем каждый байт и преобразуем его в строку
Result := '';
Result := IntToStr(FOURTH_IPADDRESS(InAddr));
Result := Result + '.' + IntToStr(THIRD_IPADDRESS(InAddr));
Result := Result + '.' + IntToStr(SECOND_IPADDRESS(InAddr));
Result := Result + '.' + IntToStr(FIRST_IPADDRESS(InAddr));
end;
function GetType(const dwType: DWORD): String;
begin
// Константы типов записи описаны в MSDN
case dwType of
1: Result := 'Other';
2: Result := 'Invalid';
3: Result := 'Dynamic';
4: Result := 'Static';
end;
end;
var
MibIPNetTable: PMibIPNetTable;
MibIPNetRow: PMibIPNetRow;
pdwSize: ULONG;
I: Integer;
InternetAddress, PhysicalAddress, AType: String;
begin
// Первоначально узнаем необходимый размер под буффер для функции
// Для этого первым параметром передаем NIL, во второй параметр
// вернется результат в случае если код ошибки будет ERROR_INSUFFICIENT_BUFFER
if GetIpNetTable(nil, @pdwSize, False) = ERROR_INSUFFICIENT_BUFFER then
begin
// Выделяем необходимый буффер
GetMem(MibIPNetTable, pdwSize);
try
// Выполняем функцию уже с буффером - результат должен быть NO_ERROR
if GetIpNetTable(MibIPNetTable, @pdwSize, False) = NO_ERROR then
begin
// Получаем адрес начала массива записей TMibIPNetRow
// (4 байта от начала самой структуры)
MibIPNetRow := Pointer(DWORD(MibIPNetTable) + SizeOf(DWORD));
Writeln(' Internet Address Physical Address Type');
// Крутим цикл по всем записям, кол-во записей в dwNumEntries
for I := 0 to MibIPNetTable^.dwNumEntries - 1 do
begin
// Получаем IP адрес
InternetAddress := GetDottedIPFromInAddr(MibIPNetRow^.dwAddr);
// Получаем МАС адрес
PhysicalAddress :=
GetMAC(MibIPNetRow^.bPhysAddr, MibIPNetRow^.dwPhysAddrLen);
// Получаем тип записи
AType := GetType(MibIPNetRow^.dwType);
// Выводим на экран
Writeln(Format(' %-16s %17s %s',
[InternetAddress, PhysicalAddress, AType]));
// Переходим к следующей записи
Inc(MibIPNetRow);
end;
end;
finally
// Освобождаем занятый буффер
FreeMem(MibIPNetTable);
end;
end;
Readln;
end.
end.
не могу никак вывести это либо в файл либо в memo listbox и тд