注册表的写

实际上注册表的写入比读取要简单。因为这省略了一个尝试数据的大小的过程。直接将数据写入即可。写入值一般使用函数ZwSetValueKey 。这个函数的原型如下:

NTSTATUS ZwSetValueKey(
    IN HANDLE  KeyHandle,
    IN PUNICODE_STRING  ValueName,
    IN ULONG  TitleIndex  OPTIONAL,
    IN ULONG  Type,
    IN PVOID  Data,
    IN ULONG  DataSize
);

其中的TileIndex参数请始终填入0。

KeyHandle、ValueName、Type这三个参数和ZwQueryValueKey中对应的参数相同。不同的是Data和DataSize。Data是要写入的数据的开始地址,而DataSize是要写入的数据的长度。由于Data是一个空指针,因此,Data可以指向任何数据。也就是说,不管Type是什么,都可以在Data中填写相应的数据写入。

ZwSetValueKey的时候,并不需要该Value已经存在。如果该Value已经存在,那么其值会被这次写入覆盖。如果不存在,则会新建一个。下面的例子写入一个名字为“Test”,而且值为“My Test Value”的字符串值。假设my_key是一个已经打开的子键的句柄。

UNICODE_STRING name = RTL_CONSTANT_STRING(L”Test”);
PWCHAR value = { L”My Test Value” };
…
// 写入数据。数据长度之所以要将字符串长度加上1,是为了把最后一个空结束符
// 写入。我不确定如果不写入空结束符会不会有错,有兴趣的读者请自己测试一下。
status = ZwSetValueKey(my_key,
        &name,0,REG_SZ,value,(wcslen(value)+1)*sizeof(WCHAR));
if(!NT_SUCCESS(status))
{
    // 错误处理
    ……
}

关于注册表的操作就介绍到这里了。如果有进一步的需求,建议读者阅读WDK相关的文档。

取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

Powered by bytekits.com,汇天下文字,成非凡梦想!!!