admin管理员组

文章数量:1642354

#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