当前位置: 首页 > news >正文

Win32注册表操作

注册表的概念

注册表是一个存储计算机配置信息的数据库,用于存储计算机上的硬件、安装的软件、系统设置以及用户账户配置等重要信息。对注册表的编辑不当可能会影响计算机的正常运行。应用程序可以调用API函数来对注册表进行增、删等操作。

注册表结构

运行Regedit.exe,打开注册表编辑器,可以看到注册表的结构如下:

注册表是一个分层数据库,其中包含对于Windows以及Windows上运行的应用程序和服务的运行至关重要的数据。注册表是树型结构。树中的每个节点都称为键。每个键都可以包含子键和值。

注册表是按照“根键” -> "子键"  -> "键值"层次结构来组织的。

注册表包含五大根键

"HKEY_CLASSES_ROOT" : 包含各种文件类型关联数据的信息

"HKEY_CURRENT_USER": 包含当前登录计算机的用户账户的用户配置文件信息,例如桌面个性化、输入法设置、网络连接以及打印机首选项等

"HKEY_LOCAL_MACHINE":包含一些当前计算机的系统配置信息,例如系统内存、设备程序等

"HKEY_USERS" :包含默认用户的配置文件信息以及动态加载的用户配置文件信息

"HKEY_CURRENT_CONFIG":包含在计算机启动时系统所使用的硬件配置文件信息,用于配置一些计算机相关设置。例如加载设备的驱动程序、计算机使用的分辨率等

打开和关闭注册表

RegOpenKeyEx

打开注册表

LSTATUS RegOpenKeyExA(HKEY   hKey,LPCSTR lpSubKey,DWORD  ulOptions,REGSAM samDesired,PHKEY  phkResult
);

hKey: 指向一个父键句柄

lpSubKey:指向一个字符串,用来表示要打开的子键名称

ulOptions:系统保留,必须指定为0

samDesired:打印注册表的存取权限,通过使用KEY_ALL_ACCESS表示全部权限

phkResult:接收打开的子键句柄

如果函数执行成功,则返回ERROR_SUCCESS,并且在phkResult中保存返回打开子键的句柄

RegCloseKey

关闭已打开的注册表句柄

1 LSTATUS RegCloseKey(
2   HKEY hKey
3 );

hKey:要关闭的键句柄,即RegOpenKeyExphkResult

创建和删除子键

RegCreateKeyEx

创建一个子键

LSTATUS RegCreateKeyExA(HKEY                        hKey,LPCSTR                      lpSubKey,DWORD                       Reserved,LPSTR                       lpClass,DWORD                       dwOptions,REGSAM                      samDesired,const LPSECURITY_ATTRIBUTES lpSecurityAttributes,PHKEY                       phkResult,LPDWORD                     lpdwDisposition
);

hKey: 用来指向父键句柄

lpSubKey: 指向一个字符串,用来表示要创建的子键名称

ReServed:系统保留,必须指定为0值

lpClass:子键类名,一般设置为NULL值

dwOptions:创建子键时的选项,通常情况下使用REG_OPTION_NON_VOLATILE宏,表示创建的子键被创建到注册表文件中,而不是内存中

samDesired:打开注册表的存取权限,通常使用KEY_ALL_ACCESS。

lpSecurityAttributes:该参数指向一个SECURITY_ATTRIBUTE结构体,用来指定键句柄的安全属性,一般使用NULL

phkResult:指向用来接收打开的句柄

lpdwDisposition:指向DWORD的指针,该变量接收以下值:

REG_CREATED_NEW_KEY

0x00000001L

键不存在且已创建。

REG_OPENED_EXISTING_KEY

0x00000002L

键存在并且仅需打开即可更改。

如果lpdwDisposition为NULL,则不返回任何处置信息。

如果函数执行成功,则返回ERROR_SUCCESS,并且在phkResult中保存返回创建子键的句柄。当需要创建的子键已经存在,该函数和RegOpenKeyEx起到同样的作用。

RegDeleteKey

删除子键

1 LSTATUS RegDeleteKeyA(
2   HKEY   hKey,
3   LPCSTR lpSubKey
4 );

hKey:用来指向父键句柄

lpSubKey:指向要删除的子键名称字符串

键值的查询、写入与删除

RegQueryValueEx

读取键名称中的数据或查询键名称的属性

1 LSTATUS RegQueryValueExA(
2   HKEY    hKey,
3   LPCSTR  lpValueName,
4   LPDWORD lpReserved,
5   LPDWORD lpType,
6   LPBYTE  lpData,
7   LPDWORD lpcbData
8 );

hKey:用来指向要读取的键值项所处的子键句柄

lpValueName:用来指向要读取的键值项名称的字符串

lpReserved:保留参数,设置为NULL

lpType:接收返回的键值类型,如果不需要返回键值项类型,可以设置为NULL

lpDate:指向一个缓冲区,用来接收返回的键值数据

lpchData:在调用该函数时,这个参数用来指定缓冲区的长度;当函数返回时,该变量保存缓冲区实际接收到的长度

RegSetValueEx

写入键值项

1 LSTATUS RegSetValueExA(
2   HKEY       hKey,
3   LPCSTR     lpValueName,
4   DWORD      Reserved,
5   DWORD      dwType,
6   const BYTE *lpData,
7   DWORD      cbData
8 );

hKey:用来指定要写入的键值项所处的子键句柄

lpValueName:指向定义键值项名称的字符串

Reservered:保存参数,设置为NULL

dwType:指定要写入的键值数据类型

lpData:指定要写入键值数据的缓冲区

cbData:要写入键值数据的缓冲区长度

RegDeleteValue

删除键值项

1 LSTATUS RegDeleteValueA(
2   HKEY   hKey,
3   LPCSTR lpValueName
4 );

hKey:用来指定要删除的键值项所处的子键句柄

lpValueName:被删除键值项的名称

子键和键值的枚举

RegEnumKeyEx

子键枚举函数

 1 LSTATUS RegEnumKeyExA(2   HKEY      hKey,3   DWORD     dwIndex,4   LPSTR     lpName,5   LPDWORD   lpcchName,6   LPDWORD   lpReserved,7   LPSTR     lpClass,8   LPDWORD   lpcchClass,9   PFILETIME lpftLastWriteTime
10 );

hKey:指向被枚举的键句柄

dwIndex:指定需要返回信息的子键索引编号

lpName:用户接收返回子键名称的缓冲区

lpcchName:在调用函数前,该参数保存lpName指向缓冲区的长度;在调用该函数后,该参数保存缓冲区实际接收到的数据的长度

lpReserved:保留参数,必须为NULL值

lpClass:指向接收枚举子项的用户定义类。一般指定为NULL

lpcchClass:指向lpClass参数指定的缓冲区的大小,一般指定为NULL

lpftLastWriteTime:指向一个FILETIME结构体,用于接收最后一次被写入的时间

RegEnumValue

枚举键值

 1 LSTATUS RegEnumValueA(2   HKEY    hKey,3   DWORD   dwIndex,4   LPSTR   lpValueName,5   LPDWORD lpcchValueName,6   LPDWORD lpReserved,7   LPDWORD lpType,8   LPBYTE  lpData,9   LPDWORD lpcbData
10 );

hKey:指向被枚举的键句柄

dwIndex:指定需要返回信息的键值索引编号

lpValueName:接收返回值名称的缓冲区

lpcchValueName:有调用该参数前,该参数保存lpValueName指向缓冲区的长度;在该函数调用完成后,该参数保存缓冲区实际接收到的数据的长度

lpReserved:保留参数,必须为NULL

lpType:指向返回键值数据类型

lpData:接收返回键值数据的缓冲区

lpcbData:在调用该函数前,该参数保存lpData指向缓冲区的长度;在该函数调用完成后,该参数保存缓冲区实际收到的数据的长度

常用的注册表设置(设置前建议备份整个注册表)

禁用快捷菜单的”发送到“菜单项

打开计算机\HKEY_CLASSES_ROOT\AllFilesystemObjects\shellex\ContextMenuHandlers\SendTo 删除默认值。如果要恢复,将默认值设置为 {7BA4C740-9E81-11CF-99D3-00AA004AE837}

删除快捷方式箭头

打开计算机\HKEY_CLASSES_ROOT\lnkfile,删除IsShortcut键值

隐藏桌面图标

打开计算机\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer,新建名称为NoSetFolders键值,并设置数据为1

禁止访问任务管理器

打开计算机\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System,修改DisableTaskmgr键值的数据为1。如果没有DisableTaskmgr键值,就创建一个。

在桌面显示Windows版本

打开计算机\HKEY_CURRENT_USER\Control Panel\Desktop,修改PaintDesktopVersion键值的数据为1

隐藏”重新启用“、”睡眠”和“休眠”命令

打开计算机\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer,新建一个NoClose键值,并设置数据为1

禁用计算机中的USB端口

打开计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\USBSTOR,修改Start键值数据为4

配置开机启动项

计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

推荐阅读:

注册表

Registry - Win32 apps | Microsoft Learn

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Rust 所有权
  • 大数据-Big Data(一):概述与基础
  • Tracecat:开源 SOAR
  • Transformer 模型中的 QKV 机制是如何运作的
  • 区块链平台的图灵完备性
  • 探秘C# LINQ元素运算:原理阐释与实践指南
  • day 22线程间通信
  • Java参数传递
  • 深度学习-----------数值稳定性
  • docker部署jenkins和jenkins的基本使用
  • 【SpringCloud】SpringCloudNetflix笔记
  • 重塑购车体验,实时云渲染赋能东风日产探路云看车新体验
  • Date类型的字段序列化成JSON字符串
  • bug: 配置flyway.locations多个脚本位置不生效
  • SpringBoot整合支付宝沙箱支付流程(干货·精简版)Java毕业设计亮点 通俗易懂
  • C++类的相互关联
  • echarts的各种常用效果展示
  • es6
  • express.js的介绍及使用
  • IP路由与转发
  • Less 日常用法
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • python 学习笔记 - Queue Pipes,进程间通讯
  • SpriteKit 技巧之添加背景图片
  • TypeScript实现数据结构(一)栈,队列,链表
  • Vue官网教程学习过程中值得记录的一些事情
  • 规范化安全开发 KOA 手脚架
  • 使用docker-compose进行多节点部署
  • 思考 CSS 架构
  • 思维导图—你不知道的JavaScript中卷
  • 在Mac OS X上安装 Ruby运行环境
  • 自制字幕遮挡器
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • # dbt source dbt source freshness命令详解
  • # Redis 入门到精通(一)数据类型(4)
  • # wps必须要登录激活才能使用吗?
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (2)空速传感器
  • (CVPRW,2024)可学习的提示:遥感领域小样本语义分割
  • (二十三)Flask之高频面试点
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (离散数学)逻辑连接词
  • (三十五)大数据实战——Superset可视化平台搭建
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (算法设计与分析)第一章算法概述-习题
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • **CI中自动类加载的用法总结
  • .“空心村”成因分析及解决对策122344
  • .FileZilla的使用和主动模式被动模式介绍
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?