获得当前网卡MAC

来源:互联网 发布:大数据金融行业的应用 编辑:程序博客网 时间:2024/05/12 13:36

     看了很多资料,获得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 0x00170002const 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\ServiceNameHANDLE 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);}

写这些东西就是为了让自己以后忘记的时候可以过来看看,欢迎拍砖。


原创粉丝点击