您的位置:首页 > 其它

如何识别物理网卡方法

2011-08-04 18:33 603 查看
由于各种原因,我们需要获取机器上的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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: