根键:注册表被划分为称为根键的5个顶层节。有时,术语HKEY和储巢也被使用。
每一个根键有一个特定的目的,我们接下来会逐一解释。
子键: 一个子键就像是一个文件夹中的子文件夹。
值项:一个值项是一个配对的名字和值。
值或数据 :值或数据是存储在注册表项中的数据。
注册表被划分为下面5个根键:
HKEY_LOCAL_MACHINE(HKLM)保存对本地机器全局设置。HKEY_CURRENT_USER ( HKCU)保存当前用户特定的设置。HKEY_CLASSES_ROOT保存定义的类型信息。
HKEY_CURRENT_CONFIG保存关于当前硬件配置的设置,特别是与当前和标准配置之间不同的部分。
HKEY_USERS定义默认用户、新用户和当前用户的配置。
两个最常用的根键是HKLM和HKCU(这些键通常通过它们的缩写来引用)。一些键实际是虚拟键值,提供一种引用底层注册表信息的方式。例如,HKEY_CURRENT_USER键实际上存储在HKEY_USERS\SID中,这里SID是当前登录用户的安
全描述符。例如,一个常用的子键,
HKEY_LOCAL_MACHINE\SOFTWARE \Microsoft\windows \CurrentVersion\Run,包含一系列值,这些值列举了当一个用户登录时被自动启动的可执行程序。根键是HKEY_LOCAL_MACHINE,它保存
了SOFTWARE、Microsoft、 windows、currentVersion以及Run子键。
自启动程序检测
Autoruns工具列举了系统启动时会自动运行的程序
注册表操作函数
RegOpenKeyEx 打开一个注册表进行编辑和查询
RegSetValueEx 添加一个新值到注册表,并设置它的数值
RegGetValue 返回注册表中一个值项的数值。
以下为创建一个注册表项的代码,需要管理员权限运行。
// test.cpp : 定义控制台应用程序的入口点。
//
// test.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
HKEY Key = NULL;
DWORD dwDisposition = 0; //用于接收一个注册表项是新建还是打开
int errorCode = RegCreateKeyEx(
HKEY_LOCAL_MACHINE, //要打开的根键 /储巢
L"system\\yxp", //子键名
0, //必须为0
NULL, //忽略此参数
REG_OPTION_VOLATILE, //系统重启后该项消失,如果想要长久的保存使用REG_OPTION_NOT_VOLATILE
KEY_ALL_ACCESS, //获取所有权限
NULL,// 使用默认的安全描述符, NULL 子进程不可以继承该句柄
&Key, //返回的注册表项句柄
&dwDisposition //返回值说明了是创建还是打开一个注册表项
);
if (ERROR_SUCCESS != errorCode)
{
printf("创建指定注册表项失败,错误码:%d", errorCode);
goto exit;
}
else
{
if (dwDisposition == REG_CREATED_NEW_KEY)
printf("创建一个新的注册表项");
if (dwDisposition == REG_OPENED_EXISTING_KEY)
printf("打开一个注册表项");
}
DWORD dwValue = 29;
RegSetValueEx(Key, TEXT("age"), NULL, REG_DWORD, (const BYTE*)&dwValue, sizeof(dwValue));
exit:
if (Key)
{
RegCloseKey(Key);
}
getchar();
return 0;
}