枚举进程模块在有效句柄上返回无效句柄

EnumProcessModules returns invalid handle on valid handle

本文关键字:句柄 无效 返回 有效 模块 枚举进程      更新时间:2023-10-16

>我正在尝试创建一个程序,该程序将枚举CSGO中的所有模块。但是句柄似乎在某种程度上对EnumProcessModules函数无效。它不为零,否则工作正常。尝试以管理员身份运行它,但结果保持不变

#include <Windows.h>
#include <TlHelp32.h>
#include <iostream>
#include <string>
#include <psapi.h>
#include <tchar.h>
using namespace std;
struct ret
{
HANDLE pHandle;
DWORD pid, bytes;
HMODULE hmod[1024];
};
ret GetHandleToCSGO()
{
PROCESSENTRY32 pe;
pe.dwSize = sizeof(PROCESSENTRY32);
HANDLE tHandle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (Process32First(tHandle, &pe))
{
while (Process32Next(tHandle, &pe))
{
if (!strcmp(pe.szExeFile,"csgo.exe"))
{
ret r;
r.pHandle = OpenProcess(PROCESS_ALL_ACCESS, 0, pe.th32ProcessID);
r.pid = pe.th32ProcessID;
CloseHandle(tHandle);
return r;
}
}
}
}
void enummodules(ret)
{
ret r;
if (EnumProcessModules(r.pHandle, r.hmod, sizeof(r.hmod), &r.bytes))
{
for (int64_t i = 0; i < (r.bytes / sizeof(HMODULE)); i++)
{
TCHAR szModName[MAX_PATH];
if (GetModuleFileNameEx(r.pHandle, r.hmod[i], szModName, sizeof(szModName) / sizeof(TCHAR)))
printf(TEXT("t%s (0x%08X)n"), szModName, r.hmod[i]);
}
}
else
cout << GetLastError();
}
int main()
{
ret r; r = GetHandleToCSGO(); 
cout << r.pHandle;  
enummodules(r);
}

Microsoft Docs 都有关于这两个主题的教程,向您展示必须如何完成

  • 枚举进程
  • 枚举模块

您应该错误地检查来自 CreateToolHelp32Snapshot(( 的返回值

因为您使用的是 while 循环而不是 do while 循环,所以您实际上跳过了第一个过程。 并非所有路径都有返回值,IDE 应警告您存在返回值。

您的枚举模块实际上并不接受输入,您创建一个本地范围 ret,而不是使用您传递的那个。

这是固定代码:

#include <Windows.h>
#include <TlHelp32.h>
#include <iostream>
#include <string>
#include <psapi.h>
#include <tchar.h>
using namespace std;
struct ret
{
HANDLE pHandle;
DWORD pid, bytes;
HMODULE hmod[1024];
};
ret GetHandleToCSGO()
{
ret r{ 0 };
PROCESSENTRY32 pe;
pe.dwSize = sizeof(PROCESSENTRY32);
HANDLE tHandle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (Process32First(tHandle, &pe))
{
do
{
if (!_stricmp(pe.szExeFile, "csgo.exe"))
{
r.pHandle = OpenProcess(PROCESS_ALL_ACCESS, 0, pe.th32ProcessID);
r.pid = pe.th32ProcessID;
break;
}
} while (Process32Next(tHandle, &pe));
}
CloseHandle(tHandle);
return r;
}
void enummodules(ret r)
{
if (EnumProcessModules(r.pHandle, r.hmod, sizeof(r.hmod), &r.bytes))
{
for (int64_t i = 0; i < (r.bytes / sizeof(HMODULE)); i++)
{
TCHAR szModName[MAX_PATH];
if (GetModuleFileNameEx(r.pHandle, r.hmod[i], szModName, sizeof(szModName) / sizeof(TCHAR)))
printf(TEXT("t%s (0x%08X)n"), szModName, (unsigned int)r.hmod[i]);
}
}
else
cout << "last error: " << GetLastError();
}
int main()
{
ret r; r = GetHandleToCSGO();
cout << r.pHandle;
enummodules(r);
std::getchar();
return 0;
}