我正在尝试创建一个程序,该程序将枚举CSGO中的所有模块。但是Handle似乎对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);
}
答案 0 :(得分:0)
Microsoft Docs都有关于这两个主题的教程,向您展示了必须如何完成
您应该错误地检查CreateToolHelp32Snapshot()的返回值
由于使用的是while循环而不是do while循环,因此实际上是在跳过第一个过程。并非所有路径都有返回值,您的IDE应该警告您这有问题。
您的enummodules实际上并没有输入,您创建了一个本地范围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;
}