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

PCI开头的网卡都是真实网卡。因为以前网卡都是PCI网卡,不是的就是虚拟网卡。但是这种方式不一定全部正确,因为现在有些网卡不是PCI网卡,例如USB网卡,但是它依然是真实网卡。所以这种方法就不在可靠了。 

最可靠的方法是读取注册表来判断,是我目前发现的最可靠的方法。 

首先要知道网卡的名字,可以通过GetAdaptersInfo获取到 

然后用GetAdaptersInfo获取和此名字相同的网卡信息PIP_ADAPTER_INFO结构中的AdapterName字段。注意AdapterName并不是指我们通常看到的名字,而是一段字符和数字组合的文字,我们通常看到的网卡的名字是Description字段。 

然后用AdapterName字段中的内容找到注册表中的对应的位置,可以让我们找到网卡的相信信息。 

网卡信息存在注册表的HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}中,这个键下面有一些子键,这些子键中的NetCfgInstanceId的值对应的就是我们刚才查找到的AdapterName。这个子键中的Characteristics的值就可以判断是否是虚拟网卡,Characteristics本质是一些按位存储的值得集合: 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的值就可以判断网卡是虚拟网卡还是物理网卡。 

看一下这个值和4进行与运算是否大于0,大于0的就是物理的网卡。