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;
}
C++ 在 windows 下获取 tuntap 虚拟网卡的 ComponentId相关推荐
- Windows下获取视频设备的一种改进实现
之前在https://blog.csdn.net/fengbingchun/article/details/102806822中介绍过在Windows下获取视频设备列表的方法.其实那种实现方法是有缺陷 ...
- windows下apache配置虚拟主机的两个方法
windows下apache配置虚拟主机方法一: 对httpd.conf进行设置: 1.注释以下三行 #ServerAdmin #ServerName #DocumentRoot 2.去掉mod_pr ...
- C++在windows下获取本地主机ipv4地址和ipv6地址的代码
把内容过程中经常用的内容段记录起来,下面内容段是关于C++在windows下获取本地主机ipv4地址和ipv6地址的内容,应该是对码农有所用处. #include <Winsock2.h> ...
- Windows下获取usb视频设备vendor id和product id的4种方法
之前在https://blog.csdn.net/fengbingchun/article/details/103507754 博文中介绍过如何在Linux获取usb视频设备的vendor id和pr ...
- c语言windows获取时间,【转载】c/c++在windows下获取时间和计算时间差的几种方法总结...
一.标准C和C++都可用 1.获取时间用time_t time( time_t * timer ),计算时间差使用double difftime( time_t timer1, time_t time ...
- Windows XP中安装虚拟网卡microsoft loopback adapter
在安装虚拟机Vmware后,如果要实现本机和虚拟机的互通,则必须要求本机是有一个联网的环境.在没有该环境下可以通过安装虚拟网卡的形式来实现.在Windows XP中可以通过安装Microsoft Lo ...
- 虚拟机里提示计算机内存不足,windows下打开VMware虚拟机时提示内存不足的处理方法...
参考:http://thinkpig007.blog.51cto.com/971471/1589831 以管理员身份运行vmware.exe即可 错误的错误提示: Not enough physica ...
- c/c++在windows下获取时间和计算时间差的几种方法总结
一.标准C和C++都可用 1.获取时间用time_t time( time_t * timer ),计算时间差使用double difftime( time_t timer1, time_t time ...
- bat中文乱码_详解Windows下获取时间bat脚本总结,值得收藏
概述 最近都在写ftp windows环境的一些bat脚本,为了方便显示,想要记录一下每次操作的时间,所以在这里总结一下windows环境bat脚本获取时间的常用命令. windows环境获取时间相关 ...
最新文章
- Linux版rpm与deb格式,如何转换从RPM到DEB和DEB到RPM包使用Alien
- jzoj1082-合并果子【堆,贪心】
- 算法(21)-leetcode-剑指offer5
- BZOJ 2440 完全平方数
- Linux 命令(53)—— exit 命令(builtin)
- 复制一段话,发现收费怎么办,下边帮你解决
- server使用abp中调用存储过程 sql_ABP中连接已有数据库执行Sql或存储过程
- Git之路——配置SSH免密码登录
- Matlab聚类分析/判别分析
- 基于Unity开发的鼠标打飞碟游戏设计
- 小程序顶部标题栏的背景图片设置
- 一个low逼的boofuzz脚本生成器
- 鸿蒙造化体内微粒,开辟鸿蒙,谁为情种?
- filters过滤器
- PS获取图片三种方式
- 钆螯合层析结合对比剂/DPPE-DTPA-Gd-DPPE造影剂/DMPE-DTPA-Gd-DMPE造影剂
- daytime协议的服务器和客户端程序,用Socket套接字实现DAYTIME协议的服务器和客户端程序.doc...
- JSD-2204-MVC-微博项目-Day15
- 对IPv6的理解以及其与IPv4的区别
- 传奇服务端服务端运行7个窗口的各窗口功能讲解