- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Windows驱动开发技术详解笔记
Windows驱动开发技术详解笔记 4 基本语法回顾
?4
和文件操作类似,在操作注册表之前需要首先打开注册表,获得一个句柄,这可以通过函数ZwCreateKey?ZwCreateFile函数类似,它通过一个OBJECT_ATTRIBUTES?获得需要创建或打开的路径信息,但在内核中这个路径与用户模式下不相同,实际上,因为用户模式下的应用程序总是由某个“当前用户”打开的,因此在用户模式下可以直接访问HKEY_CLASSES_ROOT?和HKEY_CURRENT_USER,但工作在内核模式下的驱动程序不属于任何一个用户,因此不能直接访问这两个根键。
如果ZwCreateKey?Disposition参数返回REG_CREATED_NEW_KEY;如果指定项已经存在了,则?Disposition返回值REG_OPENED_EXISTING_KEY。DDK同样提供了一个ZwOpenKey函数用以简化打开注册表的操作。同时DDK还提供一系列以Rtl?开头的运行时函数,它们可以是对Zw系列函数的封装,可以有效地简化对注册表的操作过程。
表?Zw
/en-us/library/ff566425%28VS.85%29.aspx
表?Rtl
/en-us/library/ff561822%28VS.85%29.aspx
1 读写注册表
注册表是以二元形式存储的,即“”和“键值”,通过键名来设置键值,其中键值分为多种情况。
表 注册键类型
通过ZwSetValueKe y?ZwQueryValueKe y?函
数查询相关键值。
2
枚举注册表通常分两种情况:枚举一个注册表项的所有子项和枚举一个注册表项的所有子键。
枚举子项使用ZwQueryKeyZwQueryValueKey)和ZwEnumerateKe y配合完成,枚举子键使用ZwQueryKey和ZwEnumerateValueKey配合完成。
我们以枚举子项来说明思路,首先利用ZwQueryKeyZwEnumerateKe y来获取指定子项的详细信息,这个过程是通过一个子项索引(index)来完成的。在使用ZwQueryKey时,可以将参数KeyInformationClass指定为KeyFullInformation,它对应KEY_FULL_INFORMATION结构中的SubKeys指明了该项中有多少子项。
3)一个例子如下
代码
一般使用ZwQueryValueKey来读取注册表中键的值。要注意的是注册表中的值可能有多种数据类型。而且长度也是没有定数的。为此,在读取过程中,就可能要面对很多种可能的情况。
/en-us/library/ff567069%28VS.85%29.aspx
其参数中:
KeyValueInformationClass:本次查询所需要查询的信息类型。这有如下的三种可能。
KeyValueBasicInformation:获得基础信息,包含值名和类型。
KeyValueFullInformation:获得完整信息。包含值名、类型和值的数据。
KeyValuePartialInformation:获得局部信息。包含类型和值数据。
使用KeyValuePartialInformation最常见。
KeyValueInformation:当KeyValueInformationClass被设置为KeyValuePartialInformation时,KEY_VALUE_PARTIAL_INFORMATION结构将被返回到这个指针所指内存中。
示例代码:
代码
写:
ZwSetValueKey
/en-us/library/ff567109%28VS.85%29.aspx
其中的TileIndex参数请始终填入0。
Data是要写入的数据的开始地址,而DataSize是要写入的数据的长度。由于Data是一个空指针,因此,Data可以指向任何数据。?ZwSetValueKey执行时:如果Value已经存在,则写入覆盖,否则新建一个。下面的例子写入一个名字为“Test”,而且值为“My Test Value”的字符串值。假设my_key是一个已经打开的子键的句柄。
UNICODE_STRING name RTL_CONSTANT_STRING L”Test” ;
PWCHAR value L”My Test Value”? ;
…
//?数据长度要将字符串长度加上1,把最后一个空结束符
status ZwSetValueKey my_key,
name,0,REG_SZ,value, wcslen value +1 *sizeof WCHAR ;
if !NT_SUCCESS status //?错误处理
·?下一代云计算模式:Docker正掀起个性化商业革命
文档评论(0)