天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 77|回复: 0

C++ 获取物理Mac地址方法:

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
C++ 获取物理Mac地址方法:

1. 使用GetAdaptersInfo获取网卡详细信息;

2. 遍历IP_ADAPTER_INFO,取AdapterName去匹配注册表HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002bE10318}\\下子节点的NetCfgInstanceId值,找到相对应的子节点再取Characteristics值;

3. 判断Characteristics值 & NCF_PHYSICAL(4)的结果,大于0为物理网卡;



//32位程序在64位系统下运行禁用重定向问题;
CWow64Detector::CWow64Detector(BOOL bDisable)
: m_bDisable(FALSE)
{
        if (bDisable && m_bWin64)
                m_bDisable = Win64DisableFsRedirection(&m_pDisData);
}

CWow64Detector::~CWow64Detector()
{
        if (m_bDisable)
        {
                Win64RevertFsRedirection(m_pDisData);
        }
}



BOOL IsPhysicalMac(char* pAdapterName)
{
        CWow64Detector wow64(TRUE);    //该类封装了32位程序在64位系统中的重定向问题;否则注册表查询会有问题;
        CString strAdapterName(pAdapterName);
       
        LPCTSTR lpszKey = _T("SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002bE10318}");
        HKEY hSubKey = NULL;
        if (::RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpszKey, 0, KEY_QUERY_VALUE| KEY_ENUMERATE_SUB_KEYS, &hSubKey) != ERROR_SUCCESS) {
                return FALSE;
        }
        BOOL nRet = FALSE, bFind = FALSE;

        TCHAR achClass[MAX_PATH] = _T("");
        DWORD cchClassName = MAX_PATH;
        DWORD cSubKeys = 0;
        DWORD cbMaxSubKey;
        DWORD cchMaxClass;
        DWORD cValues;
        DWORD cchMaxValue;
        DWORD cbMaxValueData;
        DWORD cbSecurityDescriptor;
        FILETIME ftLastWriteTime;
        if (::RegQueryInfoKey(hSubKey, achClass, &cchClassName, NULL,
                &cSubKeys, &cbMaxSubKey,&cchMaxClass, &cValues, &cchMaxValue,
                &cbMaxValueData, &cbSecurityDescriptor, &ftLastWriteTime) == ERROR_SUCCESS) {
                for (size_t i = 0; i < cSubKeys; i++)
                {
                        TCHAR achKey[MAX_PATH] = _T("");
                        DWORD achName = MAX_PATH;
                        LSTATUS lp = ::RegEnumKeyEx(hSubKey, i, achKey, &achName,
                                NULL, NULL, NULL, &ftLastWriteTime);
                        if (lp == ERROR_SUCCESS) {
                                HKEY hachKey = NULL;
                                if (::RegOpenKeyEx(hSubKey, achKey, 0, KEY_QUERY_VALUE, &hachKey) == ERROR_SUCCESS) {
                                        DWORD dwType = 0, dwSize = 0, dwValue = 0;
                                        ::RegQueryValueEx(hachKey, _T("NetCfgInstanceId"), NULL, &dwType, NULL, &dwSize);
                                        if (dwType == REG_SZ && dwSize > 0)
                                        {
                                                TCHAR lpszValue[MAX_PATH] = _T("");
                                                LONG lRes = ::RegQueryValueEx(hachKey, _T("NetCfgInstanceId"), NULL, &dwType, (LPBYTE)lpszValue, &dwSize);
                                                if (_tcscmp(lpszValue, strAdapterName) == 0) {
                                                        bFind = TRUE;
                                                        dwType = REG_DWORD;
                                                        //dwSize = sizeof(DWORD);
                                                        LONG lRes = ::RegQueryValueEx(hachKey, _T("Characteristics"), NULL, &dwType, (LPBYTE)&dwValue, &dwSize);
                                                        if (dwValue & 0x04){
                                                                nRet = TRUE;
                                                        }
                                                }
                                        }
                                        ::RegCloseKey(hachKey);
                                        if (bFind || nRet) {
                                                break;
                                        }
                                }
                        }
                }
        }
        ::RegCloseKey(hSubKey);

        return nRet;
}

int GetPhysicalMacStr(CStringArray &macList)
{
        macList.RemoveAll();
        ULONG len = 0;
        if (GetAdaptersInfo(NULL, &len) != ERROR_BUFFER_OVERFLOW || len == 0) {
                ASSERT(FALSE);
                return 0;
        }

        IP_ADAPTER_INFO* pAdapterBase = (IP_ADAPTER_INFO*)new BYTE[len];
        if (pAdapterBase != NULL) {
                DWORD dwError = GetAdaptersInfo(pAdapterBase, &len);
                if (dwError == ERROR_SUCCESS) {
                        IP_ADAPTER_INFO* pAdapterInfo = pAdapterBase;
                        while (pAdapterInfo != NULL)
                        {
                                if (IsPhysicalMac(pAdapterInfo->AdapterName)) {
                                        CString strMac,strFmt;
                                        for (int i = 0; i < pAdapterInfo->AddressLength; i++) {
                                                strFmt.Format(_T("%.2X-"), pAdapterInfo->Address[i]);
                                                strMac += strFmt;
                                        }
                                        strMac.TrimRight('-');
                                        macList.Add(strMac);
                                }
                               
                                pAdapterInfo = pAdapterInfo->Next;
                        }
                }
                else {
                        ASSERT(FALSE);
                }
                delete[](BYTE*)pAdapterBase;
        }

        return macList.GetSize();
}




[code]原文链接:https://blog.csdn.net/hzy888cp/article/details/98180422[/code]

 

 

 

 

C++ 获取物理Mac地址方法:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

GMT+8, 2024-11-1 12:33 , Processed in 0.150091 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表