1

我正在用 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;
}
4

1 回答 1

0

使用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 位进程中枚举模块才能正常工作。很遗憾微软实现了这个错误。

于 2015-11-23T16:11:15.087 回答