如何区分虚拟网卡与物理网卡

 

[ 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 具体代码如下:(以下代码引用别处)
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;

}


这样方法基本可以达到目标,但是也存在不能识别所有网卡类型。
还有一种更简单,而且可以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

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
VirtualBox是一款开源的虚拟化软件,它允许用户在一台物理计算机上创建和运行多个虚拟机。虚拟网卡是VirtualBox中的一个重要组件,它模拟了一张物理网卡,使得虚拟机可以通过虚拟网卡与宿主机和其他虚拟机进行网络通信。 VirtualBox中的虚拟网卡有以下几种类型: 1. NAT(Network Address Translation)模式:在这种模式下,虚拟机通过宿主机的网络连接与外部网络通信。宿主机充当了一个网络地址转换器,将虚拟机的网络请求转发到外部网络,并将外部网络的响应返回给虚拟机。 2. Bridged(桥接)模式:在这种模式下,虚拟机的虚拟网卡与宿主机的物理网卡连接在同一个网络中,虚拟机可以直接与外部网络进行通信。虚拟机会获得一个与宿主机在同一网络中的IP地址,就像是一个独立的计算机一样。 3. Host-Only(仅主机)模式:在这种模式下,虚拟机之间以及虚拟机与宿主机之间可以进行通信,但是无法与外部网络通信。VirtualBox会为虚拟机创建一个虚拟的局域网,虚拟机可以通过虚拟网卡与宿主机和其他虚拟机进行通信。 4. Internal(内部)模式:在这种模式下,虚拟机之间可以进行通信,但是无法与宿主机和外部网络通信。VirtualBox会为虚拟机创建一个虚拟的内部网络,虚拟机可以通过虚拟网卡与其他虚拟机进行通信。 5. Generic(通用)模式:这种模式下,VirtualBox允许用户自定义虚拟网卡的行为,用户可以通过自定义的驱动程序来实现特定的网络功能。 总结一下,VirtualBox的虚拟网卡是一种模拟的网络设备,它使得虚拟机可以与宿主机和其他虚拟机进行网络通信。不同的虚拟网卡模式提供了不同的网络连接方式,用户可以根据需求选择适合的模式。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值