Windows内核函数 - 创建关闭注册表

news2024/11/19 15:35:18

        在驱动程序的开发中,经常会用到对注册表的操作。与Win32的API不同,DDK提供另外一套对注册表操作的相关函数。首先明确一下注册表里的几个概念,避免在后面混淆。

图1 注册表概念

有5个概念需要重申一下:
* 注册表项: 注册表中的一个项目,类似目录的概念。每个项中存储多个二元结构,键名-键值。每个项中,可以有若干个子项。
* 注册表子项:类似于目录中的子目录。
* 键名:通过键名可以寻找到相应的键值。
* 键值类别:每个键值存储的时候有不同的类别,可以是整型、字符串等数据。
* 键值:键名下对应存储的数据。

创建关闭注册表

和文件操作类似,对注册表操作首先要获取一个注册表句柄。对注册表的操作都需要根据这个句柄进行操作。可以通过 ZwCreateKey 函数获得打开的注册表句柄。这个函数打开注册表后,并返回一个操作句柄。其函数声明如下:

NTSTATUS ZwCreateKey(
    OUT PHANDLE KeyHandle,
    IN ACCESS_MASK DesiredAccess,
    IN POBJECT_ATTRIBUTES ObjectAttributes,
    IN ULONG TitleIndex,
    IN PUNICODE_STRING Class,
    IN ULONG CreateOptions,
    OUT PULONG Disposition
    );
// KeyHandle: 获得的注册表句柄
// DesiredAccess:访问权限,一般设置为 KEY_ALL_ACCESS
// ObjectAttributes: OBJECT_ATTRIBUTES 数据结构
// TitleIndex: 很少用到,一般设置为0
// Class: 很少用到,一般设置为NULL
// CreateOptions:创建时的选项,一般设置为REG_OPTION_NON_VOLATILE.
// Disposition: 返回是创建成功,还是打开成功,返回值是REG_CREATED_NEW_KEY 或者是REG_OPENED_EXISTING_KEY.
// 返回值: 返回是否创建成功

如果ZwCreateKey指定的项目部存在,则直接创建这个项目,并利用Disposition参数返回 REG_CREATED_NEW_KEY。如果该项目已经存在了, Disposition参数返回 REG_OPENED_EXISTING_KEY。以下的代码演示了如何使用ZwCreateKey函数打开注册表。

	UNICODE_STRING RegUnicodeStr;
	HANDLE hRegister;
	
	// 初始化 UNICODE_STRING 字符串
	RtlInitUnicodeString(&RegUnicodeStr, NY_REG_SOFTWARE_KEY_NAME);

	OBJECT_ATTRIBUTES objectAttributes;

	// 初始化 objectAttri
	InitializeObjectAttributes(&objectAttributes,
		&RegUnicodeStr,
		OBJ_CASE_INSENSITIVE,
		NULL,
		NULL
		);

	ULONG ulResult;

	// 创建文件
	NTSTATUS ntStatus = ZwCreateKey(&hRegister,
		KEY_ALL_ACCESS,
		&objectAttributes,
		0,
		NULL,
		REG_OPTION_NON_VOLATILE,
		&ulResult
		);
	
	if (!NT_SUCCESS(ntStatus))
	{
		// 判断是被先创建,还是已经被创建
		if (ulResult == REG_CREATED_NEW_KEY)
		{
			KdPrint(("The register item is created\n"));
		}
		else if (ulResult == REG_OPENED_EXISTING_KEY)
		{
			KdPrint(("The register item has been created, and now is opened\n"));
		}
	}

	// 创建或打开某注册表项目的子项
	UNICODE_STRING subRegUnicodeString;
	HANDLE hSubRegister;

	// 初始化UNICODE_STRING字符串
	RtlInitUnicodeString(&subRegUnicodeString, L"SubItem");

	OBJECT_ATTRIBUTES subObjectAttributes;

	// 初始化subObjectAttributes
	InitializeObjectAttributes(&subObjectAttributes,
		&subRegUnicodeString,
		OBJ_CASE_INSENSITIVE,
		hRegister,
		NULL);

	// 创建或打开注册表项目 ZwCreateKey
	ntStatus = ZwCreateKey(&hSubRegister, 
		KEY_ALL_ACCESS, 
		&subObjectAttributes, 
		0, 
		NULL, 
		REG_OPTION_VOLATILE, 
		&ulResult);

	if (NT_SUCCESS(ntStatus))
	{
		// 判断是被新创建,还是已经被创建
		if (ulResult == REG_CREATED_NEW_KEY)
		{
			KdPrint(("The register item is created\n"));
		}
		else if (ulResult == REG_OPENED_EXISTING_KEY)
		{
			KdPrint(("The register item has been created, and now is opened\n"));
		}

	}

	// 关闭注册表
	ZwClose(hRegister);
	ZwClose(hSubRegister);


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1710091.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于c++的通过cin.get()维持黑框的思考

1.前言 由于本科没有学过c语言,研究生阶段接触c上手有点困难,今天遇到关于通过cin.get()来让黑框维持的原因。 2.思考 cin.get()维持黑框不消失的原因一言蔽之就是等待输入。等待键盘的输入内容并回车(一般是回车)后cin.get()才…

2024下半年BRC-20铭文发展趋势预测分析

自区块链技术诞生以来,其应用场景不断扩展,代币标准也在不断演进。BRC-20铭文作为基于比特币区块链的代币标准,自其推出以来,因其安全性和去中心化特性,受到了广泛关注和使用。随着区块链技术和市场环境的不断变化&…

NFTScan 正式上线 Mint NFTScan 浏览器和 NFT API 数据服务

2024 年 5 月 20 号,NFTScan 团队正式对外发布了 Mint NFTScan 浏览器,将为 Mint 生态的 NFT 开发者和用户提供简洁高效的 NFT 数据搜索查询服务。NFTScan 作为全球领先的 NFT 数据基础设施服务商,Mint 是继 Bitcoin、Ethereum、BNBChain、Po…

maven聚合工程整合springboot+mybatisplus遇到的问题

前言(可以直接跳过看下面解决方法) 项目结构 两个module: yema-terminal-boot 是springboot项目,子包有:controller、service、dao 等等。属于经典三层架构。那么,该module可以理解为是一个单体项目&…

python打造自定义汽车模块:从设计到组装的全过程

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、引言 二、定义汽车模块与核心类 三、模拟汽车组装过程 四、抽象与封装 五、完整汽车…

液氮罐内部会污染吗

液氮罐是一种常见的存储液态氮的设备,广泛应用于科研、生物医药、食品冷冻等领域。但是,人们对于液氮罐内部是否会产生污染一直存在疑问。 我们来看液氮罐内部可能的污染源。液氮罐内部主要存在以下几种潜在的污染来源:气体污染、杂质污染、…

飞睿智能高精度、低功耗测距,无线室内定位UWB芯片如何改变智能家居

在数字化和智能化快速发展的今天,定位技术已经成为我们日常生活中不可或缺的一部分。然而,传统的GPS定位技术在室内环境中往往束手无策,给我们的生活带来了诸多不便。幸运的是,随着科技的不断进步,一种名为UWB&#xf…

Octo:伯克利开源机器人开发框架

【摘要】在各种机器人数据集上预先训练的大型策略有可能改变机器人学习:这种通用机器人策略无需从头开始训练新策略,只需使用少量领域内数据即可进行微调,但具有广泛的泛化能力。然而,为了广泛应用于各种机器人学习场景、环境和任…

FM1800隧道广播插播控制器

隧道广播插播控制器是一款群载波&应急广播插播控制器采用SDR软件无线电技术,产生独立的插播信号与“群载波”信号,本设备可通过软件无线电技术将音频信号调制成调频载波或“群载波”信号,分别送入插播主机,实现隧道广播远端机…

uart_tty_驱动程序框架

UART子系统(四) TTY驱动程序框架_tty驱动框架-CSDN博客

摩尔投票法——代码实现及注释(力扣169题:找出列表中多数元素)

题源:. - 力扣(LeetCode) 目录 一、摩尔投票法 1.1 关键思想 1.2 时空复杂度 1.3 算法详细步骤 1.4 代码 1.5 算法理解 一、摩尔投票法 摩尔投票法(Boyer–Moore Majority Vote Algorithm),也被称为…

新版idea配置git步骤及项目导入

目录 git安装 下载 打开git Bash 配置全局用户名及邮箱 查看已经配置的用户名和邮箱 在IDEA中设置Git 问题解决 项目导入 git安装 下载 进入官网 Git - Downloads 点击所属本机系统,window如下图 选择64位安装 按照默认步骤一直下一步即可 打开git Bash …

倒计时 1 天!「飞天技术沙龙-CentOS 迁移替换专场」演讲亮点一览

各位开发者们: 「飞天技术沙龙 - CentOS 迁移替换专场」即将于本周三在北京召开!昨天,小龙为参会者公布了详细参会指南,今天带大家了解各演讲内容亮点。 活动时间:5 月 29 日(本周三) 13:30-17…

webpack构建流程

对webpack的理解: webpack 是一个用于现代 JavaScript 应用程序的静态模块打包工具 可以使用webpack管理模块 因为在webpack看来,项目中的所有资源皆为模块,通过分析模块间的依赖关系,在其内部构建出一个依赖图,最终编…

地图数据导入

OpenStreetMap 地图数据官网 Geofabrik Download Server 下载数据 china-latest-free.shp.zip 解压到 D:\works\mapworks\shp\tmp 解压找到相关数据(目前我要的是铁路数据) 导入 gis_osm_railways_free_1.shp 到 pgAdmin4 数据库 1.启动 C:\Progra…

海外仓系统哪家好?闭坑指南,擦亮眼睛选对系统

可以说现在的海外仓系统市场还是比较杂乱的,各种不同类型,不同收费标准的系统比比皆是,这让很多想引进海外仓系统的企业不知所措,不知道怎么选。 今天就聊一下在选择海外仓系统的时候应该如何考量,才能避免被坑&#…

深度学习设计模式之组合模式

文章目录 前言一、介绍二、详细分析1.核心组成2.实现步骤3.代码示例4.优缺点优点缺点 5.使用场景 总结 前言 组合模式是将对象组合成树形结构来表现"整体/部分"层次结构,可以更好的实现管理操作。 一、介绍 组合设计模式又叫部分整体模式,将…

变分自编码器与传统编码器:比较、应用与发展历程

变分自编码器与传统编码器:比较、应用与发展历程传统自编码器(AE)基本原理应用发展起源 变分自编码器(VAE)基本原理应用发展起源 结论 变分自编码器与传统编码器:比较、应用与发展历程 在深度学习和机器学…

C++:vector的介绍及使用

✨✨✨学习的道路很枯燥,希望我们能并肩走下来! 文章目录 文章目录 前言 一、vector的介绍 二、vector的使用 2.1.构造和赋值重载(Member functions) 2.2 vector iterator 的使用 2.3 vector 空间增长问题 2.4 vector 增删查改 三 sort 四 v…

Kali : 安装Google Chrome 浏览器和ChromeDriver

目录 一、安装Google Chrome 浏览器 1、下载Google Chrome 2、安装Chrome 3、安装依赖包 二、安装ChromeDriver 1、查看Chrome版本 ​2、下载ChromeDriver 3、解压下载包 4、设置全局访问 5、赋予可执行权限 6、验证chromedriver 7、程序测试 一、安装Google Chrom…