登录  | 立即注册

游客您好!登录后享受更多精彩

查看: 102|回复: 0

驱动开发与系统原理-注册表操作-创建

[复制链接]

78

主题

-6

回帖

71

积分

网站编辑

积分
71
发表于 2025-3-14 21:00:57 | 显示全部楼层 |阅读模式

首先来看一下注册表的组成结构,我们可以通过控制台输入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;

}

原先没有的情况下

已经创建后的情况下

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|断点社区 |网站地图

GMT+8, 2025-4-4 14:23 , Processed in 0.206069 second(s), 24 queries , Yac On.

Powered by XiunoBBS

Copyright © 2001-2025, 断点社区.

快速回复 返回顶部 返回列表