• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Delphi 如何区分虚拟网卡与物理网卡 - ╰★张志峰★╮

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

若系统中安装了 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

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jianghui3132749/archive/2009/11/25/4868350.aspx

 

 

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
2018美赛准备之路——Matlab基础——基本运算符号表示发布时间:2022-07-18
下一篇:
ENVI数据类型和MATLAB数据类型对比发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap