- 枚举注册表网卡信息
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4d36e972-e325-11ce-bfc1-08002be10318}
- 读取没一项的
Characteristics
、NetCfgInstanceId
信息 Characteristics & NCF_PHYSICAL
即为物理网卡
Characteristics值
类型 | 值 | 说明 |
---|---|---|
NCF_VIRTUAL | 0x01 | 组件是一个虚拟适配器 |
NCF_SOFTWARE_ENUMERATED | 0x02 | 组件是一个软件模拟的适配器 |
NCF_PHYSICAL | 0x04 | 组件是一个物理适配器 |
NCF_HIDDEN | 0x08 | 组件不显示用户接口 |
NCF_NO_SERVICE | 0x10 | 组件没有相关的服务(设 备驱动程序) |
NCF_NOT_USER_REMOVABLE | 0x20 | 组件不能被用户删除(例如,通过控制面板或设备管理器) |
NCF_MULTIPORT_INSTANCED_ADAPTER | 0x40 | 组件有多个端口,每个端口作为单独的设备安装。每个端口有自己的hw_id(组件ID)并可被单独安装,这只适合于EISA适配器 |
NCF_HAS_UI | 0x80 | 组件支持用户接口(例如,Advanced Page或Customer Properties Sheet) |
NCF_FILTER | 0x400 | 组件是一个过滤器 |
NetCfgInstanceId(需要管理员权限)
PIP_ADAPTER_INFO
的AdapterName
字段
std::map<std::string, DWORD> netcard_control_info()
{
std::map<std::string, DWORD> ret_val;
std::vector<std::string> vec_keys;
Registry::EnumKey(HKEY_LOCAL_MACHINE, _T("SYSTEM\\CurrentControlSet\\Control\\Class\\{4d36e972-e325-11ce-bfc1-08002be10318}"), vec_keys, false, true);
for (auto& item : vec_keys)
{
std::string NetCfgInstanceId;
DWORD Characteristics;
Registry::Read(HKEY_LOCAL_MACHINE, item.c_str(), "NetCfgInstanceId", NetCfgInstanceId);
Registry::Read(HKEY_LOCAL_MACHINE, item.c_str(), "Characteristics", Characteristics);
ret_val[NetCfgInstanceId] = Characteristics;
}
return ret_val;
}
bool is_virtual_netcard(const std::string& id, const std::map<std::string, DWORD>& flags)
{
if (flags.count(id))
{
DWORD dwflags = flags.at(id);
return (~dwflags & 0x04) != 0;
}
return false;
}
示例
std::map<std::string, DWORD> netcardc_info = netcard_control_info();
bool is_virtual = is_virtual_netcard(pIpAdapterInfo->AdapterName, netcardc_info);