V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
3dwelcome
V2EX  ›  问与答

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

  •  
  •   3dwelcome · 2021-05-07 17:59:35 +08:00 · 1755 次点击
    这是一个创建于 1301 天前的主题,其中的信息可能已经有所发展或是发生改变。

    注册表就是一个数据库,键值查找非常快,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

    6 条回复    2021-05-08 01:54:48 +08:00
    sillydaddy
        1
    sillydaddy  
       2021-05-07 18:46:02 +08:00
    原来是开源的啊,感谢分享。
    secondwtq
        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
    3dwelcome
        3
    3dwelcome  
    OP
       2021-05-07 19:57:51 +08:00
    @secondwtq 我倒不是想写一个注册表文件解析工具,就是觉得有了详细的代码和注释后,想搞明白注册表是怎么对 KEY 来建索引的。

    然后饶了大半天,成功把自己绕晕。
    ysc3839
        4
    ysc3839  
       2021-05-07 23:48:41 +08:00 via Android
    @sillydaddy 这个代码应该是泄漏的代码。
    不过实际上是有开源的代码,可以参考 ReactOS 的实现。
    另外我估计应该有什么开源的解析 reg hive (注册表数据文件) 的库,可以直接看这个。
    ysc3839
        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
    3dwelcome
        6
    3dwelcome  
    OP
       2021-05-08 01:54:48 +08:00   ❤️ 1
    @ysc3839

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

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

    ---

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

    其中 Cp 是注册表键名,RtlUpcaseUnicodeChar 把所有字符转成大写,NameConvKey 就是最终 32 位的 hash 索引。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1133 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 19:07 · PVG 03:07 · LAX 11:07 · JFK 14:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.