Windows驱动注册表写数据
2021-07-01
399
0
实际上注册表的写入比读取要简单。因为这省略了一个尝试数据的大小的过程。直接将数据写入即可。写入值一般使用函数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相关的文档。