注册表里的几个概念:
1. 创建关闭注册表项
NTSTATUS
ZwCreateKey(
OUT PHANDLE KeyHandle,
IN ACCESS_MASK DesiredAccess, //访问权限,一般为KEY_ALL_ACCLESS
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN ULONG TitleIndex, //一般为NULL
IN PUNICODE_STRING Class OPTIONAL, //一般为NULL
IN ULONG CreateOptions, //一般为REG_OPTION_NON_VOLATILE
OUT PULONG Disposition OPTIONAL //返回是打开成功还是创建成功
);
如果ZwCreateKey指定的项目不存在,则直接创建这个项目,并利用Disposition 参数返回REG_CREATED_NEW_KEY。如果该项目已经存在,Disposition 参数返回REG_OPENED_EXISTING_KEY。
示例代码:
//新建注册表项为HKEY_LOCAL_MACHINESOFTWAREMzf
#define MY_REG_SOFTWARE_KEY_NAME L"\Registry\Machine\Software\Mzf"
#pragma INITCODE
VOID TetsKey()
{
UNICODE_STRING string1;
RtlInitUnicodeString(&string1, MY_REG_SOFTWARE_KEY_NAME);
OBJECT_ATTRIBUTES objAttribute;
InitializeObjectAttributes(&objAttribute, &string1, OBJ_CASE_INSENSITIVE, NULL, NULL);
HANDLE hKey;
ULONG Des;
NTSTATUS status = ZwCreateKey(&hKey, KEY_ALL_ACCESS, &objAttribute,
NULL, NULL, REG_OPTION_NON_VOLATILE, &Des);
if (NT_SUCCESS(status))
{
if (Des == REG_CREATED_NEW_KEY)
{
KdPrint(("新建注册表项! "));
}
else
{
KdPrint(("要创建的注册表项已经存在! "));
}
}
//打开或创建注册表子项
UNICODE_STRING string2;
RtlInitUnicodeString(&string2, L"SubKey");
OBJECT_ATTRIBUTES subObjAttribute;
//注意最后第二个参数,为父键的句柄
InitializeObjectAttributes( &subObjAttribute, &string2, OBJ_CASE_INSENSITIVE, hKey, NULL);
HANDLE hSubKey;
ULONG subDes;
status = ZwCreateKey(&hSubKey, KEY_ALL_ACCESS, &subObjAttribute,
NULL, NULL, REG_OPTION_NON_VOLATILE, &subDes);
if (NT_SUCCESS(status))
{
if (subDes == REG_CREATED_NEW_KEY)
{
KdPrint(("新建注册表子项! "));
}
else
{
KdPrint(("要创建的注册表子项已经存在! "));
}
}
//关闭注册表句柄
ZwClose(hKey);
ZwClose(hSubKey);
}
2. 打开注册表项
NTSTATUS
ZwOpenKey(
OUT PHANDLE KeyHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes
);
3. 添加,修改注册表键值
注册表键值是以二元形式存储的,既“键名”和“键值”。通过键名设置键值,而键值可以分为以下几类:
分类 |
描述 |
REG_BINARY |
键使用二进制存储 |
REG_SZ |
键使用宽字符串,字符串以 |