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;
}
版权声明:本文标题:Windows中获取MAC地址的几种方法 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/xitong/1722318539a925838.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论