1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
|
unit MAC;
interface
uses
Windows, SysUtils;
const
MAX_INTERFACE_NAME_LEN = 256;
MAXLEN_PHYSADDR = 8;
MAXLEN_IFDESCR = 256;
MAX_ADAPTER_ADDRESS_LENGTH = 8;
ANY_SIZE = 1;
type
TMacAddress = array[1..MAX_ADAPTER_ADDRESS_LENGTH] of byte;
PTMibIfRow = ^TMibIfRow;
TMibIfRow = packed record
wszName: array[1..MAX_INTERFACE_NAME_LEN] of WCHAR;
dwIndex: DWORD;
dwType: DWORD;
dwMTU: DWORD;
dwSpeed: DWORD;
dwPhysAddrLen: DWORD;
bPhysAddr: array[1..MAXLEN_PHYSADDR] of byte;
dwAdminStatus: DWORD;
dwOperStatus: DWORD;
dwLastChange: DWORD;
dwInOctets: DWORD;
dwInUcastPkts: DWORD;
dwInNUCastPkts: DWORD;
dwInDiscards: DWORD;
dwInErrors: DWORD;
dwInUnknownProtos: DWORD;
dwOutOctets: DWORD;
dwOutUCastPkts: DWORD;
dwOutNUCastPkts: DWORD;
dwOutDiscards: DWORD;
dwOutErrors: DWORD;
dwOutQLen: DWORD;
dwDescrLen: DWORD;
bDescr: array[1..MAXLEN_IFDESCR] of char; //byte;
end;
TMIBIfArray = array of TMIBIFRow;
PTMibIfTable = ^TMIBIfTable;
TMibIfTable = packed record
dwNumEntries: DWORD;
Table: array[0..ANY_SIZE - 1] of TMibIfRow;
end;
function GetIfTable(pIfTable: PTMibIfTable; pdwSize: PULONG;
bOrder: boolean ): DWORD; stdcall; external 'IPHLPAPI.DLL';
function GetMac(No: Integer): String;
function NbMac: Integer;
implementation
//------------------------------------------------------------------------------
function MacAddr2Str(MacAddr: TMacAddress; size: integer): string;
var
i: integer;
begin
if Size = 0 then
begin
Result := '00-00-00-00-00-00';
Exit;
end
else Result := '';
//
for i := 1 to Size do
Result := Result + IntToHex(MacAddr[i], 2) + '-';
Delete(Result, Length(Result), 1);
end;
//------------------------------------------------------------------------------
procedure Get_IfTableMIB( var MIBIfArray: TMIBIfArray );
var
i, Error, TableSize: integer;
pBuf: PChar;
NumEntries: DWORD;
begin
TableSize := 0;
pBuf := '';
NumEntries := 0;
// first call: get memsize needed
Error := GetIfTable(PTMibIfTable(pBuf), @TableSize, false );
if Error <> ERROR_INSUFFICIENT_BUFFER then
EXIT;
GetMem(pBuf, TableSize);
// get table pointer
Error := GetIfTable(PTMibIfTable(pBuf), @TableSize, false);
if Error = NO_ERROR then
begin
NumEntries := PTMibIfTable(pBuf)^.dwNumEntries;
if NumEntries > 0 then
begin
SetLength(MIBIfArray, NumEntries);
inc(pBuf, SizeOf(NumEntries));
for i := 0 to pred(NumEntries) do
begin
MIBIfArray[i] := PTMibIfRow(pBuf)^;
inc(pBuf, SizeOf(TMIBIfRow));
end;
end
end;
dec(pBuf, SizeOf(DWORD) + NumEntries * SizeOf(TMIBIfRow));
FreeMem(pBuf);
end;
//------------------------------------------------------------------------------
function NbMac: Integer;
var
MibArr: TMibIfArray;
begin
Get_IfTableMIB(MibArr);
result := High(MIBArr);
end;
//------------------------------------------------------------------------------
function GetMac(No: Integer): String;
var
MibArr: TMibIfArray;
begin
Get_IfTableMIB(MibArr);
result := MacAddr2Str(TMacAddress(MIBArr[No].bPhysAddr), MIBArr[No].dwPhysAddrLen);
end;
//------------------------------------------------------------------------------
end. |
Partager