gpt4 book ai didi

c++ - 模块信息不适用于 DEBUG_PROCESS

转载 作者:行者123 更新时间:2023-11-28 08:16:45 24 4
gpt4 key购买 nike

我正在尝试使用 DEBUG_PROCESS | 创建一个进程DEBUG_ONLY_THIS_PROCESS 标志。
出于某种原因,当我尝试使用诸如“GetModuleFileNameExA”之类的方法时,我收到了“ERROR_INVALID_HANDLE”错误。
我知道我的进程句柄是正确的,但即使我这样调用方法也会发生这种情况:

GetModuleFileNameExA(processHandle, NULL ,moduleFileName, sizeof(moduleFileName));

应该给出进程的主要模块的名称。
我在 MSDN 中读到标志:PROCESS_VM_READ 和 PROCESS_QUERY_INFORMATION 是该进程创建所必需的,但我将其与 DEBUG_PROCESS | 一起尝试DEBUG_ONLY_THIS_PROCESS 但没有帮助。
当我将我的程序附加到正在运行的进程时,它工作正常。
我做错了什么?

最佳答案

如果成功,CreateProcess 返回的句柄具有 PROCESS_ALL_ACCESS,所以这不是问题所在。问题是在CreateProcess 之后Windows 还没有执行初始化,因此没有设置模块列表。无论您使用什么接口(interface)(Toolhelp、psapi、kernel32),此时尝试查询被调试者的模块(甚至是主模块)都会失败。

最好的办法是等待 CREATE_PROCESS_DEBUG_EVENT 然后查询。如果您需要已加载 DLL 的名称,则必须等待它们加载并接收 LOAD_DLL_DEBUG_EVENT。上次我在 XP 上查看时,它们也无法在此处查询,您必须等待下一个调试事件才能获得该信息。

也许求助于 native NT API 可能会有所帮助,或者它可能会在 Vista 及更高版本上得到修复。

出于好奇,为什么在调用 CreateProcess 时需要模块文件名?

关于c++ - 模块信息不适用于 DEBUG_PROCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7462035/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com