枚举进程模块在有效句柄上返回无效句柄
EnumProcessModules returns invalid handle on valid handle
>我正在尝试创建一个程序,该程序将枚举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;
}
相关文章:
- 枚举进程模块在有效句柄上返回无效句柄
- 未知C++错误:致命错误:glibc检测到无效的stdio句柄
- 获取进程内存信息失败,错误 6 句柄无效
- 发布信号量返回错误 6(无效句柄)
- 如何测试 USB HID 句柄由于设备被重新插入而无效
- 为什么错误1400无效的窗口句柄
- 打电话给谁是无效的关闭手(句柄)是安全的吗?
- 在列表视图中启用分组 - 无效句柄
- DirectShow BindToObject返回无效句柄
- DoModal 返回 -1 Getlasterror 说句柄无效
- C++RegOpenKeyEx-错误6:句柄无效
- 错误 6 句柄在 Windows 上写入文件无效
- 错误 1400 无效的窗口句柄
- 关闭句柄调用上的句柄异常无效
- 调用IOCTLSTORAGE_GET_MEDIA_SERIAL_NUMBER时句柄无效
- 无效句柄(使用应用程序验证程序)
- AssignProcessToJobObject失败句柄无效
- QTcpSocket -退出QRunnable时指定的句柄无效
- 为什么未初始化的返回值会导致createwindowwex的无效窗口句柄错误
- Qt 5.8 windows打印机api无效句柄错误