注册表就是一个数据库,键值查找非常快,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
1
sillydaddy 2021-05-07 18:46:02 +08:00
原来是开源的啊,感谢分享。
|
2
secondwtq 2021-05-07 19:08:53 +08:00 2
硬看源码咋可能看得懂 ... 看源码之前先找设计文档,相关团队发出来的文章,相关的 Talk,Windows 这种带项目更方便,有书,Windows Internals 里面肯定有相关章节
就算真要看源码,也是先看注释再看具体实现 https://stackoverflow.com/questions/10364281/windows-registry-hive-files-documentation 当然很多项目上面都没有 ... 这时候看源码是最后的 fallback |
3
3dwelcome OP |
4
ysc3839 2021-05-07 23:48:41 +08:00 via Android
@sillydaddy 这个代码应该是泄漏的代码。
不过实际上是有开源的代码,可以参考 ReactOS 的实现。 另外我估计应该有什么开源的解析 reg hive (注册表数据文件) 的库,可以直接看这个。 |
5
ysc3839 2021-05-07 23:52:04 +08:00 via Android 2
@ysc3839 去搜了下,有个用 C 写的 hivex https://github.com/libguestfs/hivex
还有个用 Python 写的 regipy https://github.com/mkorman90/regipy |
6
3dwelcome OP @ysc3839
感谢,hivex 代码真是好理解太多,超级容易就找到了,叫 calc_hash,函数名称说明一切,都不需要加注释。 相应的回头找微软对应的方法,就容易很多,叫 CmpComputeHashValue,真是大海捞针。 --- 算法很简单,每个子 KEY 下面都有一个 DWORD 类型的 HASH,根据当前的键名计算得来,代码就一句: NameConvKey = 37 * NameConvKey + (ULONG) RtlUpcaseUnicodeChar(*Cp); 其中 Cp 是注册表键名,RtlUpcaseUnicodeChar 把所有字符转成大写,NameConvKey 就是最终 32 位的 hash 索引。 |