C/C++ 实现Windows注册表操作
Windows注册表(Registry)是Windows操作系统中用于存储系统配置信息、用户设置和应用程序数据的一个集中式数据库。它是一个层次结构的数据库,由键(Key)和值(Value)组成,这些键和值被用于存储各种系统和应用程序的配置信息。
以下是注册表的一些基本概念:
- 键(Key): 注册表中的数据结构,类似于文件夹,用于组织和存储相关的信息。每个键可以包含子键和/或值。
- 子键(Subkey): 位于注册表中的键的层次结构中的更深一层的键。子键可以包含其他子键或值。
- 值(Value): 存储在注册表中的数据单元,通常与键相关联。值可以包含配置信息、用户设置等数据。
- 数据类型(Data Type): 值的数据类型定义了值的内容和用途。常见的数据类型包括字符串、整数、二进制数据等。
- 根键(Root Key): 注册表的最顶层,有几个根键,常见的包括
HKEY_CLASSES_ROOT、HKEY_CURRENT_USER、HKEY_LOCAL_MACHINE等。
Windows注册表的作用包括:
- 存储系统配置信息: 注册表中存储了操作系统的配置信息,包括系统启动时需要加载的驱动程序、系统服务、文件关联等。
- 存储用户设置: 注册表中存储了用户特定的设置,如桌面背景、主题、鼠标指针样式等。
- 应用程序配置: 许多应用程序使用注册表存储其配置信息。当应用程序安装时,它可能会在注册表中创建相关的键和值来保存配置。
- 组织系统和应用程序数据: 注册表提供了一个结构化的方式来组织系统和应用程序需要存储的数据,使得操作系统和应用程序可以轻松地检索和修改配置信息。
- 提供对系统设置的访问: 通过注册表,用户和系统管理员可以访问和修改系统的各种设置,从而对系统行为进行调整和优化。
枚举注册表项
RegOpenKeyEx 是一个用于打开指定的注册表键的 Windows API 函数。它允许应用程序访问和操作 Windows 注册表的子键。在较新的 Windows 版本中,例如 Windows 10,RegOpenKeyEx 已被推荐的函数 RegOpenKey 和 RegOpenKeyEx 代替。以下是 RegOpenKeyEx 的一般用法:
LSTATUS RegOpenKeyEx(HKEY hKey,LPCTSTR lpSubKey,DWORD ulOptions,REGSAM samDesired,PHKEY phkResult
);
参数说明:
hKey: 指定要打开的基础键的句柄,可以是HKEY_CLASSES_ROOT、HKEY_CURRENT_USER、HKEY_LOCAL_MACHINE等。lpSubKey: 指定相对于hKey的子键路径。ulOptions: 保留参数,通常可以设置为 0。samDesired: 指定键的访问权限,例如KEY_READ或KEY_WRITE。phkResult: 接收指向打开的注册表键的句柄的指针。
函数返回值:
- 如果函数调用成功,返回
ERROR_SUCCESS。 - 如果函数调用失败,返回一个错误代码。
RegEnumValue 用于列举指定注册表键中的值。它可以用来遍历注册表键中的所有值,以便你可以获取键中包含的信息。以下是 RegEnumValue 的一般用法:
LSTATUS RegEnumValue(HKEY hKey,DWORD dwIndex,LPTSTR lpValueName,LPDWORD lpcchValueName,LPDWORD lpReserved,LPDWORD lpType,LPBYTE lpData,LPDWORD lpcbData
);
参数说明:
hKey: 指定要列举值的注册表键的句柄。dwIndex: 指定要检索的值的索引。从 0 开始,逐渐递增。lpValueName: 接收值的名称的缓冲区。lpcchValueName: 接收值名称的缓冲区大小的指针。在调用函数之前,你应该将其设置为缓冲区大小。lpReserved: 保留参数,通常可以设置为 NULL。lpType: 接收值的数据类型的指针。lpData: 接收值的数据的缓冲区。lpcbData: 接收数据缓冲区大小的指针。在调用函数之前,你应该将其设置为缓冲区大小。
函数返回值:
- 如果函数调用成功,返回
ERROR_SUCCESS。 - 如果函数调用失败,返回一个错误代码。
枚举指定键值对中是否存在值,如果存在则循环将其输出。
#include <stdio.h>
#include <Windows.h>void Enum_Regedit(HKEY Reg_Root,const char *Reg_Path)
{HKEY hKey = NULL;DWORD dwType = 0;char szValueName[MAXBYTE], szValueKey[MAXBYTE] = { 0 };DWORD dwBufferSize = MAXBYTE, dwKeySize = MAXBYTE;// 打开注册表项LONG lRet = RegOpenKeyEx(Reg_Root, Reg_Path, 0, KEY_ALL_ACCESS, &hKey);int index = 0;while (1){// 枚举注册表键项lRet = RegEnumValue(hKey, index, szValueName, &dwBufferSize, NULL,&dwType, (unsigned char *)szValueKey, &dwKeySize);if (lRet == ERROR_NO_MORE_ITEMS)break;printf("序号: %3d 名称: %-25s 值: %-50s 类型: ", index, szValueName, szValueKey);switch (dwType){case 1: printf("REG_SZ \n"); break;case 2: printf("REG_EXPAND_SZ \n"); break;case 4: printf("REG_DWORD \n"); break;case 7: printf("REG_MULTI_SZ \n"); break;default: printf("None \n"); break;}dwBufferSize = MAXBYTE;dwKeySize = MAXBYTE;index++;}RegCloseKey(hKey);
}int main(int argc, char *argv[])
{// 枚举普通启动项Enum_Regedit(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Run");Enum_Regedit(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Run");// 枚举Boot启动项// HKLM\System\CurrentControlSet\Control\Session Manager\BootExecuteEnum_Regedit(HKEY_LOCAL_MACHINE, "System\\CurrentControlSet\\Control\\Session Manager\\");// 枚举ActiveX启动项,在子键中添加SubPath即可完成开机自启动.Enum_Regedit(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Active Setup\\Installed Components\\");system("pause");return 0;
}
添加注册表项
RegCreateKey 是用于创建或打开指定的注册表键。如果键不存在,则它将被创建;如果存在,则它将被打开。以下是 RegCreateKey 的一般用法:
LSTATUS RegCreateKey(HKEY hKey,LPCTSTR lpSubKey,PHKEY phkResult
);
参数说明:
hKey: 指定要创建或打开的基础键的句柄,可以是HKEY_CLASSES_ROOT、HKEY_CURRENT_USER、HKEY_LOCAL_MACHINE等。lpSubKey: 指定相对于hKey的子键路径。phkResult: 接收指向创建或打开的注册表键的句柄的指针。
函数返回值:
- 如果函数调用成功,返回
ERROR_SUCCESS。 - 如果函数调用失败,返回一个错误代码。
RegSetValueEx 是用于在指定的注册表键中设置一个值。它可以用于创建新的键值,也可以用于修改现有键值。以下是 RegSetValueEx 的一般用法:
LSTATUS RegSetValueEx(HKEY hKey,LPCTSTR lpValueName,DWORD Reserved,DWORD dwType,const BYTE *lpData,DWORD cbData
);
参数说明:
hKey: 指定要设置值的注册表键的句柄。lpValueName: 指定要设置的值的名称。Reserved: 保留参数,通常可以设置为 0。dwType: 指定值的数据类型,例如REG_SZ表示字符串。lpData: 指定要设置的值的数据。cbData: 指定数据的大小。
函数返回值:
- 如果函数调用成功,返回
ERROR_SUCCESS。 - 如果函数调用失败,返回一个错误代码。
通过获取自身进程名称,并将该进程路径写入到CurrentVersion变量中实现开机自启。
#include <stdio.h>
#include <Windows.h>#define Reg_Path "Software\\Microsoft\\Windows\\CurrentVersion\\Run"BOOL Reg_Regedit(HKEY Reg_Root,char *lpszFileName, char *lpszValueName)
{HKEY hKey;if (ERROR_SUCCESS != RegOpenKeyEx(Reg_Root, Reg_Path, 0, KEY_WRITE, &hKey)){return FALSE;}if (ERROR_SUCCESS != RegSetValueEx(hKey, lpszValueName, 0, REG_SZ, (BYTE *)lpszFileName, (1 + ::lstrlen(lpszFileName)))){RegCloseKey(hKey);return FALSE;}RegCloseKey(hKey);return TRUE;
}int main(int argc, char *argv[])
{TCHAR szPath[MAX_PATH] = { 0 };if (GetModuleFileName(NULL, szPath, MAX_PATH)){int ret = Reg_Regedit(HKEY_CURRENT_USER, szPath, "main");if (ret == 1)printf("添加自身启动项成功 \n");}system("pause");return 0;
}
注册表项不仅可以实现开机自启动,由于Win系统都是在注册表之上工作的,只要向指定位置写入键值,即可实现许多不可思议的功能。
// 禁用系统任务管理器
void RegTaskmanagerForbidden()
{HKEY hkey;DWORD value = 1;RegCreateKey(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", &hkey);RegSetValueEx(hkey, "DisableTaskMgr", NULL, REG_DWORD, (LPBYTE)&value, sizeof(DWORD));RegCloseKey(hkey);
}// 禁用注册表编辑器
void RegEditForbidden()
{HKEY hkey;DWORD value = 1;RegCreateKey(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", &hkey);RegSetValueEx(hkey, "DisableRegistryTools", NULL, REG_DWORD, (LPBYTE)&value, sizeof(DWORD));RegCloseKey(hkey);
}// 干掉桌面壁纸
void RegModifyBackroud()
{DWORD value = 1;HKEY hkey;RegCreateKey(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", &hkey);RegSetValueEx(hkey, "Wallpaper", NULL, REG_SZ, (unsigned char *)"c://", 3);RegSetValueEx(hkey, "WallpaperStyle", NULL, REG_DWORD, (LPBYTE)&value, sizeof(DWORD));
}
判断键值状态
RegQueryValueEx 是用于检索指定注册表键中的指定值。它可以用来获取注册表键中的数据,例如字符串、整数等。以下是 RegQueryValueEx 的一般用法:
LSTATUS RegQueryValueEx(HKEY hKey,LPCTSTR lpValueName,LPDWORD lpReserved,LPDWORD lpType,LPBYTE lpData,LPDWORD lpcbData
);
参数说明:
hKey: 指定要查询值的注册表键的句柄。lpValueName: 指定要查询的值的名称。lpReserved: 保留参数,通常可以设置为 NULL。lpType: 接收值的数据类型的指针。lpData: 接收值的数据的缓冲区。lpcbData: 接收数据缓冲区大小的指针。在调用函数之前,你应该将其设置为缓冲区大小。
函数返回值:
- 如果函数调用成功,返回
ERROR_SUCCESS。 - 如果函数调用失败,返回一个错误代码。
判断指定键值对是否存在,是否被设置过.
#include <stdio.h>
#include <Windows.h>#define Reg_Path "Software\\Microsoft\\Windows\\CurrentVersion\\Run"BOOL Check_Regedit(HKEY Reg_Root,char * name)
{HKEY hKey;if (ERROR_SUCCESS == RegOpenKeyEx(Reg_Root, Reg_Path, NULL, KEY_ALL_ACCESS, &hKey)){DWORD dwSize = 255, dwType = REG_SZ;char String[256];if (ERROR_SUCCESS == RegQueryValueEx(hKey, name, 0, &dwType, (BYTE *)String, &dwSize)){return true;}}RegCloseKey(hKey);return false;
}int main(int argc, char *argv[])
{int ret = Check_Regedit(HKEY_CURRENT_USER, "ctfmon");printf("启动项存在: %d \n", ret);system("pause");return 0;
}
删除键值对
RegDeleteValue 是用于删除指定注册表键中的指定值。它可以用来删除注册表键中的数据值。以下是 RegDeleteValue 的一般用法:
LSTATUS RegDeleteValue(HKEY hKey,LPCTSTR lpValueName
);
参数说明:
hKey: 指定要删除值的注册表键的句柄。lpValueName: 指定要删除的值的名称。
函数返回值:
- 如果函数调用成功,返回
ERROR_SUCCESS。 - 如果函数调用失败,返回一个错误代码。
传入需要删除的注册表位置,以及该表中键值对的名字即可完成删除。
#include <stdio.h>
#include <Windows.h>void Delete_Regedit(const char *Reg_Path,const char *Key_Name)
{char szKeyName[MAXBYTE] = { 0 };HKEY hKey = NULL;LONG lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, Reg_Path, 0, KEY_ALL_ACCESS, &hKey);RegDeleteValue(hKey, Key_Name);RegCloseKey(hKey);
}int main(int argc, char *argv[])
{Delete_Regedit("Software\\Microsoft\\Windows\\CurrentVersion\\Run", "main1");system("pause");return 0;
}
相关文章:
C/C++ 实现Windows注册表操作
Windows注册表(Registry)是Windows操作系统中用于存储系统配置信息、用户设置和应用程序数据的一个集中式数据库。它是一个层次结构的数据库,由键(Key)和值(Value)组成,这些键和值被…...
nginx 模块相关配置及结构理解
文章目录 模块配置结构模块配置指令先看一下 ngx_command_t 结构一个模块配置的demo简单模块配置的案例演示 模块上下文结构模块的定义 模块配置结构 Nginx中每个模块都会提供一些指令,以便于用户通过配置去控制该模块的行为。 Nginx的配置信息分成了几个作用域(sc…...
同时创建多个websoket(初始化多个连接、断开的重连、每个连接定时发消息、每个连接存储接收的数据(vuex或者pinia))
可复制现成代码直接使用!! 1.下边的例子演示了创建10个WebSocket 实例,当其中某一个连接失败时,会自动进行重连 <template><div></div> </template><script setup> import { ref, reactive, onMo…...
C语言——指针(一)
📝前言 这篇文章主要带大家初步认识一下指针,供大家理解参考。 主要归纳与讲解: 1,指针与指针变量 2,指针的基本使用(如何定义,初始化,引用) 🎬个人简介&…...
学习量化交易如何入门?
Python 量化入门很简单,只需 3 步就能快速上手! 题主在程序方向没有相关经验,今天就从量化行业的通用语言-Python 着手,教大家如何快速入门。 一、准备工作 在开始 Python 编程之前,首先需要确保你的计算机上安装了合适的 Pytho…...
CSS3动画
在CSS3中新增了一个很有意思的东西,那就是动画,有了动画我们可以做很多的事情,让我为大家介绍一下动画吧! 本篇文章关于介绍动画,利用小球移动为你们介绍一下动画 默认样式: <!DOCTYPE html> <ht…...
黑马点评-10实现用户点赞和点赞排行榜功能
用户点赞功能 如果用户只要点赞一次就对数据库中blog表中的liked字段的值加1就会导致一个用户无限点赞 PutMapping("/like/{id}") public Result likeBlog(PathVariable("id") Long id) {// 修改点赞数量,update tb_blog set liked liked 1 where id …...
Spring配置其他注解Spring注解的解析原理
Spring配置其他注解 Primary注解用于标注相同类型的Bean优先被使用权,Primary是Spring 3.0引入的,与Component和Bean一起使用,标注该Bean的优先级更高,则在通过类型获取Bean或通过Autowired根据类型进行注入时,会选用优…...
TypeScript 学习笔记 第一部分 语法基础
【视频链接】尚硅谷TypeScript教程(李立超老师TS新课) TypeScript 1. 类型1.1 | 联合类型1.2 字面量类型1.3 any 任意类型1.4 unkown 类型1.5 as 类型断言1.6 object 对象类型1.7 { } 对象类型1.8 ? 对象中的可选属性1.9 对象中的任意属性1.1…...
【element优化经验】怎么让element-ui中表单多语言切换排版不乱
目录 前言: 痛点: 1.左对齐,右对齐在中文和外语情况下字数不同,固定宽度会使名称换行,不在整行对齐,影响美观。 2.如果名称和输入框不在一行,会使页面越来越长 3.label-width值给变量&#…...
软件设计中如何画各类图之一实体关系图(ER图):数据库设计与分析的核心工具
目录 1 前言2 符号及作用:3 绘制清晰的ER图步骤4 实体关系图的用途5 使用场景6 实际应用场景举例7 结语 1 前言 当谈到数据库设计与分析的核心工具时,实体关系图(ER图)无疑是其中最重要的一环。在软件开发、信息管理以及数据库设…...
【神印王座】龙皓晨美妆胜过月夜,魔神皇识破无视,撮合月夜阿宝
Hello,小伙伴们,我是拾荒君。 《神印王座》国漫第82集已更新,拾荒君和大多数人一样,更新就去看了。魔神皇枫秀,威严凛然,突然空降月魔宫,整个宫殿都在这股无与伦比的强大气息中颤栗。为了顺利躲避魔神皇的…...
汽车级全保护型六路半桥驱动器NCV7708FDWR2G 原理、参数及应用
NCV7708FDWR2G 是一款全保护型六路半桥驱动器,特别适用于汽车和工业运动控制应用。六个高压侧和低压侧驱动器可自由配置,也可单独控制。因此可实现高压侧、低压侧和 H 桥控制。H 桥控制提供正向、逆向、制动和高阻抗状态。驱动器通过标准 SPI 接口进行控…...
【小技巧】MyBatis 中 SQL 写法技巧小总结
最近有个兄弟在搞mybatis,问我怎么写sql ,说简单一点mybatis就是写原生sql,官方都说了 mybatis 的动态sql语句是基于 OGNL表达式的。可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类: if 语句 (简单的条件…...
C#编程题分享(4)
换行输出整数问题 输⼊任意⼀个位数未知的整数,输出这个数每⼀位上的数字。输出的时候,从个位开始输出,每输出⼀个数字换⼀⾏。样例输⼊:3547 输出:7 换行输出 4 换行输出5 换行输出3 int n Convert.ToInt32(Conso…...
CTF靶场搭建及Web赛题制作与终端docker环境部署
♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ 写在前面 ╔═══════════════════════════════════════════════════…...
nodejs express vue uniapp新闻发布系统源码
开发技术: node.js,mysql5.7,vscode,HBuilder nodejs express vue uniapp 功能介绍: 用户端: 登录注册 首页显示搜索新闻,新闻分类,新闻列表 点击新闻进入新闻详情࿰…...
FastText模型文本分类
项目地址:NLP-Application-and-Practice/07_FastText/7.2-FastText文本分类/text_classification at master zz-zik/NLP-Application-and-Practice (github.com) 加载数据 load_data.py # coding: UTF-8 import os import pickle as pkl from tqdm import tqdmMA…...
CentOS 7 使用Fmt库
安装 fmt Git下载地址:https://github.com/fmtlib/fmt 步骤1:首先,你需要下载fmt的源代码。你可以从https://github.com/fmtlib/fmt或者源代码官方网站下载。并上传至/usr/local/source_code/ 步骤2:下载完成后ÿ…...
如何通过宝塔面板搭建一个本地MySQL数据库服务并实现远程访问
宝塔安装MySQL数据库,并内网穿透实现公网远程访问 文章目录 宝塔安装MySQL数据库,并内网穿透实现公网远程访问前言1.Mysql服务安装2.创建数据库3.安装cpolar3.2 创建HTTP隧道 4.远程连接5.固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网…...
以车载+智视布局亮相北京车展,元视芯冲刺CIS第一梯队
2026(第十八届)北京国际汽车展览会盛大启幕,全球汽车产业聚焦智能化、电动化转型浪潮。元视芯携MAT Series车载CIS全矩阵产品重磅参展,全面展示车载成像硬核实力,同步释放AI视觉新赛道布局,以技术创新赋能智…...
通过API调用日志分析模型使用习惯与优化调用策略
通过API调用日志分析模型使用习惯与优化调用策略 1. 审计日志功能概述 Taotoken平台为开发者提供了完整的API调用审计日志功能。所有通过平台发起的模型请求均会记录关键元数据,包括调用时间、模型ID、Token消耗量、响应状态码等字段。这些数据以结构化的形式存储…...
NsEmuTools:让NS模拟器管理变得简单高效的跨平台自动化方案
NsEmuTools:让NS模拟器管理变得简单高效的跨平台自动化方案 【免费下载链接】ns-emu-tools 一个用于安装/更新 NS 模拟器的工具 项目地址: https://gitcode.com/gh_mirrors/ns/ns-emu-tools 您是否曾经为了安装和配置NS模拟器而花费数小时?是否在…...
使用 Taotoken 官方风格 SDK 在 Python 项目中实现多模型切换调用
使用 Taotoken 官方风格 SDK 在 Python 项目中实现多模型切换调用 1. 准备工作 在开始迁移代码之前,需要确保已完成 Taotoken 平台的账号注册并获取有效的 API Key。登录 Taotoken 控制台后,可以在「API 密钥管理」页面创建新的密钥。同时建议在「模型…...
【2026企业级缓存治理黄金标准】:基于17家头部客户压测报告的Dify缓存调优清单
更多请点击: https://intelliparadigm.com 第一章:Dify 2026缓存治理的演进逻辑与黄金标准定义 随着 LLM 应用规模化部署,Dify 平台在 2026 版本中重构了缓存治理体系——从“响应级静态快照”跃迁至“语义感知动态分层缓存”,核…...
使用 Nodejs 和 Taotoken 为你的应用后端添加智能对话功能
使用 Nodejs 和 Taotoken 为你的应用后端添加智能对话功能 1. 准备工作 在开始集成 Taotoken 之前,需要确保你的开发环境已经具备以下条件。首先,确保 Node.js 版本在 16 或更高,这是大多数现代 JavaScript 特性的最低要求。其次࿰…...
Bandizip下载 v8.00 官网免费版 专业的电脑文件解压缩软件
Bandizip是一款电脑上的解压缩软件。借助它,你可以快速压缩各种文件,或者解压各种格式的压缩包,其功能效果类似于WinRAR、7-Zip等软件。它最大的特点,就是界面更加美观,非常现代化,也很简洁。 软件支持压缩…...
从‘手’到‘眼’的坐标系迷宫:一文讲透线激光手眼标定里的欧拉角、四元数与旋转矩阵(避坑指南)
从‘手’到‘眼’的坐标系迷宫:一文讲透线激光手眼标定里的欧拉角、四元数与旋转矩阵(避坑指南) 在工业机器人与视觉传感器的协同作业中,手眼标定是确保精准操作的关键环节。想象一下,当机械臂需要根据激光传感器捕捉的…...
探索三维互联网:Firefox Reality如何重新定义VR/AR浏览体验
探索三维互联网:Firefox Reality如何重新定义VR/AR浏览体验 【免费下载链接】FirefoxReality A fast and secure browser for standalone virtual-reality and augmented-reality headsets. 项目地址: https://gitcode.com/gh_mirrors/fi/FirefoxReality 想象…...
ENACT基准:评估视觉语言模型在具身认知中的关键能力
1. 项目背景与核心价值 具身认知(Embodied Cognition)正成为AI领域的前沿方向,它强调智能体通过与环境的物理交互来发展认知能力。而视觉语言模型(VLMs)作为多模态AI的代表,如何评估其在具身场景中的世界建…...
