如何识别物理网卡方法

由于各种原因,我们需要获取机器上的mac地址,但是现在虚拟机的存在,使得我们不好区分那个是真正的物理网卡。在网络上也说明了一些方法。在这里我先记录一下。获取mac的方法,可以google一下“取得系统中网卡MAC地址的三种方法”。我们里是通过GetAdaptersInfo来获取网卡信息的,这个返回的结果中,我特别的需要主要下面几个字段AdapterName,Address为什么这里没有用到Description呢。其中有一种方式就是通过Description中是否存在PCI这样的字符串来进行判断是否为物理网卡的。


我要介绍的方法是通过使用AdapterName来判断的。这个就要涉及到注册表和SetupDi函数了,或许有点复杂。AdapterName是一个guid数据,这个数据可以让我们查询这个所在网卡信息。HLM\\System\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\{AdapterName}\\connection 下面去看看,在这个下面一般有MediaSubType,这个可以用了表示是否为无线网卡,还有一个Name,这个是用于在网络连接中显示的名称,一般真是的pci板载网卡叫做本地连接,当然也可以用这个方法来判断是否为物理网卡了。还有一个就是PnpInstanceId,这个指是有系统在枚举pci的时候设置的,这个值其实就是device instance id,你可以在设备管理其中看到这个。
接下来就是我想说的用SetupDi来判断是否为物理网卡的方法了。其实这个挺简单的,只要我们知道物理网卡,肯定是挂在某个bus上面的,因此对于虚拟网卡,肯定是没有bus号的。主要的代码在下面。我想应该可以说明白了。

unsigned char szGuid[] = "4D36E972-E325-11CE-BFC1-08002BE10318";
HRESULT hr = UuidFromString(szGuid,&guid);  
hDevInfo = SetupDiGetClassDevs(&guid,NULL,NULL,DIGCF_PRESENT);  // get the device info
if (INVALID_HANDLE_VALUE == hDevInfo)
{
OutputDebugString("SetupDiGetClassDevs failed");
}
char Description[MAX_PATH] = {0};
char DeviceId[MAX_PATH] = {0};
ULONG dwLen = MAX_PATH;
ULONG dwBusNum = -1;
for (int i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); ++i)   //enum device info
{
ZeroMemory(DeviceId,sizeof(DeviceId));
dwBusNum = -1;

SetupDiGetDeviceInstanceId(hDevInfo,&DeviceInfoData,DeviceId,MAX_PATH,NULL);

if (!SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_BUSNUMBER, NULL,(PBYTE)&dwBusNum,  
sizeof(ULONG), NULL) )   
{   
continue;
}

if(szPnpInstanceID.CompareNoCase(DeviceId)==0 && dwBusNum != -1)
{
bRet = TRUE;
break;
}


}
// 释放 device information set
SetupDiDestroyDeviceInfoList(hDevInfo);

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值