我一直在阅读Windows Internals的最新版本,并遇到了以下内容。
”此外,因为在链表中查找在算法上昂贵 (以线性时间完成),加载程序还维护着两棵红黑树, 是高效的二进制查找树。第一个按基地址排序,而 其次是按模块名称的哈希值排序。有了这些树, 搜索算法可以在对数时间内运行,这要多得多 Windows 8和更高版本中高效且大大加快了过程创建性能 后来。此外,为安全起见,这两个树的根与 链表,在PEB中不可访问。 “
据我了解,提到的两棵红黑树之一是指LdrpHashTable,它很简单,可以使用ntdll的PDB符号找到。但是,我似乎找不到关于这些第二棵树的太多信息。我相信我前段时间读到的内容可能是指称为LdrpModuleIndex的内容,但我似乎在PDB符号中找不到与此有关的任何内容。
我猜我在寻找的只是第二棵树的简短解释,如何找到该树的根,然后加载程序在内部调用什么函数以将模块添加到该树,以及此功能的原型。对于LdrpHashTable,我相信这发生在LdrpInsertMemoryTableEntey函数中。