有哪位 C++高手,能看一下 Windows 注册表的代码原理?

2021-05-07 17:59:35 +08:00
 3dwelcome

注册表就是一个数据库,键值查找非常快,windows 把几乎大部分程序的相关信息,都写入了注册表,包括巨量 COM 信息。

心血来潮想看一下查找原理,找到了源代码,但硬是没看懂。

不知道用到了 hashtable 来查找键值,还是二分法查找,或者是黑白树?


头文件定义结构: https://github.com/CupertinoDude/windows2000/blob/master/private/ntos/inc/hivedata.h

具体的查找代码: https://github.com/CupertinoDude/windows2000/blob/master/private/ntos/config/hivemap.c

1633 次点击
所在节点    问与答
6 条回复
sillydaddy
2021-05-07 18:46:02 +08:00
原来是开源的啊,感谢分享。
secondwtq
2021-05-07 19:08:53 +08:00
硬看源码咋可能看得懂 ... 看源码之前先找设计文档,相关团队发出来的文章,相关的 Talk,Windows 这种带项目更方便,有书,Windows Internals 里面肯定有相关章节
就算真要看源码,也是先看注释再看具体实现

https://stackoverflow.com/questions/10364281/windows-registry-hive-files-documentation

当然很多项目上面都没有 ... 这时候看源码是最后的 fallback
3dwelcome
2021-05-07 19:57:51 +08:00
@secondwtq 我倒不是想写一个注册表文件解析工具,就是觉得有了详细的代码和注释后,想搞明白注册表是怎么对 KEY 来建索引的。

然后饶了大半天,成功把自己绕晕。
ysc3839
2021-05-07 23:48:41 +08:00
@sillydaddy 这个代码应该是泄漏的代码。
不过实际上是有开源的代码,可以参考 ReactOS 的实现。
另外我估计应该有什么开源的解析 reg hive (注册表数据文件) 的库,可以直接看这个。
ysc3839
2021-05-07 23:52:04 +08:00
@ysc3839 去搜了下,有个用 C 写的 hivex https://github.com/libguestfs/hivex
还有个用 Python 写的 regipy https://github.com/mkorman90/regipy
3dwelcome
2021-05-08 01:54:48 +08:00
@ysc3839

感谢,hivex 代码真是好理解太多,超级容易就找到了,叫 calc_hash,函数名称说明一切,都不需要加注释。

相应的回头找微软对应的方法,就容易很多,叫 CmpComputeHashValue,真是大海捞针。

---

算法很简单,每个子 KEY 下面都有一个 DWORD 类型的 HASH,根据当前的键名计算得来,代码就一句:
NameConvKey = 37 * NameConvKey + (ULONG) RtlUpcaseUnicodeChar(*Cp);

其中 Cp 是注册表键名,RtlUpcaseUnicodeChar 把所有字符转成大写,NameConvKey 就是最终 32 位的 hash 索引。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/775478

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX