获取网卡mac地址,区分虚拟机网卡

本文介绍了一个C++函数MacAddressToString,用于将网卡MAC地址转换为字符串,并提供了一个GetMacByCmd函数,通过遍历IP_ADAPTER_INFO结构来获取本地物理网卡的MAC地址,同时能避免获取到虚拟机的网卡地址。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

BOOL IsLocalAdapter( const char *pAdapterName )
{
BOOL ret_value = FALSE;
char szDataBuf[MAX_PATH+1] = {0};
DWORD dwDataLen = MAX_PATH;
DWORD dwType = REG_SZ;
HKEY hLocalNet = NULL;


#define NET_CARD_KEY (_T("System\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}"))
sprintf(szDataBuf, "%s\\%s\\Connection",NET_CARD_KEY, pAdapterName);


if(ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE ,szDataBuf ,0 ,KEY_READ, &hLocalNet))
{
return FALSE;
}


/*注册表中网卡信息有的没有该项
if (ERROR_SUCCESS != RegQueryValueEx(hLocalNet, _T("MediaSubType"), 0, &dwType, (BYTE *)szDataBuf, &dwDataLen))
{
goto ret;
}
if (*((DWORD *)szDataBuf)!=0x01)
goto ret;
*/
dwDataLen = MAX_PATH;
memset(szDataBuf,0,sizeof(szDataBuf));
if (ERROR_SUCCESS != RegQueryValueEx(hLocalNet, _T("PnpInstanceID"), 0, &dwType, (BYTE *)szDataBuf, &dwDataLen))
{
goto ret;
}


if (strncmp(szDataBuf, "PCI", strlen("PCI")))
{
//注册表中网卡信息中该项值中的"PCI"并不都位于最前
CString id = szDataBuf;
int ret = id.Find("PCI");
if ( ret == -1 )
{
goto ret;
}
}


ret_value = TRUE;


ret:
RegCloseKey(hLocalNet);


return ret_value;
}


void MacAddressToString(const LPBYTE Address, LPSTR lpsz, int nAddressLength = 6)
{
 LPSTR p = lpsz;
 for ( int i = 0; i < nAddressLength ; i++ )
 {
  p += sprintf( p, i ? ":%02x" : "%02x", Address[i]);
 }
}

 

#if 1
#include"stdafx.h"
#include<atlbase.h>
#include<atlconv.h>
#include"iphlpapi.h"
#pragma comment(lib,"Iphlpapi.lib")
int GetMacByCmd( char* mac )
{
 PIP_ADAPTER_INFO pAdapterInfo;
 DWORD AdapterInfoSize = 0;
 DWORD dwRetVal=0;

 GetAdaptersInfo(NULL,&AdapterInfoSize);
 pAdapterInfo = ( PIP_ADAPTER_INFO )GlobalAlloc(GPTR,AdapterInfoSize);

 GetAdaptersInfo(pAdapterInfo,&AdapterInfoSize);

 PIP_ADAPTER_INFO pAdapter = pAdapterInfo;

 while(pAdapter)
 {
  if ( IsLocalAdapter(pAdapter->AdapterName) )
  {
   MacAddressToString(pAdapter->Address,mac,pAdapter->AddressLength);
   break;
  }
  else
  {
   pAdapter = pAdapter->Next;
  }
 }
 GlobalFree(pAdapterInfo);
 return 0;
}
#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值