admin管理员组文章数量:1642335
#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <WinIoCtl.h>
#include "macid.h"
#include <intrin.h>
#include "crc.h"
#include "xxtea.h"
#include <nb30.h>
#pragma comment (lib,"netapi32.lib")
typedef struct _ASTAT_
{
ADAPTER_STATUS adapt;
NAME_BUFFER NameBuff [30];
}ASTAT, * PASTAT;
ASTAT Adapter;
#define OID_802_3_PERMANENT_ADDRESS 0x01010101
//#define OID_802_3_CURRENT_ADDRESS 0x01010102
#define IOCTL_NDIS_QUERY_GLOBAL_STATS 0x00170002
int FindStr(TCHAR *source,TCHAR *substr){
int lensource=_tcslen(source);
int lensub=_tcslen(substr);
for(int i=0;i<lensource-lensub;i++){
bool finded=true;
for(int j=0;j<lensub;j++){
if(source[i+j]!=substr[j]){
finded=false;
break;
}
}
if(finded) return i;
}
return -1;
}
int GetMacFromTcpip(unsigned char *szMac)
{
int nError = -1;
if ( szMac==NULL){
return nError;
}
HKEY hKey = NULL;
//HKEY hKey2 = NULL;
TCHAR szBuffer[MAX_PATH];
TCHAR szFileName[MAX_PATH] = {0};
DWORD dwRet = 0;
DWORD dwType = 0;
DWORD cbData = 0;
DWORD cbData2 = 0;
DWORD cName = _countof(szBuffer);
if ( RegOpenKey(HKEY_LOCAL_MACHINE,_T("SYSTEM\\ControlSet001\\services\\Tcpip\\Parameters\\Adapters"),&hKey)!=ERROR_SUCCESS ){
return nError;
}
for ( int i=0; RegEnumKeyEx(hKey,i,szBuffer,&cName,NULL,NULL,NULL,NULL)==ERROR_SUCCESS; ++i, cName = _countof(szBuffer) ){
_tcscpy_s(szFileName,MAX_PATH,_T("\\\\.\\"));
_tcscat_s(szFileName,MAX_PATH,szBuffer);
//MessageBox(0,szFileName,L"Path",48);
HANDLE hFile = CreateFile(szFileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);
if ( hFile!=INVALID_HANDLE_VALUE ){
DWORD dwInBuff = OID_802_3_PERMANENT_ADDRESS;
BYTE outBuff[MAX_PATH];
dwRet = DeviceIoControl(hFile,IOCTL_NDIS_QUERY_GLOBAL_STATS,&dwInBuff,sizeof(dwInBuff),outBuff,sizeof(outBuff),&cbData,NULL);
//无论成功失败关闭文件句柄
CloseHandle(hFile);
hFile = INVALID_HANDLE_VALUE;
if ( dwRet ){
memcpy(szMac,outBuff,6);
nError = 0;
break;
}
}else{
nError=GetLastError();
//打开设备失败
}
}//end for
if ( hKey!=NULL ){
RegCloseKey(hKey);
}
return nError;
}
int GetMac(unsigned char *szMac,bool diswifi)
{
int nError = -1;
if ( szMac==NULL){
return nError;
}
HKEY hKey = NULL;
HKEY hKey2 = NULL;
TCHAR szKey[MAX_PATH],szBuffer[MAX_PATH];
TCHAR szServiceName[MAX_PATH];
TCHAR szDescription[MAX_PATH];
TCHAR szFileName[MAX_PATH] = {0};
DWORD dwRet = 0;
DWORD dwType = 0;
DWORD cbData = 0;
DWORD cbData2 = 0;
DWORD cName = _countof(szBuffer);
if ( RegOpenKey(HKEY_LOCAL_MACHINE,_T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\NetworkCards\\"),&hKey)!=ERROR_SUCCESS ){
return nError;
}
for ( int i=0; RegEnumKeyEx(hKey,i,szBuffer,&cName,NULL,NULL,NULL,NULL)==ERROR_SUCCESS; ++i, cName = _countof(szBuffer) ){
_tcscpy_s(szKey,MAX_PATH,_T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\NetworkCards\\"));
_tcscat_s(szKey,MAX_PATH,szBuffer);
if ( RegOpenKey(HKEY_LOCAL_MACHINE,szKey,&hKey2)!=ERROR_SUCCESS ){
continue;
}
dwType = REG_SZ;
cbData = MAX_PATH*sizeof(TCHAR);
if ( RegQueryValueEx(hKey2,_T("ServiceName"),NULL,&dwType,(LPBYTE)szServiceName,&cbData)==ERROR_SUCCESS ){
cbData2 = MAX_PATH*sizeof(TCHAR);
RegQueryValueEx(hKey2,_T("Description"),NULL,&dwType,(LPBYTE)szDescription,&cbData2);
//读取成功后关闭句柄
RegCloseKey(hKey2);
if(FindStr(szDescription,_T("Wifi"))>=0 && diswifi){
continue;
}
if(FindStr(szDescription,_T("Wireless"))>=0 && diswifi){
continue;
}
if(FindStr(szDescription,_T("USB"))>=0 && diswifi){
continue;
}
if(FindStr(szDescription,_T("VPN"))>=0 && diswifi){
continue;
}
_tcscpy_s(szFileName,MAX_PATH,_T("\\\\.\\"));
_tcscat_s(szFileName,MAX_PATH,szServiceName);
//MessageBox(0,szFileName,L"Path",48);
HANDLE hFile = CreateFile(szFileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);
if ( hFile!=INVALID_HANDLE_VALUE ){
DWORD dwInBuff = OID_802_3_PERMANENT_ADDRESS;
BYTE outBuff[MAX_PATH];
dwRet = DeviceIoControl(hFile,IOCTL_NDIS_QUERY_GLOBAL_STATS,&dwInBuff,sizeof(dwInBuff),outBuff,sizeof(outBuff),&cbData,NULL);
//无论成功失败关闭文件句柄
CloseHandle(hFile);
hFile = INVALID_HANDLE_VALUE;
if ( dwRet ){
memcpy(szMac,outBuff,6);
nError = 0;
break;
}
}else{
nError=GetLastError();
//打开设备失败
}
}else{
//读取失败关闭句柄
RegCloseKey(hKey2);
}
}//end for
if ( hKey!=NULL ){
RegCloseKey(hKey);
}
return nError;
}
调用方法
int GetMachineID(BYTE* machineid){
BYTE NetCardID[16];
int res=0;
res=GetMac(NetCardID,true);
if(res!=0){
res=GetMac(NetCardID,false);
}
if(res!=0){
res=GetMacFromTcpip(NetCardID);
}
if(res!=0)return res;
memcpy(machineid,NetCardID,16);
return 0;
}
NetCardID,16);
return 0;
}
原理是先跳过可移动或虚拟网卡,如果获取不到就使用不跳过方式再获取一遍,还获取不到就换一种方式来一遍,为什么换方式呢?实际部署时发现有些机器在NetworkCars注册表下的GUID打不开网卡导致CreateFile失败
版权声明:本文标题:vc 获取本机网卡真实mac地址 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dianzi/1729336618a1197068.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论