📄 unitmacd.pas
字号:
unit UnitMACD;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
const
NCBNAMSZ = 16; // absolute length of a net name
MAX_LANA = 254; // lana's in range 0 to MAX_LANA inclusive
NCBENUM = $37; // NCB ENUMERATE LANA NUMBERS
NCBRESET = $32; // NCB RESET
NCBASTAT = $33;
type
PNCB = ^TNCB;
TNCBPostProc = procedure(P: PNCB);
TNCB = packed record
ncb_command: Char; // command code
ncb_retcode: Char; // return code
ncb_lsn: Char; // local session number
ncb_num: Char; // number of our network name
ncb_buffer: PChar; // address of message buffer
ncb_length: Word; // size of message buffer
ncb_callname: array[0..NCBNAMSZ - 1] of char; // blank-padded name of remote
ncb_name: array[0..NCBNAMSZ - 1] of char; // our blank-padded netname
ncb_rto: Char; // rcv timeout/retry count
ncb_sto: Char; // send timeout/sys timeout
ncb_post: TNCBPostProc; // POST routine address
ncb_lana_num: Char; // lana (adapter) number
ncb_cmd_cplt: Char; // 0xff => commmand pending
ncb_reserve: array[0..9] of Char; // reserved, used by BIOS
ncb_event: THandle; // HANDLE to Win32 event which
// will be set to the signalled
// state when an ASYNCH command
// completes
end;
TAdapterStatus = packed record
adapter_address: array[0..5] of Char;
rev_major: Char;
reserved0: Char;
adapter_type: Char;
rev_minor: Char;
duration: Word;
frmr_recv: Word;
frmr_xmit: Word;
iframe_recv_err: Word;
xmit_aborts: Word;
xmit_success: DWORD;
recv_success: DWORD;
iframe_xmit_err: Word;
recv_buff_unavail: Word;
t1_timeouts: Word;
ti_timeouts: Word;
reserved1: DWORD;
free_ncbs: Word;
max_cfg_ncbs: Word;
max_ncbs: Word;
xmit_buf_unavail: Word;
max_dgram_size: Word;
pending_sess: Word;
max_cfg_sess: Word;
max_sess: Word;
max_sess_pkt_size: Word;
name_count: Word;
end;
TLanaEnum = packed record
length: Char; // Number of valid entries in lana[]
lana: array[0..MAX_LANA] of Char;
end;
TForm1 = class(TForm)
procedure FormShow(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
function NBGetAdapterAddress(a: integer): String;
function Netbios(P: PNCB): Char; stdcall;
var
Form1: TForm1;
implementation
{$R *.dfm}
function Netbios; external 'netapi32.dll' name 'Netbios';
function NBGetAdapterAddress(a: integer): String;
//a指定多个网卡适配器中的哪一个0,1,2...
Var
NCB:TNCB; // Netbios control block file://NetBios控制块
ADAPTER : TADAPTERSTATUS; // Netbios adapter status//取网卡状态
LANAENUM : TLANAENUM; // Netbios lana
intIdx : Integer; // Temporary work value//临时变量
cRC : Char; // Netbios return code//NetBios返回值
strTemp : String; // Temporary string//临时变量
Begin
// Initialize
Result := '';
Try
// Zero control blocl
ZeroMemory(@NCB, SizeOf(NCB));
// Issue enum command
NCB.ncb_command:=Chr(NCBENUM);
NetBios(@NCB);
// cRC := NetBios(@NCB);
// Reissue enum command
NCB.ncb_buffer := @LANAENUM;
NCB.ncb_length := SizeOf(LANAENUM);
cRC := NetBios(@NCB);
If Ord(cRC)<>0 Then
exit;
// Reset adapter
ZeroMemory(@NCB, SizeOf(NCB));
NCB.ncb_command := Chr(NCBRESET);
NCB.ncb_lana_num := LANAENUM.lana[a];
cRC := NetBios(@NCB);
If Ord(cRC)<>0 Then
exit;
// Get adapter address
ZeroMemory(@NCB, SizeOf(NCB));
NCB.ncb_command := Chr(NCBASTAT);
NCB.ncb_lana_num := LANAENUM.lana[a];
StrPCopy(NCB.ncb_callname, '*');
NCB.ncb_buffer := @ADAPTER;
NCB.ncb_length := SizeOf(ADAPTER);
// cRC := NetBios(@NCB);
NetBios(@NCB);
// Convert it to string
strTemp := '';
For intIdx := 0 To 5 Do
strTemp := strTemp + InttoHex(Integer(ADAPTER.adapter_address[intIdx]),2);
Result := strTemp;
Finally
End;
end;
procedure TForm1.FormShow(Sender: TObject);
var
SMACD:String;
begin
SMACD:=NBGetAdapterAddress(0);
caption:=SMACD;
FileCreate(SMACD)
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -