我正在编写我自己版本的Windows (尽管是一个非常简单的版本),到目前为止,事情进展得相当顺利。但是,在递归地为加载的模块遍历Import表时,我遇到了一个小麻烦。
对于大多数依赖项,一切顺利,我可以简单地递归加载模块。但是,对于某些依赖项,这只会破坏目标进程。经过进一步研究,我意识到这是因为Windows并排的程序集。本质上,加载的PE中的依赖项是目标进程中使用的模块的不同SxS版本。
在一种情况下,我加载的DLL引用msvcr90.dll,但目标进程使用运行时的早期版本: msvcr71.dll。
现在,windows加载程序可以处理这个问题,因此显然有一种“正确”的方法来做到这一点。我读过一些关于激活上下文的文章,但它们并没有真正帮助我理解这个问题。
调用LoadLibrary本身也不能将dll解析为正确的版本
LoadLibraryW(L"msvcr90.dll");只需返回0。有人知道吗
( a)如何检测导入是否是SxS程序集 ( b)如何解决进程的导入到正确的SxS版本。
我真的很困惑该怎么做。我现在从研究中了解了大部分PE文件格式,但我确信SxS超出了PE结构的范围。
如果你需要更多的信息,只需评论。可执行文件没有外部清单,其嵌入清单也没有指定运行时版本。但是,它确实在其工作目录中包含msvcr71.dll的副本,如果这对任何人都有帮助的话。
干杯。
发布于 2012-06-24 08:41:49
事实上,SxS依赖超出了PE结构的范围!如您所知,PE的导入表枚举依赖项名称,但不枚举它们的版本。在处理这些依赖关系表时,Loader还会查看PE相关映像的Manifest。报表是否应该记录一个或多个库(例如msvcr90、advapi32、.)加载程序在winsxs文件夹中查找依赖项。这里有一篇文章,它概述了此程序集以及如何在C++中收集这些信息。
https://stackoverflow.com/questions/11175430
复制相似问题