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


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

     

     

     

  • 相关阅读:
    Golang map 的底层原理
    sync.map 原理分析
    系统库 SQL Server隐藏系统库Resource探究
    系统库 SQL Server隐藏系统库Resource Database探究
    SQLSERVER如何正确修改主机名和IP地址
    从 SQL Server 创建到 MySQL 的链接服务器
    关于SQLSERVER Model Database探究
    java 获取方法参数名字
    一个基于 JavaScript 的开源可视化图表库
    HTML颜色名称和颜色代码表
  • 原文地址:https://www.cnblogs.com/zhangzhifeng/p/2537828.html
Copyright © 2020-2023  润新知