NTATATUS ZwOptnKey(
OUT PHANDLE KeyHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes
);
函数也是要求输入一个OBJECT_ATTRIBUTES结构体指针。
DesireAccess可以是下述权限的任意组合:
值
描述
KEY_QUERY_VALUE
读取键下的值
KEY_SET_VALUE
设置键下的值
KEY_CREATE_SUB_KEY
生成子子键
KEY_ENUMERATE_SUB_KEYS
枚举子键
KEY_READ
一个组合好的宏,可以直接用对应的还有KEY_WRITE,KEY_ALL_ACCESS
基础操作
对于注册表主要实现打开、读、写这三种操作
打开:
ZwOpenKey()
读:
ZwQueryValueKey()
NTSTATUS ZwQueryValueKey(
IN HANDLE KeyHandle,//注册表键句柄
IN PUNICODE_STRING ValueName,//要读取的值的名字
IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,//索要查询的信息类型
OUT PVOID KeyValueInformation,
IN ULONG Length,//输入空间的长度
OUT PULONG Resultlength //返回实际需要的长度);
KeyValueInformationClass是一个枚举类型,要查询的信息类型可以是以下三种:
信息
说明
KeyValueBasicInformation
获得基础信息,包含值名和类型
KeyValueFullInformation
获得完整信息,包含值名、类型和值的数据
KeyValuePartialInformation
获得局部信息,包含类型和值的数据(最常用)
当然也可是以下的枚举值中的一种:
typedefenum _KEY_INFORMATION_CLASS {
KeyBasicInformation,
KeyNodeInformation,
KeyFullInformation,
KeyNameInformation,
KeyCachedInformation,
KeyFlagsInformation,
KeyVirtualizationInformation,
KeyHandleTagsInformation,
KeyTrustInformation,
KeyLayerInformation,
MaxKeyInfoClass // MaxKeyInfoClass should always be the last enum} KEY_INFORMATION_CLASS;
返回值:如果实际需要的长度比Length大,那么返回STATUS_BUFFER_OVERFLOW-0x80000005或者STATUS_BUFFER_TOO_SMALL,成功返回STATUS_SUCCESS. c
写
ZwSetValueKey
较为简单,直接写入注册表就好,函数原型如下:
NTSTATUS ZwSetValueKey(
IN HANDLE KeyHandle,
IN PUNICODE_STRING ValueName,
IN ULONG TitileIndex OPTIONAL,
IN ULONG Type,
IN PVOID Data,
IN ULONG DataSize
);//参数解释://1. 其中KeyHandle、ValueName两个参数和ZwQueryValueKey中的参数相同。//2. Data和DataSize:Data是写入的数据的开始地址,DataSize是要写入数据的长度。Data类型为PVOID空指针,所以Data可以指向任何的数据
Type可以有如下的类型,具体查看MSDN:
值
含义
REG_BINARY
任何形式的二进制数据
REG_DWORD
一个四字节的数值
REG_LINK
命名符号链接的Unicode字符串
REG_NONE
没有特定类型的数据
REG_SZ
空终止的Unicode字符串
使用此函数时,如果键值已存在,那么就覆盖,不存在时会新建一个键。
驱动中注册表使用
打开键的函数
//函数用来获取一个键
NTSTATUS MyZwOpenKey(PHANDLE hKey, PUNICODE_STRING pKeyPath){//初始化OBJECT_STTRIBUTE
OBJECT_ATTRIBUTES objAttribute ={0};InitializeObjectAttributes(&objAttribute, pKeyPath, OBJ_CASE_INSENSITIVE,NULL,NULL);//打开key
NTSTATUS status = STATUS_SUCCESS;
status =ZwOpenKey(hKey, KEY_READ,&objAttribute);return status;}