如何区分虚拟网卡与物理网卡
来源:互联网 发布:当虹科技知乎 编辑:程序博客网 时间:2024/05/01 16:10
[ 2008-07-02 18:27:34 | 作者: lafite ]
若系统中安装了 VMWare 或者某些 VPN 客户端软件,则会出现若干虚拟网卡。它们在形式上与物理网卡几乎没有区别。 ipconfig 将它们与本地物理网卡等同对待。 那如何在如何区分虚拟网卡还是物理网卡呢?
有些人建议使用 MAC 地址中的 "locally administread bit" 来区分。但是事实上不能100%区分,在win2000之后的系统基本是行不通的。
http://hi.baidu.com/xzq2000/blog/item/43b686d672cd762f07088b95.html
有人用GetAdaptersInfo 可以获得本机所有网卡的信息,然后通过判断是否“pci”开头来区分是否虚拟网卡。http://blog.csdn.net/aseity/archive/2007/12/11/1929948.aspx 具体代码如下:(以下代码引用别处)
这样方法基本可以达到目标,但是也存在不能识别所有网卡类型。
还有一种更简单,而且可以100%识别的方法,就是通过“Characteristics”这个值来确定网卡的类型是虚拟网卡还是物理网卡。
Characteristics 值在注册表
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Class/{4D36E972-E325-11CE-BFC1-08002bE10318}/数字下。
在windows中,Characteristics 的取值如下,Characteristics项可以有1个或多个如下的值(多值应计算总和):
十六进制值 名字 描述
ox1 NCF_VIRTUAL 说明组件是个虚拟适配器
ox2 NCF_SOFTWARE_ENUMERATED 说明组件是一个软件模拟的适配器
ox4 NCF_PHYSICAL 说明组件是一个物理适配器
ox8 NCF_HIDDEN 说明组件不显示用户接口
ox10 NCF_NO_SERVICE 说明组件没有相关的服务(设
备驱动程序)
ox20 NCF_NOT_USER_REMOVABLE 说明不能被用户删除(例如,
通过控制面板或设备管理器)
ox40 NCF_MULTIPORT_INSTANCED_ADAPTER 说明组件有多个端口,每个端
口作为单独的设备安装。每个
端口有自己的hw_id(组件ID)
并可被单独安装,这只适合于
EISA适配器
ox80 NCF_HAS_UI 说明组件支持用户接口(例如,
Advanced Page或Customer
Properties Sheet)
ox400 NCF_FILTER 说明组件是一个过滤器
从上面可以看出来,只要用户判断“Characteristics ”的值就可以判断网卡是虚拟网卡还是物理网卡。
如果是虚拟网卡:Characteristics & NCF_VIRTUAL ==NCF_VIRTUAL
如果是物理网卡:Characteristics & NCF_PHYSICAL ==NCF_PHYSICAL
有些人建议使用 MAC 地址中的 "locally administread bit" 来区分。但是事实上不能100%区分,在win2000之后的系统基本是行不通的。
http://hi.baidu.com/xzq2000/blog/item/43b686d672cd762f07088b95.html
有人用GetAdaptersInfo 可以获得本机所有网卡的信息,然后通过判断是否“pci”开头来区分是否虚拟网卡。http://blog.csdn.net/aseity/archive/2007/12/11/1929948.aspx 具体代码如下:(以下代码引用别处)
bool IsLocalAdapter ( const char *pAdapterName ) const
...{
BOOL ret_value = FALSE;
#define NET_CARD_KEY "System/CurrentControlSet/Control/Network/{4D36E972-E325-11CE-BFC1-08002BE10318}"
char szDataBuf[MAX_PATH+1];
DWORD dwDataLen = MAX_PATH;
DWORD dwType = REG_SZ;
HKEY hNetKey = NULL;
HKEY hLocalNet = NULL;
if(ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE, NET_CARD_KEY, 0, KEY_READ, &hNetKey))
return FALSE;
sprintf(szDataBuf, "%s/Connection", pAdapterName);
if(ERROR_SUCCESS != RegOpenKeyEx(hNetKey ,szDataBuf ,0 ,KEY_READ, &hLocalNet))
...{
RegCloseKey(hNetKey);
return FALSE;
}
if (ERROR_SUCCESS != RegQueryValueEx(hLocalNet, "MediaSubType", 0, &dwType, (BYTE *)szDataBuf, &dwDataLen))
...{
goto ret;
}
if (*((DWORD *)szDataBuf)!=0x01)
goto ret;
dwDataLen = MAX_PATH;
if (ERROR_SUCCESS != RegQueryValueEx(hLocalNet, "PnpInstanceID", 0, &dwType, (BYTE *)szDataBuf, &dwDataLen))
...{
goto ret;
}
if (strncmp(szDataBuf, "PCI", strlen("PCI")))
goto ret;
ret_value = TRUE;
ret:
RegCloseKey(hLocalNet);
RegCloseKey(hNetKey);
return ret_value!=0;
}
...{
BOOL ret_value = FALSE;
#define NET_CARD_KEY "System/CurrentControlSet/Control/Network/{4D36E972-E325-11CE-BFC1-08002BE10318}"
char szDataBuf[MAX_PATH+1];
DWORD dwDataLen = MAX_PATH;
DWORD dwType = REG_SZ;
HKEY hNetKey = NULL;
HKEY hLocalNet = NULL;
if(ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE, NET_CARD_KEY, 0, KEY_READ, &hNetKey))
return FALSE;
sprintf(szDataBuf, "%s/Connection", pAdapterName);
if(ERROR_SUCCESS != RegOpenKeyEx(hNetKey ,szDataBuf ,0 ,KEY_READ, &hLocalNet))
...{
RegCloseKey(hNetKey);
return FALSE;
}
if (ERROR_SUCCESS != RegQueryValueEx(hLocalNet, "MediaSubType", 0, &dwType, (BYTE *)szDataBuf, &dwDataLen))
...{
goto ret;
}
if (*((DWORD *)szDataBuf)!=0x01)
goto ret;
dwDataLen = MAX_PATH;
if (ERROR_SUCCESS != RegQueryValueEx(hLocalNet, "PnpInstanceID", 0, &dwType, (BYTE *)szDataBuf, &dwDataLen))
...{
goto ret;
}
if (strncmp(szDataBuf, "PCI", strlen("PCI")))
goto ret;
ret_value = TRUE;
ret:
RegCloseKey(hLocalNet);
RegCloseKey(hNetKey);
return ret_value!=0;
}
这样方法基本可以达到目标,但是也存在不能识别所有网卡类型。
还有一种更简单,而且可以100%识别的方法,就是通过“Characteristics”这个值来确定网卡的类型是虚拟网卡还是物理网卡。
Characteristics 值在注册表
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Class/{4D36E972-E325-11CE-BFC1-08002bE10318}/数字下。
在windows中,Characteristics 的取值如下,Characteristics项可以有1个或多个如下的值(多值应计算总和):
十六进制值 名字 描述
ox1 NCF_VIRTUAL 说明组件是个虚拟适配器
ox2 NCF_SOFTWARE_ENUMERATED 说明组件是一个软件模拟的适配器
ox4 NCF_PHYSICAL 说明组件是一个物理适配器
ox8 NCF_HIDDEN 说明组件不显示用户接口
ox10 NCF_NO_SERVICE 说明组件没有相关的服务(设
备驱动程序)
ox20 NCF_NOT_USER_REMOVABLE 说明不能被用户删除(例如,
通过控制面板或设备管理器)
ox40 NCF_MULTIPORT_INSTANCED_ADAPTER 说明组件有多个端口,每个端
口作为单独的设备安装。每个
端口有自己的hw_id(组件ID)
并可被单独安装,这只适合于
EISA适配器
ox80 NCF_HAS_UI 说明组件支持用户接口(例如,
Advanced Page或Customer
Properties Sheet)
ox400 NCF_FILTER 说明组件是一个过滤器
从上面可以看出来,只要用户判断“Characteristics ”的值就可以判断网卡是虚拟网卡还是物理网卡。
如果是虚拟网卡:Characteristics & NCF_VIRTUAL ==NCF_VIRTUAL
如果是物理网卡:Characteristics & NCF_PHYSICAL ==NCF_PHYSICAL
- 如何区分虚拟网卡与物理网卡
- 如何区分虚拟网卡与物理网卡
- 如何区分虚拟网卡和物理网卡?
- 区分虚拟网卡与物理网卡
- 区分虚拟网卡与物理网卡
- 区分本地网卡是物理网卡还是虚拟网卡
- 区分本地网卡是物理网卡还是虚拟网卡
- winform C# 获取区分物理网卡、虚拟网卡及无线网卡
- winform C# 获取区分物理网卡、虚拟网卡及无线网卡
- 虚拟双网卡与物理双网卡的连接
- 虚拟网卡与物理网卡TCP协议数据传输对比
- 关于仿真网卡、虚拟网卡、物理网卡的介绍与异同点比较
- 判断是本地网卡是物理网卡还是虚拟网卡
- 如何虚拟网卡
- WINDOWS网络流量监控(区分物理网卡)(Win32)
- vlan 与 虚拟网卡
- 如何识别物理网卡方法
- rhel 6.3 多物理网卡,多虚拟网卡桥接
- 温度
- Properties中文属性编辑器(propedit plugin) For Eclipse
- C++调试时的错误例子及解决方法
- FCKeditor的js验证
- 无法向会话状态服务器发出会话状态请求 没有启动 ASP.NET State service错误的解决方法
- 如何区分虚拟网卡与物理网卡
- 助力残联-华夏互联与省残联达成结对扶持意向
- 让程序随系统启动
- 深入剖析MFC中Windows消息处理、运行机制
- 产品成本核算方法
- 用java模拟浏览器程序
- log4j的简单使用/配制
- DB2是什么兔VS数据库又是什么库?
- [无线玩家]玩转无线路由之DD-WRT基础扫盲