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

从32位进程枚举32位进程时,CreateToolhelp32Snapshot失败 我正在编写C++中的一个基本的调试器。我试图从调试器进程获取已调试进程的已加载模块列表。我的操作系统是64位windows 7,但调试器和被调试器都是32位编译的(在任务管理器中查看时,它们的名称旁边有*32),c++,winapi,C++,Winapi,每当我试图从调试器调用调试对象上的CreateToolhelpSnapshot时,我都会得到一个299错误。MSDN表示,只有在从32位上查询64位进程时,才会发生这种情况,反之亦然。据我所知,我的两个进程都是32位的 以下是我的快照代码: HANDLE hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE32, pid); if( hModuleSnap == INVALID_HANDLE_VALUE ) { std::cou

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

以下是我的快照代码:

HANDLE hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE32, pid);
if( hModuleSnap == INVALID_HANDLE_VALUE )
{
    std::cout << "CreateToolhelp32Snapshot Error: " << GetLastError() << std::endl;
}
HANDLE hModuleSnap=CreateToolhelp32Snapshot(TH32CS\u SNAPMODULE32,pid);
if(hModuleSnap==无效的句柄值)
{

std::不能使用
TH32CS\u SNAPMODULE
而不是
TH32CS\u SNAPMODULE32

另一个原因可能是您要枚举的进程刚刚启动,尚未准备好加载其模块。因此,我要做的是在循环中调用
CreateToolhelp32Snapshot
,并在获取错误
error\u PARTIAL\u COPY
(299)时调用我等待了200毫秒,然后再次尝试枚举模块,直到不再出现此错误

如果这对您不起作用,您将不得不使用另一个API来枚举模块。请参阅本文:

PEB_LDR_数据
结构包含有关流程加载模块的信息


此处有更多详细信息:

调试器应使用
LOAD\u DLL\u DEBUG\u EVENT
来了解进程中加载了哪些模块。您确定要从正确的进程ID开始吗?如何检索
pid
值?我使用LOAD\u DLL\u DEBUG\u EVENT来检测加载的模块,但有时无法解析此时的模块名称加载时间。通过快照列出模块是为了尝试查看是否可以获得未解析DLL的模块名称。我确实确认了我有正确的pid,我保留了创建/连接进程时的一个实例。但问题仍然存在……在我的情况下,存在“扭曲”……我需要快照(无法使用LOAD_DLL事件进行收集,因为我在调试器中,需要使用Thread32First枚举进程的线程-这需要实际的快照…回答不正确…我只是坐在这里已经使用了
TH32CS_SNAPMODULE
,而您的回答没有解决问题。我修改了我的回答。