网上流传的判断虚拟网卡的方式通常是判断网卡名称,以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的就是物理的网卡。
新闻热点
疑难解答