windows 上面虚拟网卡(vNIC)安装时会自动配置 “SYSTEM\\CurrentControlSet\\Control\\Class\\{4d36e972-e325-11ce-bfc1-08002be10318}” 注册类,但具体安装在这个注册类哪一项没有明确的值(不是一个固定值,每次安装驱动到操作系统都会不同),所以想要获取其的注册项,只有采取枚举注册项的办法来实现,NetCfgInstanceId 子项代表了配置的网卡实例编号,我们需要在 windows 上访问 tuntap 的网卡的话就必须要拿到这个设备实例的 GUID。

const char* GetComponentId()
{
    char szOwnerKeyPath[] = "SYSTEM\\CurrentControlSet\\Control\\Class\\{4d36e972-e325-11ce-bfc1-08002be10318}";
    HKEY hOwnerKey = NULL; // {4d36e972-e325-11ce-bfc1-08002be10318}:类别:NSIS网卡驱动
    char* szDevComponentId = NULL;
    if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, szOwnerKeyPath, 0, KEY_ALL_ACCESS, &hOwnerKey) == ERROR_SUCCESS)
    {
        char szClassName[MAX_PATH];
        DWORD dwIndex = 0;
        while (szDevComponentId == NULL && RegEnumKeyA(hOwnerKey, dwIndex++, szClassName, MAX_PATH) == ERROR_SUCCESS)
        {
            BYTE data[MAX_PATH];
            DWORD dwRegType = REG_NONE;
            DWORD dwSize = sizeof(data);
            HKEY hSubKey = NULL;
            char szSubKeyPath[MAX_PATH];
            sprintf(szSubKeyPath, "%s\\%s", szOwnerKeyPath, szClassName);
            if (RegOpenKeyA(HKEY_LOCAL_MACHINE, szSubKeyPath, &hSubKey) != ERROR_SUCCESS)
            {
                continue;
            }
            if (RegQueryValueExA(hSubKey, "ComponentId", NULL, &dwRegType, data, &dwSize) == ERROR_SUCCESS && dwRegType == REG_SZ)
            {
                dwSize = sizeof(data);
                if (strcmp("tap0901", (char*)data) == 0 && RegQueryValueExA(hSubKey, "NetCfgInstanceId", NULL,
                    &dwRegType, data, &dwSize) == ERROR_SUCCESS && dwRegType == REG_SZ)
                {
                    szDevComponentId = (char*)memcpy(__malloc(dwSize), data, dwSize);
                }
            }
            RegCloseKey(hSubKey);
        }
        RegCloseKey(hOwnerKey);
    }
    return szDevComponentId;
}

C++ 在 windows 下获取 tuntap 虚拟网卡的 ComponentId相关推荐

  1. Windows下获取视频设备的一种改进实现

    之前在https://blog.csdn.net/fengbingchun/article/details/102806822中介绍过在Windows下获取视频设备列表的方法.其实那种实现方法是有缺陷 ...

  2. windows下apache配置虚拟主机的两个方法

    windows下apache配置虚拟主机方法一: 对httpd.conf进行设置: 1.注释以下三行 #ServerAdmin #ServerName #DocumentRoot 2.去掉mod_pr ...

  3. C++在windows下获取本地主机ipv4地址和ipv6地址的代码

    把内容过程中经常用的内容段记录起来,下面内容段是关于C++在windows下获取本地主机ipv4地址和ipv6地址的内容,应该是对码农有所用处. #include <Winsock2.h> ...

  4. Windows下获取usb视频设备vendor id和product id的4种方法

    之前在https://blog.csdn.net/fengbingchun/article/details/103507754 博文中介绍过如何在Linux获取usb视频设备的vendor id和pr ...

  5. c语言windows获取时间,【转载】c/c++在windows下获取时间和计算时间差的几种方法总结...

    一.标准C和C++都可用 1.获取时间用time_t time( time_t * timer ),计算时间差使用double difftime( time_t timer1, time_t time ...

  6. Windows XP中安装虚拟网卡microsoft loopback adapter

    在安装虚拟机Vmware后,如果要实现本机和虚拟机的互通,则必须要求本机是有一个联网的环境.在没有该环境下可以通过安装虚拟网卡的形式来实现.在Windows XP中可以通过安装Microsoft Lo ...

  7. 虚拟机里提示计算机内存不足,windows下打开VMware虚拟机时提示内存不足的处理方法...

    参考:http://thinkpig007.blog.51cto.com/971471/1589831 以管理员身份运行vmware.exe即可 错误的错误提示: Not enough physica ...

  8. c/c++在windows下获取时间和计算时间差的几种方法总结

    一.标准C和C++都可用 1.获取时间用time_t time( time_t * timer ),计算时间差使用double difftime( time_t timer1, time_t time ...

  9. bat中文乱码_详解Windows下获取时间bat脚本总结,值得收藏

    概述 最近都在写ftp windows环境的一些bat脚本,为了方便显示,想要记录一下每次操作的时间,所以在这里总结一下windows环境bat脚本获取时间的常用命令. windows环境获取时间相关 ...

最新文章

  1. Linux版rpm与deb格式,如何转换从RPM到DEB和DEB到RPM包使用Alien
  2. jzoj1082-合并果子【堆,贪心】
  3. 算法(21)-leetcode-剑指offer5
  4. BZOJ 2440 完全平方数
  5. Linux 命令(53)—— exit 命令(builtin)
  6. 复制一段话,发现收费怎么办,下边帮你解决
  7. server使用abp中调用存储过程 sql_ABP中连接已有数据库执行Sql或存储过程
  8. Git之路——配置SSH免密码登录
  9. Matlab聚类分析/判别分析
  10. 基于Unity开发的鼠标打飞碟游戏设计
  11. 小程序顶部标题栏的背景图片设置
  12. 一个low逼的boofuzz脚本生成器
  13. 鸿蒙造化体内微粒,开辟鸿蒙,谁为情种?
  14. filters过滤器
  15. PS获取图片三种方式
  16. 钆螯合层析结合对比剂/DPPE-DTPA-Gd-DPPE造影剂/DMPE-DTPA-Gd-DMPE造影剂
  17. daytime协议的服务器和客户端程序,用Socket套接字实现DAYTIME协议的服务器和客户端程序.doc...
  18. JSD-2204-MVC-微博项目-Day15
  19. 对IPv6的理解以及其与IPv4的区别
  20. 传奇服务端服务端运行7个窗口的各窗口功能讲解

热门文章

  1. 将jpg文件转换成bgr二进制文件
  2. 时下在网络上流行的电子图书清单
  3. 一款团队图片管理系统-欧奥图库
  4. 挨踢库(进名企就这么简单)实战开发-李珊-专题视频课程
  5. how to management
  6. 用计算机解锁ipad密码忘了怎么办,iPad密码忘记了怎么办_iPad密码忘记解锁办法-太平洋IT百科手机版...
  7. Unity 批量修改场景预制体,删除空Animation组件
  8. Windows10 修改host文件(windows 设置ip别名)
  9. 安装MySQL和配置MySQL主从遇到的坑合集
  10. .native的使用