注册表的概念
注册表是一个存储计算机配置信息的数据库,用于存储计算机上的硬件、安装的软件、系统设置以及用户账户配置等重要信息。对注册表的编辑不当可能会影响计算机的正常运行。应用程序可以调用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:要关闭的键句柄,即RegOpenKeyEx的phkResult值
创建和删除子键
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