从另一个DLL加载LoadLibrary函数

4
MSDN所述,DLL查找路径如下:
  1. 当前进程所在的可执行模块目录。
  2. 当前目录。
  3. Windows系统目录。GetSystemDirectory函数检索此目录的路径。
  4. Windows目录。GetWindowsDirectory函数检索此目录的路径。
  5. PATH环境变量中列出的目录。
这引出了以下疑问:
假设我有一个可执行文件位于某个目录中,例如: c:\execdir\myexe.exe ,并且它加载了一个在PATH中找到并位于c:\dlldir\mydll.dll的DLL。现在,假设mydll.dll尝试使用LoadLibrary加载另一个DLL。哪个目录会首先被查找 - c:\dlldir还是c:\execdir
我认为上面引用的查找规则表明将首先查找c:\execdir,因为那里是“当前进程的可执行模块所在的目录”,但很好从另一个来源获得确认。
编辑: 同样,是否c:\dlldir\也被考虑?毕竟,它既不是.exe所在的位置,也不是“当前目录”(如果一般来讲)。
注:我对Windows XP和7都感兴趣。

我不明白你在阅读文档后困惑的是什么。对我来说,它似乎很清楚。为什么加载第二个DLL会改变路径查找顺序呢? - Cody Gray
@Cody:因为是第二个DLL正在加载,而不是.exe文件——.exe甚至没有意识到正在从第一个DLL中加载第二个DLL。 - Eli Bendersky
@Hans:谢谢,我编辑了另一个相关的问题。 - Eli Bendersky
c:\dlldir 是被隐式地查看的。否则,DLL 将永远找不到。只有 5 条规则中的两条适用:路径或当前目录。 - Hans Passant
1个回答

4

是的,首先是可执行目录,而且在某些情况下会出现安全漏洞。该页面提供了有关确保您的应用程序不会通过此机制受到损害的建议。


那么,c:\dlldir 从未被查看,因为它既不是“可执行文件所在的位置”,也不是“当前目录”? - Eli Bendersky
@Eli 如果它不在PATH中,也不是当前目录、特殊系统目录或原始可执行文件的目录(例如,假设它实际上是c:\dlldir而不是c:\windows\system32),那么不,它就不会被加载。 - user257111

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接