如何识别物理网卡方法
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);
我要介绍的方法是通过使用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);
相关文章推荐
- 如何区分虚拟网卡和物理网卡?
- 如何修改网卡的MAC(物理)地址
- "网卡eth0,未识别的端口"的解决方法
- 如何修改网卡的MAC(物理)地址-----完全版转
- 在JAVA中如何获取本机的网卡物理地址
- 快速学习COSMIC方法之八:如何识别功能处理
- Realtek网卡如何识别具体型号是8111B/8111C/8111D还是8111E???
- GNS3识别不出网卡解决方法
- HAL/JNI简明笔记(三)——java如何识别native方法的实现
- 如何识别上传前检测的图像是有效的方法
- Red Hat Enterprise Linux 5 (RHEL5)中物理网卡被peth0占用无法联网的问题解决方法
- Linux服务器更换主板后,网卡识别失败的处理方法
- 系统无法识别无线网卡的尝试解决方法整理
- Hyper-V安装CentOS6.X网卡不识别问题解决方法
- Windows7系统中如何识别老光驱的两种方法介绍
- GNS3桥接物理网卡不通解决方法
- Hyper-V安装CentOS6.X网卡不识别问题解决方法