我试图获取在GetModuleFileNameA
的另一个进程中加载的模块的名称。
我已经使用dbgHelp加载了一个符号,并得到了它的模块基址,但发生了两件奇怪的事情:
1.有时GetModuleFileNameA
返回系统错误代码5:访问被拒绝。
2.它返回错误的模块名称。对于我知道在模块A中的函数,我得到模块B的名称...:/GetModuleFileNameA返回奇怪的结果
有人能帮助我吗?
谢谢:)
我试图获取在GetModuleFileNameA
的另一个进程中加载的模块的名称。
我已经使用dbgHelp加载了一个符号,并得到了它的模块基址,但发生了两件奇怪的事情:
1.有时GetModuleFileNameA
返回系统错误代码5:访问被拒绝。
2.它返回错误的模块名称。对于我知道在模块A中的函数,我得到模块B的名称...:/GetModuleFileNameA返回奇怪的结果
有人能帮助我吗?
谢谢:)
请阅读文档。它在GetModuleFileName的页面上表示
要找到由另一个进程加载的模块的文件,请使用GetModuleFileNameEx函数。
GetModuleFileName仅适用于您的过程中的模块。即使两个进程都加载了模块,它也可能位于不同的基地址。你有效地喂养GetModuleFileName垃圾。只需重申一下,您需要使用GetModuleFileNameEx
如果你的进程想访问另一个进程,它需要有权这样做。这意味着您的流程需要较高的权利,或者它必须是其他流程的所有者。
如果您得到错误的名称,您可能使用了错误的句柄。这也可以解释为什么你有时会遇到拒绝访问。如果将句柄传递给错误的模块,即使您有权访问您想知道其名称的模块,也可能无法访问该模块。
为什么世界上仍然使用该函数的ANSI版本? – 2011-04-16 07:01:06
是什么?为什么不? :) – Idov 2011-04-16 07:01:39
哈哈,函数名称末尾的'A'表示它是函数的ANSI版本。 Windows操作系统在一段时间内转向使用Unicode。这些函数的Unicode版本在名称后面有'W',而不是'A'。但是,如果你包含windows头文件('windows.h'),你所要做的就是使用函数的名字('GetModuleFileName'),并且头文件负责将它定义为正确的变体。如果您仍然定位*真正*旧版本的Windows,则应该在没有定义_UNICODE的情况下进行编译的唯一原因。 – 2011-04-16 07:05:36