区分本地网卡是物理网卡还是虚拟网卡

华为ENSP模拟器桥接本地网实战:解决虚拟网络与物理网络通信问题 本文详细解析了华为ENSP模拟器桥接本地物理网卡的核心原理与实战步骤。通过将虚拟网络适配器与物理网卡在数据链路层绑定,实现ENSP虚拟设备与真实网络(包括互联网)的无缝通信。文章提供了从环境检查、网选择到VirtualBox与ENSP逐步配置的完整指南,并针对无线桥接等常见问题给出了深度排错方案与高级应用场景,是打通虚拟实验与真实网络环境的关键技能。 阅读详情
GetAdaptersInfo 可以获得本机所有网卡的信息,然而这些网卡中可能包括虚拟网卡。例如,若安装了 VMWare 或者某些 VPN 客户端软件,则会出现若干虚拟网卡。它们在形式上与物理网卡几乎没有区别。 ipconfig 将它们与本地物理网卡等同对待。

有些人建议使用 MAC 地址中的 "locally administread bit" 来区分。而事实证明这是靠不住的。http://hi.baidu.com/xzq2000/blog ... cd762f07088b95.html
是目前我找到的比较实用的办法。

其原理是先由 GetAdaptersInfo 获取所有网卡的基本信息。然后利用网卡名去注册表中查找对应的硬件信息。若是物理网卡,其硬件信息中通常会包含 PCI 。

例如,某个网卡的名为 {ACA306D0-1D69-4116-BC2B-919B428AD084}。
他在注册表中的信息所在位置为: 
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Network/{4D36E972-E325-11CE-BFC1-08002BE10318}/{ACA306D0-1D69-4116-BC2B-919B428AD084}/Connection

若PnpInstanceID的值以PCI开头,说明是物理网卡,MediaSubType为01则是常见网卡,02为无线网卡。

以下代码是从上述网页中转贴。该例中仅当网卡为有线物理网卡时才返回true.

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;

}


获得正确本地MAC地址,区分虚拟网卡



void GetLocalMAC(char *buf)
{
IP_ADAPTER_INFO *IpAdaptersInfo =NULL;
IP_ADAPTER_INFO *IpAdaptersInfoHead =NULL;

IpAdaptersInfo = (IP_ADAPTER_INFO *) GlobalAlloc(GPTR, sizeof(IP_ADAPTER_INFO ));

if (IpAdaptersInfo == NULL)
{
  return;
}

DWORD dwDataSize = sizeof( IP_ADAPTER_INFO );
DWORD dwRetVal = GetAdaptersInfo(IpAdaptersInfo,&dwDataSize);

if ( ERROR_SUCCESS != dwRetVal)
{
  GlobalFree( IpAdaptersInfo );
  IpAdaptersInfo = NULL;

  if( ERROR_BUFFER_OVERFLOW == dwRetVal)
  {
   IpAdaptersInfo =(IP_ADAPTER_INFO *) GlobalAlloc( GPTR, dwDataSize );
   if (IpAdaptersInfo == NULL)
   {
    return;
   }
   if ( ERROR_SUCCESS != GetAdaptersInfo( IpAdaptersInfo, &dwDataSize ))
   {
    GlobalFree( IpAdaptersInfo );
    return;
   }

  }
  else
  {
   return;
  }

}

//Save the head pointer of IP_ADAPTER_INFO structures list.
IpAdaptersInfoHead = IpAdaptersInfo;

do{
  if (IsLocalAdapter(IpAdaptersInfo->AdapterName))
  {
   sprintf(buf,"%02x-%02x-%02x-%02x-%02x-%02x",
    IpAdaptersInfo->Address[0],
    IpAdaptersInfo->Address[1],
    IpAdaptersInfo->Address[2],
    IpAdaptersInfo->Address[3],
    IpAdaptersInfo->Address[4],
    IpAdaptersInfo->Address[5]);
   //
   break;
  }

  IpAdaptersInfo = IpAdaptersInfo->Next;

}while (IpAdaptersInfo);

if (IpAdaptersInfoHead != NULL)
{
  GlobalFree( IpAdaptersInfoHead );
}
}


BOOL IsLocalAdapter(char *pAdapterName)
{
BOOL ret_value = FALSE;

#define NET_CARD_KEY _T("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;
wsprintf(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;
}

以前的那个无法区分虚拟网卡,所以在得到MAC地址时会出现大量重复的现象,非常麻烦,这个就没有问题了。

HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Network/{4D36E972-E325-11CE-BFC1-08002BE10318}/{ACA306D0-1D69-4116-BC2B-919B428AD084}/Connection
网卡在注册表里的位置

区分PnpInstanceID,如果前面有PCI就是本机的真实网卡,MediaSubType为01则是常见网卡,02为无线网卡。
MAC地址冷知识:为什么你的电脑有多个?手把手教你区分有线/无线/虚拟网卡 本文深入解析MAC地址的工作原理,解释为何一台电脑会拥有多个MAC地址,并详细指导用户如何区分有线、无线及虚拟网卡。通过Windows和macOS系统的实操演示,帮助读者快速定位并理解各类网络接口的物理地址,同时探讨了MAC地址在网络接入控制、设备绑定及隐私安全方面的应用。 阅读详情

相关推荐

C#实现本地与远程网信息获取完整方案

在企业级网络管理、自动化运维以及系统监控等场景中,仅依靠本地网信息采集已无法满足跨主机资产识别和集中式配置审计的需求。为了实现对远程计算机的网状态、IP地址配置、MAC地址乃至网络性能参数的读取,开发者必须借助操作系统层面提供的远程管理接口。在Windows平台中,是实现此类功能的核心技术之一。它不仅允许程序以统一的方式访问本地或远程系统的硬件、服务、进程、注册表及网络设备信息,还支持通过标准查询语言进行高效筛选与关联分析。

weixin_35019679的博客 596

GetAdaptersInfo获取网信息

根据GetAdaptersInfo()如何区分类型 网可分为物理网卡虚拟网卡,其中物理网卡又可分为有线网和无线网,还有蓝牙设备的网。 简单的说,物理网卡就是硬件,虚拟网卡是软件。 详细点说,物理网卡就是安装在电脑主板上的有线或无线网,每块物理网卡都有不同的且唯一的物理地址(MAC地址); 虚拟网卡则是通过软件模拟网络环境,构建的虚拟网络适配器,一般是Microsoft Loopback Adapter,通过VPN技术实现虚拟网卡间的局域网通信。 GetAdaptersInfo(pAd

甜筒八部 的专栏 4026

使用Wireshark进行网络协议分析实验指南

Wireshark 是一款功能强大的开源网络协议分析工具,广泛应用于网络故障排查、安全审计与性能分析等领域。本章将引导读者完成 Wireshark 的基础安装与配置,并深入解析其图形化界面结构。Wireshark 支持 Windows、Linux 和 macOS 等主流操作系统,用户可访问其官网下载对应平台的安装包。安装过程中建议勾选TShark与组件,以确保具备完整的抓包能力。安装完成后,启动 Wireshark,界面将自动加载本地网络接口列表,为后续的数据包捕获做好准备。

weixin_30765637的博客 1442

java判断虚拟网卡_java 判断虚拟网卡物理网卡

读取注册表方式,jregistrykey.jar与jregistrykey.dll.通过“characteristics”值确定虚拟网卡还是物理网卡。该值在注册表的位置HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class\{4d36e972-e325-11ce-bfc1-08002be10318}\【连接索引号】\下privatestatic...

weixin_30989967的博客 377

windows下判断是否是虚拟网卡的方式

本文转载自http://blog.csdn.net/bjrxyz/article/details/54865248 windows下判断是否是虚拟网卡的方式 网上流传的判断虚拟网卡的方式通常是判断名称,以PCI开头的网都是真实网。因为以前网都是PCI网,不是的就是虚拟网卡。但是这种方式不一定全部正确,因为现在有些网不是PCI网,例如USB网,但是它依然是真

风清扬的博客 4281

winform C# 获取区分物理网卡虚拟网卡及无线网

转自:http://www.cnblogs.com/wfwup/archive/2009/12/04/1616904.html 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

awu999328的专栏 1681

判断本地网物理网卡还是虚拟网卡

GetAdaptersInfo 可以获得本机所有网的信息,然而这些网中可能包括虚拟网卡。例如,若安装了 VMWare 或者某些 VPN 客户端软件,则会出现若干虚拟网卡。它们在形式上与物理网卡几乎没有区别。 ipconfig 将它们与本地物理网卡等同对待。 有些人建议使用 MAC 地址中的 "locally administread bit" 来区分。而事实证明这是靠不住的。http:/

tutu619的博客 3195

Windows SDK获取网信息

1.MIB_IFROW structure 2.GetAdaptersInfo function 3.IP_ADAPTER_INFO structure 可获取信息 4.GetAdaptersAddresses function 5.IP_ADAPTER_ADDRESSES structure 可获取信息:

Greless的后花园 1869

判断MAC地址前缀

我们的电脑上现在可是很多的网,因为存在虚拟网卡,Lan口和wifi网等等。 之前有人给出判断的前缀,但是不够完整。可以从这里下载完整的资料。 http://standards-oui.ieee.org/oui/oui.txt

chengg0769 平淡无奇见真知 独立博客: http://blog.mis2erp.com 2622

学习Linux——网络——网

是计算机接入网络的 “核心接口”,分为物理网卡(连接外部网络)和虚拟网卡(满足内部通信场景)。掌握网的查看、启用、配置等操作,是解决网络连通性问题和搭建网络服务的基础。

kblj5555的博客 1524

深入浅出链路本地地址(Link-Local Address):本地网络的“隐形桥梁”

前言:在网络配置中,我们常常会遇到一类特殊的IP地址——它们既不是公网IP,也不是我们手动配置的内网IP,却在本地通信中扮演着至关重要的角色。这就是 链路本地地址(Link-Local Address),一个藏在设备与设备之间的“隐形桥梁”。本文将带你全面了解链路本地地址的本质、作用及实际应用场景。

weixin_66855479的博客 1771

深入解析Go语言net库:Addr与AddrError的核心应用与最佳实践

本文深入解析了Go语言net库中的Addr接口和AddrError类型,涵盖它们的设计原理、核心方法及实际应用。Addr作为网络地址的通用接口,支持多种具体地址类型;AddrError则用于处理地址相关错误,提供临时/超时错误的判断能力。文章通过代码示例展示了本地地址获取、错误处理等常见场景,并给出最佳实践建议,如三层错误过滤、防御性编程等。这些特性在网络编程、服务发现等场景中尤为重要,能显著提升代码健壮性。最后邀请读者互动讨论,共同提升Go网络编程能力。

Tekin 是深耕技术 20 年的全栈实战派专家,精通 Go/Python/Java 等多语言开发。博客专注技术原理与实战结合,深度解析 Python 高阶编程、Go 语言架构、数据库优化等硬核内容。涵盖并发编程、机器学习、云原生等前沿领域,通过真实案例拆 1119

调整KVM服务器

2.调整KVM服务器 问题 沿用练习一,通过对KVM服务器做适当调整,为KVM虚拟机的网络访问及磁盘存储提供条件。主要完成以下事项: 1)建立隔离网virbr1 2)建立桥接网br0 3)建立一个不小于40G的文件系统,挂载到 /data/作为虚拟机的专用空间 方案 KVM的虚拟网络类型: 1)桥接模式:Guest与Host连接到同一个交换机上;通过桥接物理网卡,相当于直连到Host所在网...

Linux的成长历程 555

cloudstack网络部分知识点汇总

基础概念理解

木有 2878
上一篇: sniffer技术原理及应用,包括编程方法和工具使用
下一篇: 对一个虚拟网卡驱动程序的剖析(三):网卡的初始化函数MiniportInitialize
chief1985
博客等级 码龄21年 1545粉丝 879原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值