unit MACAddress;
interface
uses SysUtils;
type
TMACAddress = packed array[0..5] of Byte;
ENetBiosError = class(Exception);
function LanAdapterCount : Integer;
function GetMacAddress(AdapterNum: Integer):TMACAddress;
implementation
uses NB30, Windows;
resourcestring
sNetBiosError = 'NetBIOS error %d';
type
TAStat = record
Adapt : TAdapterStatus;
NameBuff : array[0..30] of TNameBuffer;
end;
function LanAdapterCount : Integer;
var
Ncb : TNCB;
uRetCode : Char;
lEnum : TLanaEnum;
begin
FillChar( NCB, SizeOf(NCB), 0 );
with NCB do begin
ncb_command := Char( NCBENUM );
ncb_buffer := @lEnum;
ncb_length := SizeOf(lEnum);
end;
uRetCode := Netbios( @Ncb );
if uRetCode <> #0 then
raise Exception.CreateFmt( sNetBIOSError,
[Ord(uRetCode)]);
Result := Ord(lenum.length);
end;
function GetMacAddress(AdapterNum:Integer):TMACAddress;
var
Ncb : TNCB;
uRetCode : Char;
J : Integer;
Adapter : TAStat;
begin
FillChar( NCB, SizeOf(NCB), 0 );
with NCB do begin
ncb_command := Char(NCBRESET);
ncb_lana_num := Char( AdapterNum );
end;
uRetCode := Netbios( @Ncb );
if uRetCode <> #0 then
raise Exception.CreateFmt(sNetBIOSError,
[Ord(uRetCode)]);
FillChar( NCB, SizeOf(NCB), 0 );
with NCB do begin
ncb_command := Char(NCBASTAT);
ncb_lana_num := Char( AdapterNum );
StrCopy( ncb_callname, '* ' );
ncb_buffer := @Adapter;
ncb_length := sizeof(Adapter);
end;
uRetCode := Netbios( @Ncb );
if uRetCode <> #0 then
raise Exception.CreateFmt(sNetBIOSError,
[Ord(uRetCode)]);
for J := 0 to 5 do
Result[J] := Ord( Adapter.Adapt.Adapter_address[J]);
end;