13

我有一个调用CreateProcess. 似乎CreateProcess返回非零表示成功。但是,该进程的 HANDLE 然后立即设置,表明该进程已退出。当我打电话时GetExitCodeProcessSTATUS_DLL_NOT_FOUND然后返回。

我了解缺少 DLL。我什至知道具体是哪一个。但是,我不明白的是如何以编程方式解决这个问题。

我注意到 Windows 会显示一个对话框,说进程无法启动,因为它找不到指定的 DLL(屏幕截图:http ://www.mediafire.com/view/?kd9ddq0e2dlvlb9 )。在对话框中,Windows 指定缺少哪个 DLL。但是,我找不到自己以编程方式获取这些信息的方法。

如果进程无法启动并返回STATUS_DLL_NOT_FOUND,我如何以编程方式检索无法找到目标进程链接到的库名称?这样我就可以在错误报告中自动记录给定安装中似乎丢失或损坏的 DLL。

4

5 回答 5

5

CreateProcess 返回 0 表示成功。

CreateProcess()返回 a BOOL,其中 0 是FALSE,也就是失败而不是成功。

如果进程无法启动并返回 STATUS_DLL_NOT_FOUND,我如何以编程方式检索无法找到目标进程链接到的库名称?

不幸的是,没有用于此的 API。您唯一的选择是手动访问和枚举可执行文件的IMPORTS表以找出它使用的 DLL,然后递归访问和枚举它们的IMPORTS表,手动检查您找到的每个 DLL 引用以查看该 DLL 文件是否存在于操作系统的搜索路径或不是。

于 2013-08-21T22:42:18.767 回答
2

如果 dll 是静态链接的,您可以遍历 iat 并查看 dll 是否存在。如果 dll 是动态加载的,那么启动暂停的进程并挂接 LoadLibrary(或者不是挂接模拟调试器)是我看到的唯一方法。

于 2013-08-21T20:30:46.813 回答
2

最好的方法是使用加载程序快照。基本上,您使用 gflags.exe(包含在 windbg 中)来启用加载程序快照;然后,在附加了调试器的情况下运行该进程。加载程序快照将使加载程序能够打印出进程的 dbg 消息并打印失败。

gflags.exe -i yourcode.exe +sls
windbg yourcode.exe

我知道这不是找出问题的“程序化”方式,但是加载器所做的事情很复杂,而且你真的不想重做它的逻辑来找出故障。这就是发明装载机卡扣的原因。

于 2019-06-20T00:19:46.007 回答
1

非常困难的方法是:解析 .EXE 和 .DLL 文件并创建 .DLL 文件的依赖关系树。

我认为没有办法获取丢失的 DLL 文件列表:当 Windows 找到一个丢失的 DLL 文件时,它会停止加载,因此如果丢失了一个 DLL 文件,您将不会发现是否还有更多的 DLL 文件丢失。

您可能遇到的另一个问题是旧 DLL 版本可能缺少“导出”(函数)。这比依赖树更难检测。

于 2013-08-21T20:15:23.193 回答
1

只是因为这在某种程度上是“STATUS_DLL_NOT_FOUND”在 Google 上的最高 stackoverflow 结果。如何追踪和解决任何随机事件:

下载SysInternals procmon64.exe(或只是整个集)。启动后立即点击镜子的“停止捕捉”按钮 (Ctrl+E)。和“清除”(Ctrl+X)。

设置过滤器:

  • '进程名称'是提到的进程名称(对我来说是'build-script-build.exe')[添加]
  • “结果”不是“成功”[添加]
  • '路径' 以 '.dll' 结尾 [添加] [确定]

再次开始捕捉 (Ctrl+E)。

再次运行有问题的东西(对我来说:)build cargo。谷歌搜索最后列出的 DLL 文件。

对我来说那是 VCRUNTIME140.dll,所以我安装了VC++ 2015 to 2019 redistributable

ProcMon 有点像 unix strace

于 2020-01-20T04:26:19.117 回答