看了很多资料,获得MAC方法也很多,但是再多网卡的时候,有的方法不能正确获得当前使用的MAC地址,这里讲我的方法贡献出来,就算是在多网卡情况下,也能准确获得当前连接的网卡的MAC.
我已经将它封装成了类,可以直接使用.
#include "stdafx.h"
#include <atlbase.h>
#include "StdAfx.h"
#include "GetMac.h"
#include <string.h>
#pragma comment(lib,"Wininet.lib")
using namespace ATL;
#define OID_802_3_PERMANENT_ADDRESS 0x01010101
#define OID_802_3_CURRENT_ADDRESS 0x01010102
#define IOCTL_NDIS_QUERY_GLOBAL_STATS 0x00170002
const char* GetMac:: key = "lykjLdy173";
GetMac::GetMac(void)
{
}
GetMac::~GetMac(void)
{
}
string GetMac::GetComputerIdentity()
{
return GetMac::GetMacAddress();
}
string GetMac::GetMacAddress()
{
// {6A8DCD5A-CB21-4FFB-BA2D-622381D69E3C} 网卡标识,xp下可以在注册表下对应位置找到,本例:
// HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards\2\ServiceName
HANDLE hDev = CreateFile("//./{6A8DCD5A-CB21-4FFB-BA2D-622381D69E3C}",
GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, 0, 0);
if(hDev == INVALID_HANDLE_VALUE)
{
CRegKey reg;
string KeyPath = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\NetworkCards";
string netCardKey;
if (reg.Open(HKEY_LOCAL_MACHINE, KeyPath.c_str()) != ERROR_SUCCESS)
{
return "";
}
int i = 0;
while(1)
{
char buff[1024];
memset(buff, 0, sizeof(buff));
DWORD nLen = sizeof(buff);
if(reg.EnumKey(i, buff, &nLen) != ERROR_SUCCESS)
{
break;
}
i++;
CRegKey x;
KeyPath += "\\";
string szBuff = buff;
KeyPath += szBuff;
if(x.Open(HKEY_LOCAL_MACHINE, KeyPath.c_str() )!= ERROR_SUCCESS)
{
continue;
}
nLen = sizeof(buff);
memset(buff,0, sizeof(buff));
x.QueryStringValue("ServiceName", buff, &nLen);
szBuff = "";
szBuff = buff;
netCardKey += "//./";
netCardKey += szBuff;
hDev = CreateFile(netCardKey.c_str(), GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, 0, 0);
if(hDev == INVALID_HANDLE_VALUE)
{
continue;
}
else
{
break;
}
}
}
if(hDev == INVALID_HANDLE_VALUE) return "";
int inBuf;
BYTE outBuf[256]= {0};
DWORD BytesReturned;
inBuf = OID_802_3_PERMANENT_ADDRESS;
char rt[64];
memset(rt, 0, 64);
if(DeviceIoControl(hDev, IOCTL_NDIS_QUERY_GLOBAL_STATS, (LPVOID)&inBuf,4,outBuf,256,&BytesReturned,NULL))
{
sprintf(rt, "%02X%02X%02X%02X%02X%02X",outBuf[0],outBuf[1],outBuf[2],outBuf[3],outBuf[4],outBuf[5]);
}
return string(rt);
}
写这些东西就是为了让自己以后忘记的时候可以过来看看,欢迎拍砖。