admin管理员组

文章数量:1530987

2024年7月30日发(作者:)

Windows中获取MAC地址的几种方法

(DDK)通过驱动程序获取MAC地址

ndis规范中说明,网卡驱动程序支持ioctl_ndis_query_stats接口

参数如下:

OID_802_3_PERMANENT_ADDRESS :物理地址

OID_802_3_CURRENT_ADDRESS :mac地址

于是我们的方法就得到了。

首先,看看注册表,找一找网卡有几块,分别是什么设备名。

具体位置和os有关,2000下在hlmsoftwaremicrosoftwindows ntcurrent

versionnetworkcards。

然后createfile(devicename,...)注意,要用linkname,因此

还要加上"////.//device//".

接着

deviceiocontrol(hmac,IOCTL_NDIS_QUERY_STATS,

OID_802_3_PERMANENT_ADDRESS/OID_802_3_)

具体的情况可以参看ddk下的

OID_802_3_CURRENT_ADDRESS条目

-2得到MAC (MSDN推荐方法)

#include

//#include

#include

#include

#include

typedef struct _ASTAT_

{

ADAPTER_STATUS adapt;

NAME_BUFFER NameBuff [30];

}ASTAT, * PASTAT;

ASTAT Adapter;

int main (void)

{

NCB Ncb;

UCHAR uRetCode;

char NetName[50];

LANA_ENUM lenum;

int i;

memset( &Ncb, 0, sizeof(Ncb) );

_command = NCBENUM;

_buffer = (UCHAR *)&lenum;

_length = sizeof(lenum);

uRetCode = Netbios( &Ncb );

printf( "The NCBENUM return code is: 0x%x n", uRetCode );

for(i=0; i < ;i++)

{

memset( &Ncb, 0, sizeof(Ncb) );

_command = NCBRESET;

_lana_num = ;

uRetCode = Netbios( &Ncb );

printf( "The NCBRESET on LANA %d return code is: 0x%x n",

, uRetCode );

memset( &Ncb, 0, sizeof (Ncb) );

_command = NCBASTAT;

_lana_num = ;

strcpy( _callname, "* " );

_buffer = (char *) &Adapter;

_length = sizeof(Adapter);

uRetCode = Netbios( &Ncb );

printf( "The NCBASTAT on LANA %d return code is: 0x%x n",

, uRetCode );

if ( uRetCode == 0 )

{

printf( "The Ethernet Number on LANA

is:%02x%02x%02x%02x%02x%02xn",

,

r_address[0],

r_address[1],

r_address[2],

r_address[3],

%d

r_address[4],

r_address[5] );

}

}

}

3.用COM API获取网卡MAC地址

这种方法使用COM API创建一个GUID(全局唯一标识符)并从那里继承MAC地址。

GUID通常用来标识COM组件以及系统中的其他对象。它们是由MAC地址(结合其他东

西)计算得来的,表面上MAC地址就包含在其中。

我说表面上是因为事实上并没有包含。我提供这种方法更多的是为了作为反面教材。您

也许用这种方法能够得到MAC地址,但

有时候您只会得到随机的十六进制数值。下面的例子十分简单,无需多讲。我们使用

CoCreateGuid创建GUID,并将最后六个字节

放入字符串中。它们可能是MAC地址,但并不是必然的。

#include

#include

#include

using namespace std;

int main()

{

cout << "MAC address is: ";

// 向COM要求一个UUID。如果机器中有以太网卡,

// UUID最后的六个字节(Data4的2-7字节)应该是本地以太网卡的MAC地址。

GUID uuid;

CoCreateGuid(&uuid);

// Spit the address out

char mac_addr[18];

sprintf(mac_addr,"%02X:%02X:%02X:%02X:%02X:%02X",

4[2],4[3],4[4],

4[5],4[6],4[7]);

cout << mac_addr << endl;

getch();

return 0;

}

4.用NetAPI来获取网卡MAC地址

首先在头文件定义中加入#include "nb30.h"

#pragma comment(lib,"")

typedef struct _ASTAT_

{

ADAPTER_STATUS adapt;

NAME_BUFFER NameBuff[30];

} ASTAT, * PASTAT;

就可以这样调用来获取远程网卡MAC地址了:

CString GetMacAddress(CString sNetBiosName)

{

ASTAT Adapter;

NCB ncb;

UCHAR uRetCode;

memset(&ncb, 0, sizeof(ncb));

_command = NCBRESET;

_lana_num = 0;

uRetCode = Netbios(&ncb);

memset(&ncb, 0, sizeof(ncb));

_command = NCBASTAT;

_lana_num = 0;

per();

FillMemory(_callname, NCBNAMSZ - 1, 0x20);

strcpy((char *)_callname, (LPCTSTR) sNetBiosName);

_callname[gth()] = 0x20;

_callname[NCBNAMSZ] = 0x0;

_buffer = (unsigned char *) &Adapter;

_length = sizeof(Adapter);

uRetCode = Netbios(&ncb);

CString sMacAddress;

if (uRetCode == 0)

{

(_T("%02x%02x%02x%02x%02x%02x"),

r_address[0],

r_address[1],

r_address[2],

r_address[3],

r_address[4],

r_address[5]);

}

return sMacAddress;

}

本文标签: 地址获取方法网卡系统