C/C++ 实现Windows注册表操作

Windows注册表(Registry)是Windows操作系统中用于存储系统配置信息、用户设置和应用程序数据的一个集中式数据库。它是一个层次结构的数据库,由键(Key)和值(Value)组成,这些键和值被用于存储各种系统和应用程序的配置信息。

以下是注册表的一些基本概念:

  1. 键(Key): 注册表中的数据结构,类似于文件夹,用于组织和存储相关的信息。每个键可以包含子键和/或值。
  2. 子键(Subkey): 位于注册表中的键的层次结构中的更深一层的键。子键可以包含其他子键或值。
  3. 值(Value): 存储在注册表中的数据单元,通常与键相关联。值可以包含配置信息、用户设置等数据。
  4. 数据类型(Data Type): 值的数据类型定义了值的内容和用途。常见的数据类型包括字符串、整数、二进制数据等。
  5. 根键(Root Key): 注册表的最顶层,有几个根键,常见的包括 HKEY_CLASSES_ROOTHKEY_CURRENT_USERHKEY_LOCAL_MACHINE 等。

Windows注册表的作用包括:

  • 存储系统配置信息: 注册表中存储了操作系统的配置信息,包括系统启动时需要加载的驱动程序、系统服务、文件关联等。
  • 存储用户设置: 注册表中存储了用户特定的设置,如桌面背景、主题、鼠标指针样式等。
  • 应用程序配置: 许多应用程序使用注册表存储其配置信息。当应用程序安装时,它可能会在注册表中创建相关的键和值来保存配置。
  • 组织系统和应用程序数据: 注册表提供了一个结构化的方式来组织系统和应用程序需要存储的数据,使得操作系统和应用程序可以轻松地检索和修改配置信息。
  • 提供对系统设置的访问: 通过注册表,用户和系统管理员可以访问和修改系统的各种设置,从而对系统行为进行调整和优化。

枚举注册表项

RegOpenKeyEx 是一个用于打开指定的注册表键的 Windows API 函数。它允许应用程序访问和操作 Windows 注册表的子键。在较新的 Windows 版本中,例如 Windows 10,RegOpenKeyEx 已被推荐的函数 RegOpenKeyRegOpenKeyEx 代替。以下是 RegOpenKeyEx 的一般用法:

LSTATUS RegOpenKeyEx(HKEY    hKey,LPCTSTR lpSubKey,DWORD   ulOptions,REGSAM  samDesired,PHKEY   phkResult
);

参数说明:

  • hKey: 指定要打开的基础键的句柄,可以是 HKEY_CLASSES_ROOTHKEY_CURRENT_USERHKEY_LOCAL_MACHINE 等。
  • lpSubKey: 指定相对于 hKey 的子键路径。
  • ulOptions: 保留参数,通常可以设置为 0。
  • samDesired: 指定键的访问权限,例如 KEY_READKEY_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_ROOTHKEY_CURRENT_USERHKEY_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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/159809.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【考研数学】数学一“背诵”手册(一)| 高数部分(2)

文章目录 引言一、高数级数空间解析几何球坐标变换公式零碎公式 写在最后 引言 高数一篇文章还是写不太下&#xff0c;再分一些到这里来吧 一、高数 级数 阿贝尔定理&#xff1a;若级数 ∑ a n x n \sum a_nx^n ∑an​xn 当 x x 0 xx_0 xx0​ 时收敛&#xff0c;则适合不…

QT搭建的Ros/librviz的GUI软件

1.前言 开发初期学习了下面博主的文章&#xff0c;也报了他在古月局的课&#xff0c;相当于感谢吧。 ROS Qt5 librviz人机交互界面开发一&#xff08;配置QT环境&#xff09;-CSDN博客​​​​​​​r 软件前期也是参考他的开源项目 GitHub - chengyangkj/Ros_Qt5_Gui_App …

代码随想录 完结撒花 60 天总结

“编筐编篓&#xff0c;重在收口”。对为期60天的代码训练营做一个总结&#xff0c;同时也是对我加入知识星球60天和秋招找工作的回顾。 在九月结束了论文的长跑&#xff0c;匆匆忙忙地迎来了秋招&#xff0c;被打的措手不及&#xff0c;突然发现学校期间所学和找工作所需天差地…

Linux-编译器

编译器 gcc-arm-linux-gnueabihf gcc-arm-linux-gnueabihf 是一个针对 ARM 架构 Linux 系统的交叉编译工具链&#xff0c;它包括了 C、C、Objective-C 和 Fortran 编译器以及一些辅助工具&#xff0c;用于将源代码编译成可在 ARM 架构的 Linux 系统上运行的二进制程序。arm架…

2024贵州大学计算机考研分析

24计算机考研|上岸指南 贵州大学 贵州大学计算机科学与技术学院&#xff08;贵州大学省级示范性软件学院&#xff09;位于贵州省贵阳市花溪区贵州大学东校区。 计算机科学与技术学院&#xff08;软件学院&#xff09;自1972年创办计算机软件本科专业开始&#xff0c;至今已有…

算法刷题-动态规划-1

算法刷题-动态规划-1 不同路径不同路径||方法一&#xff1a;方法二 第N个泰波那契数递归写法滚动数组 三步问题递归操作滚动数组 使用最小画法爬楼梯递归 解码方法方法一方法二&#xff1a;&#xff08;大佬讲解&#xff09; 不同路径 //机器人不同的路径进入到指定的地点 publ…

Android13集成paho.mqtt.android启动异常

项目中原依赖是&#xff1a; implementation(org.eclipse.paho:org.eclipse.paho.android.service:1.1.1) {exclude module: support-v4transitive true } implementation org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5在Android10系统运行正常&#xff0c;能够连接…

人工智能-循环神经网络的简洁实现

循环神经网络的简洁实现 如何使用深度学习框架的高级API提供的函数更有效地实现相同的语言模型。 我们仍然从读取时光机器数据集开始。 import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2lbatch_size, num_steps 32, 35…

C#获取枚举Enum的描述

简单封装个扩展方法&#xff0c;方便下次使用。 using System.ComponentModel;namespace Order.Core.API.Enums {public enum AccountStatus{[Description("账号不存在&#xff01;")]AccountNotExist 1,[Description("密码错误&#xff01;")]PasswordE…

最常用的5款报表系统

在这个信息化飞速发展的时代&#xff0c;报表系统已经成为了企业管理和决策的重要工具。随着市场的需求不断增长&#xff0c;报表系统也在不断地更新和完善。如今&#xff0c;市面上有数不尽的报表系统&#xff0c;但是哪款才是最常用的呢&#xff1f;接下来&#xff0c;我们将…

开源之夏 2023 | Databend 社区项目总结与分享

开源之夏是由中科院软件所“开源软件供应链点亮计划”发起并长期支持的一项暑期开源活动&#xff0c;旨在鼓励在校学生积极参与开源软件的开发维护&#xff0c;培养和发掘更多优秀的开发者&#xff0c;促进优秀开源软件社区的蓬勃发展&#xff0c;助力开源软件供应链建设。 官…

node.js获取unsplash图片

1. 在Unsplash的开发者页面注册并创建一个应用程序&#xff0c;以便获取一个API访问密钥&#xff08;即Access Key&#xff09;。 2. 安装unsplash-js库和axios&#xff1a; npm install axios3. 使用获取到的API密钥进行请求。 示例代码如下&#xff1a; const axios req…

3DEXPERIENCE许可管理工具:掌控设计软件许可,提高企业竞争力

在当今竞争激烈的设计领域&#xff0c;合理的软件许可管理对于企业的成功至关重要。3DEXPERIENCE作为一款功能强大的设计软件&#xff0c;提供了全面且易于使用的许可管理工具。本文将详细介绍3DEXPERIENCE的许可管理工具及其对企业管理的价值&#xff0c;帮助您更好地了解和利…

【正点原子STM32连载】第五十六章 DSP BasicMath实验 摘自【正点原子】APM32F407最小系统板使用指南

1&#xff09;实验平台&#xff1a;正点原子stm32f103战舰开发板V4 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html## 第五…

【管理运筹学】背诵手册(四)| 整数规划

四、整数规划 整数规划根据变量取值的限制形式&#xff0c;可分为三种&#xff1a; 纯整数规划&#xff08;IP&#xff09;。混合整数规划&#xff08;MIP&#xff09;。0-1 整数规划&#xff08;BIP&#xff09;。 不能用凑整的方法去求整数规划问题的最优解&#xff0c;用…

ChinaSoft 论坛巡礼 | 新兴系统软件论坛

2023年CCF中国软件大会&#xff08;CCF ChinaSoft 2023&#xff09;由CCF主办&#xff0c;CCF系统软件专委会、形式化方法专委会、软件工程专委会以及复旦大学联合承办&#xff0c;将于2023年12月1-3日在上海国际会议中心举行。 本次大会主题是“智能化软件创新推动数字经济与社…

算法 全排列的应用

#include <iostream> #include <string>using namespace std;// 交换字符串中两个字符的位置 void swap(char& a, char& b) {char temp a;a b;b temp; }void fun(string str) {string a str.substr(0,4); int aa;sscanf(a.c_str(), "%d",…

Harmony 应用开发之size 脚本

作者&#xff1a;麦客奥德彪 在应用开发中&#xff0c;最终呈现在用户面前的UI&#xff0c;是用户能否继续使用应用的强力依据之一&#xff0c;在之前的开发中&#xff0c;Android 屏幕碎片化严重&#xff0c;所以出现了很多尺寸适配方案。 最小宽适配、百分比适配等等。 还有一…

知虾shopee收费,多少钱一个月

在当今电商行业的竞争激烈的环境下&#xff0c;许多商家都在寻求更好的方式来推广和销售他们的产品。这就是为什么越来越多的商家选择使用知虾shopee这样的平台来展示和销售他们的商品。但是&#xff0c;对于许多商家来说&#xff0c;他们可能会对知虾shopee的收费情况感到好奇…

MySql 计算同比、环比

一、理论 国家统计局同比、环比计算公式 增长速度是反映经济社会某一领域发展变化情况的重要数据&#xff0c;而同比和环比是反映增长速度最基础、最核心的数据指标&#xff0c;也是国际上通用的指标。在统计中&#xff0c; 同比和环比通常是同比变化率和环比变化率的简称&…