CreateProcess STATUS_DLL_NOT_FOUND - 哪个dll?

时间:2013-08-21 19:52:28

标签: c++ c windows winapi dll

我有一个调用CreateProcess的流程。看来CreateProcess返回非零表示成功。但是,然后立即设置该过程的HANDLE,表示该过程已退出。当我致电GetExitCodeProcess时,会返回STATUS_DLL_NOT_FOUND

我知道DLL丢失了。我甚至知道究竟是哪一个。但是,我不明白的是如何以编程方式解决这个问题。

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

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

6 个答案:

答案 0 :(得分:4)

  

CreateProcess返回0表示成功。

CreateProcess()返回BOOL,其中0为FALSE,即失败并未成功。

  

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

我认为没有办法获取丢失的DLL文件列表:当Windows找到一个丢失的DLL文件时,它会停止加载,所以如果缺少一个DLL文件,你将无法找到更多的DLL文件不见了。

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

答案 3 :(得分:0)

在其他帖子上找到了答案:https://stackoverflow.com/a/475323/358006

它说要使用 Visual Studio命令提示符(在 Tools 中)和以下命令:

dumpbin /dependents my-app.exe

答案 4 :(得分:0)

由于这在某种程度上是Google上“ STATUS_DLL_NOT_FOUND”的最高堆栈溢出结果。如何跟踪和解决任何随机事件:

下载SysInternals procmon64.exe(或just the entire set)。启动后,立即点击外观上的“停止捕获”按钮(Ctrl + E)。还有“清除”(Ctrl + X)。

设置过滤器:

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

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

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

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

ProcMon有点像unix strace

答案 5 :(得分:-1)

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

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

我知道这不是找出问题的“编程方式”,但是加载程序的工作很复杂,您真的不想重做其逻辑以查找故障。这就是为什么发明了装载器卡扣的原因。