@part 3 注册表
1.注册表的作用及组织形式
Windows系统使用注册表来存储系统和应用程序配置数据。
注册表是一种以树形结构组织的数据库。树的每一个节点称作键,每个节点可以包含若干子键,键可以存储数据,存储的数据称作键值。
注册表键值类型
REG_BINARY | 任何形式的二进制数据
REG_DWORD | 32位数据
REG_DWORD_LITTLE_ENDIAN | 以little-endian形式存储的32位数据
REG_DWORD_BIG_ENDIAN | 以big-endian形式存储的32位数据
REG_EXPAND_SZ | 以NULL结尾的字符串,可以使用环境变量,如%PATH%
REG_LINK | 只能由操作系统使用的类型
REG_MULTI_SZ | 字符串数组,以NULL结束字符串,以两个NULL结束数组
REG_NONE | 未定义的数据类型
REG_QWORD | 64位数据
REG_QWORD_LITTLE_ENDIAN | 以little-endian形式存储的64位数据
REG_SZ | 字符串,以NULL结束
2.键、子键、键属性及键值的相关操作
(1)原理
在对注册表操作之前,需要使用API函数RegOpenKey,RegOpenKeyEx打开键。在打开键后如果需要创建新的键,使用API函数RegCreateKey,RegCreateKeyEx.这两组函数都将返回键的句柄(HKEY).
(2)关键API和数据结构
LSTATUS APIENTRY RegOpenKeyExA (
HKEY hKey,
LPCSTR lpSubKey,
DWORD ulOptions,
REGSAM samDesired,
PHKEY phkResult
);
LSTATUS APIENTRY RegCreateKeyA (
HKEY hKey,
LPCSTR lpSubKey,
PHKEY phkResult
);
LSTATUS APIENTRY RegSetValueExA (
HKEY hKey,
LPCSTR lpValueName,
DWORD Reserved,
DWORD dwType,
CONST BYTE* lpData,
DWORD cbData
);
typedef HKEY *PHKEY;
(3)测试实例
HKEY hTestKey;
HKEY hSubKey;
DWORD dwKeyValue = 100;
if (RegOpenKeyEx(HKEY_CURRENT_USER,
TEXT("SOFTWARE"),
0,KEY_READ | KEY_WRITE,&hTestKey) == ERROR_SUCCESS)
{
RegCreateKey(hTestKey,"MyTestSoftWare",&hSubKey);
if (RegSetValueEx(hSubKey,"Test",NULL,REG_DWORD,
&dwKeyValue,sizeof(DWORD)) != ERROR_SUCCESS)
{
cout<<"RegSetValue Error!"<<endl;
}
}
@problem
错误 1 error C2664: “RegSetValueExA”: 不能将参数 5 从“DWORD *”转换为“const BYTE *” f:\debug\sysmsg\sysmsg\getsysinfo.cpp 85
解决办法:
强制转换:(const BYTE *)&dwKeyValue
@display:
3.列举注册表项及键值
(1)原理
使用API函数RegEnumKeyEx,RegEnumValue.RegQueryInfoKey,RegEnumKeyEx,和RegEnumValue相配合可以完成对一个键值的所有子键及键值的列举
(2)关键API和和数据结构
LSTATUS APIENTRY RegQueryInfoKeyA (
HKEY hKey,
LPSTR lpClass,
LPDWORD lpcchClass,
LPDWORD lpReserved,
LPDWORD lpcSubKeys,
LPDWORD lpcbMaxSubKeyLen,
LPDWORD lpcbMaxClassLen,
LPDWORD lpcValues,
LPDWORD lpcbMaxValueNameLen,
LPDWORD lpcbMaxValueLen,
LPDWORD lpcbSecurityDescriptor,
__out_opt PFILETIME lpftLastWriteTime
);
LSTATUS APIENTRY RegEnumKeyExA (
HKEY hKey,
DWORD dwIndex,
LPSTR lpName,
LPDWORD lpcchName,
LPDWORD lpReserved,
LPSTR lpClass,
LPDWORD lpcchClass,
PFILETIME lpftLastWriteTime
);
LSTATUS APIENTRY RegEnumValueA (
HKEY hKey,
DWORD dwIndex,
LPSTR lpValueName,
LPDWORD lpcchValueName,
LPDWORD lpReserved,
LPDWORD lpType,
LPBYTE lpData,
LPDWORD lpcbData
);
4.通过注册表设置一个自启动的程序
(1)原理
设置HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run的REG_SZ类型的键值
(2)测试实例
@source code
HKEY hTestKey;
TCHAR dwKeyValue[MAX_PATH] = "G:\\Notepad++\\Notepad++.exe";
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"),
0,KEY_READ | KEY_WRITE,&hTestKey) == ERROR_SUCCESS)
{
if (RegSetValueEx(hTestKey,"Test",NULL,REG_SZ,
(const BYTE *)dwKeyValue,MAX_PATH) != ERROR_SUCCESS)
{
cout<<"RegSetValue Error!"<<endl;
}
}
@display