有哪位 C++高手,能看一下 Windows 注册表的代码原理? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
3dwelcome
V2EX    问与答

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

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

    注册表就是一个数据库,键值查找非常快,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     Solana     888 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 22ms UTC 21:19 PVG 05:19 LAX 13:19 JFK 16:19
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86