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