C++ 在 windows 下获取 tuntap 虚拟网卡的 ComponentId

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;
}

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值