大理寺少卿 发表于 2025-3-14 21:00:57

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

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

![](https://raw.githubusercontent.com/Whitebird0/tuchuang/main/QQ%E6%88%AA%E5%9B%BE20211208221834.png)

如何创建一个子项,以及如何在子项下再创建一个子项
------------------------------------------------

    #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;

    }
原先没有的情况下
----------------

![](https://raw.githubusercontent.com/Whitebird0/tuchuang/main/QQ%E6%88%AA%E5%9B%BE20211208222816.png)

已经创建后的情况下
------------------

![](https://raw.githubusercontent.com/Whitebird0/tuchuang/main/QQ%E6%88%AA%E5%9B%BE20211208222559.png)

asmprofan 发表于 2025-6-23 05:46:22

膜拜神贴,后面的请保持队形~

ponyjs 发表于 2025-6-23 11:37:27

看帖看完了至少要顶一下,还可以加入到淘帖哦!

CatReverse 发表于 2025-6-24 08:07:41

看帖看完了至少要顶一下,还可以加入到淘帖哦!

goople 发表于 2025-7-27 09:01:05

果断MARK,前十有我必火!

haixinerhao 发表于 2025-10-30 13:36:31

学习了
专注学习20年

stars 发表于 2025-11-23 16:07:21

啥也不说了,楼主就是给力!

Q314550799 发表于 2025-11-25 10:33:59

驱动开发与系统原理-
页: [1]
查看完整版本: 驱动开发与系统原理-注册表操作-创建