首先来看一下注册表的组成结构,我们可以通过控制台输入regedit打开注册表

如何创建一个子项,以及如何在子项下再创建一个子项
#include<ntifs.h>
NTSTATUS CreatRegKeyCall() {//创建一个子项
HANDLE hKey = NULL;
NTSTATUS ntStatus=STATUS_SUCCESS;
//对象属性
OBJECT_ATTRIBUTES ObjectArt;
//接受创建子项后的返回值,判断是创建成功还是打开成功
ULONG uRet;
//初始化创建子项的路径
UNICODE_STRING usRegPath = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\SOFTWARE\\Whitebird");
//初始化对象
InitializeObjectAttributes(&ObjectArt, &usRegPath, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL);
//创建子项
ntStatus = ZwCreateKey(&hKey, KEY_ALL_ACCESS, &ObjectArt, 0, NULL, REG_OPTION_NON_VOLATILE, &uRet);
//先判断是否创建成功,然后创建中其实分为如果原来没有就创建,如果原来有就打开子项
if (NT_SUCCESS(ntStatus))
{
if (uRet== REG_CREATED_NEW_KEY)
{
DbgPrint("Create Key Success!");
return ntStatus;
}
else if (uRet== REG_OPENED_EXISTING_KEY)
{
DbgPrint("Open Key Success!");
return ntStatus;
}
}
else
{
DbgPrint("Create Key Failed!");
return ntStatus;
}
}
NTSTATUS CreateRegSubKeyCall() {//创建子项的子项
HANDLE hKey = NULL;
HANDLE hSubKey = NULL;
NTSTATUS ntStatus = STATUS_SUCCESS;
//对象属性
OBJECT_ATTRIBUTES ObjectArt;
ULONG uRet;
//子项的名称
UNICODE_STRING usSubReg = RTL_CONSTANT_STRING(L"helloworld");
//创建子项的路径
UNICODE_STRING usRegPath = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\SOFTWARE\\Whitebird");
//初始化对象
InitializeObjectAttributes(&ObjectArt, &usRegPath, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL);
//打开路径所对应key的句柄
ntStatus = ZwOpenKey(&hKey, KEY_ALL_ACCESS, &ObjectArt);
//判断是否拿到句柄
if (NT_SUCCESS(ntStatus))
{
//初始化对象
InitializeObjectAttributes(&ObjectArt, &usSubReg, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, hKey, NULL);
//创建子项,这里我们传入了父句柄,所以子项就会在我们提供的父句柄下创建
ntStatus=ZwCreateKey(&hSubKey, KEY_ALL_ACCESS, &ObjectArt, 0, NULL, REG_OPTION_NON_VOLATILE, &uRet);
if (NT_SUCCESS(ntStatus))
{
if (uRet == REG_CREATED_NEW_KEY)
{
DbgPrint("Create SubKey Success!");
return ntStatus;
}
else if (uRet == REG_OPENED_EXISTING_KEY)
{
DbgPrint("Open SubKey Success!");
return ntStatus;
}
}
else
{
DbgPrint("Create SubKey Failed!");
return ntStatus;
}
}
else {
DbgPrint("OpenKey Failed!");
return ntStatus;
}
}
VOID DriverUnload(PDRIVER_OBJECT pDriverObject) {
DbgPrint("Unload Success!");
}
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject,PUNICODE_STRING pRegPath){
DbgPrint("Load Success!");
CreatRegKeyCall();
CreateRegSubKeyCall();
pDriverObject->DriverUnload = DriverUnload;
return STATUS_SUCCESS;
}
原先没有的情况下

已经创建后的情况下

|