Windows编程系列:注册表

注册表的概念

注册表是一个存储计算机配置信息的数据库,用于存储计算机上的硬件、安装的软件、系统设置以及用户账户配置等重要信息。对注册表的编辑不当可能会影响计算机的正常运行。应用程序可以调用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

 

 

推荐阅读:

注册表

https://docs.microsoft.com/en-us/windows/win32/sysinfo/registry

posted @ 2020-11-20 10:43  zhaotianff  阅读(810)  评论(0编辑  收藏  举报