gpt4 book ai didi

c++ - 从 32 位进程枚举 32 位进程时,CreateToolhelp32Snapshot 失败

转载 作者:太空宇宙 更新时间:2023-11-04 14:03:21 24 4
gpt4 key购买 nike

我正在用 C++ 编写一个基本的调试器。我正在尝试从调试器进程中获取被调试进程的加载模块列表。我的操作系统是 64 位 Windows 7,但调试器和被调试器都是 32 位编译的(在任务管理器中查看时,它们的名称旁边有 *32)。

每当我尝试从调试器调用被调试者的 CreateToolhelpSnapshot 时,我都会收到 299 错误。 MSDN 表示,只有在从 32 位进程查询 64 位进程时才会发生这种情况,反之亦然。据我所知,我的两个进程都是 32 位的。

这是我的快照代码:

HANDLE hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE32, pid);
if( hModuleSnap == INVALID_HANDLE_VALUE )
{
std::cout << "CreateToolhelp32Snapshot Error: " << GetLastError() << std::endl;
}

最佳答案

使用 TH32CS_SNAPMODULE 而不是 TH32CS_SNAPMODULE32

另一个原因可能是您要枚举的进程刚刚启动,尚未准备好加载它的模块。所以我所做的是在循环中调用 CreateToolhelp32Snapshot,当出现错误 ERROR_PARTIAL_COPY (299) 时,我等待 200 毫秒,然后再次尝试枚举模块,直到我不这样做不再出现此错误。

如果这对您不起作用,您将不得不使用另一个 API 来枚举模块。看看这篇文章:http://www.codeproject.com/Articles/19685/Get-Process-Info-with-NtQueryInformationProcess

PEB_LDR_DATA 结构包含有关进程已加载模块的信息。

此处有更多详细信息:https://msdn.microsoft.com/en-us/library/aa813708.aspx

编辑:我发现了上面没有解决问题的情况。我终于发现,只有在 CreateToolHelpSnapshot 也在 64 位进程中运行时,才能在 64 位进程中枚举模块。遗憾的是,Microsoft 实现了如此多的错误。

关于c++ - 从 32 位进程枚举 32 位进程时,CreateToolhelp32Snapshot 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18178468/

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