做好的程序員一如做人。多看多想或許他山之石可以攻玉,但永遠不要成為代碼的奴隸。 CKER
原著:Borland
Translated by CKER
第一種方法使用Microsoft的Netbios API。 這是一套通過Winsock提供底層網絡支持的命令。使用Netbios的最大缺點是您必須在系統中安裝了Netbios服務(如果您在windows網絡中啟用了文件共享的話,這就不是問題了)。除此此外,這種方法又快又准確。
Netbios API只包括了一個函數,就叫做Netbios。這個函數使用網絡控制塊(network control block)結構作為參數,這個結構告訴函數要做什麼。結構的定義如下:
typedef struct _NCB {
UCHAR ncb_command;
UCHAR ncb_retcode;
UCHAR ncb_lsn;
UCHAR ncb_num;
PUCHAR ncb_buffer;
WORD ncb_length;
UCHAR ncb_callname[NCBNAMSZ];
UCHAR ncb_name[NCBNAMSZ];
UCHAR ncb_rto;
UCHAR ncb_sto;
void (CALLBACK *ncb_post) (struct _NCB *);
UCHAR ncb_lana_num;
UCHAR ncb_cmd_cplt;
#ifdef _WIN64
UCHAR ncb_reserve[18];
#else
UCHAR ncb_reserve[10];
#endif
HANDLE ncb_event;
} NCB, *PNCB;
重點在於ncb_command 成員。這個成員告訴Netbios該作什麼。我們使用三個命令來探測MAC地址。他們在MSDN的定義如下:
命令描述:
NCBENUM Windows NT/2000: 列舉系統中網卡的數量。使用此命令後,ncb_buffer成員指向由LANA_ENUM結構填充的緩沖區。
NCBENUM 不是標准的 NetBIOS 3.0 命令。
NCBRESET 重置網卡。網卡在接受新的NCB命令之前必須重置。
NCBASTAT 接受本地或遠程接口卡的狀態。使用此命令後,ncb_buffer成員指向由ADAPTER_STATUS結構填充的緩沖區,隨後是NAME_BUFFER結構的數組。
下面就是取得您系統MAC地址的步驟:
1》列舉所有的接口卡。
2》重置每塊卡以取得它的正確信息。
3》查詢接口卡,取得MAC地址並生成標准的冒號分隔格式。