c++ - 使用 CreateToolhelp32Snapshot 时出现 Winapi 访问被拒绝错误
问题描述
我正在编写将显示其他应用程序的 PID 和基地址的应用程序。我收到了 id 5 的错误,所以Access Denied
我的问题是为什么?我以管理员身份打开,构建为发布(而不是调试),有人告诉我应该设置它,但即使这样它仍然是相同的错误。
IDE 是带有编译器 GNU GCC 64x 的 Code::Blocks
控制台输出:
Process ID = 2656
err: 5
INVALID_HANDLE_VALUE returned
BaseAddr = 0
完整代码:
#include <iostream>
#include <Windows.h>
#include <tlhelp32.h>
#include <string.h>
DWORD GetProcId(const char* procName)
{
DWORD procId = 0;
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnap != INVALID_HANDLE_VALUE)
{
PROCESSENTRY32 procEntry;
procEntry.dwSize = sizeof(procEntry);
if (Process32First(hSnap, &procEntry))
{
do
{
if (lstrcmpi(procEntry.szExeFile, procName) == 0) {
procId = procEntry.th32ProcessID;
break;
}
} while (Process32Next(hSnap, &procEntry));
}
}
CloseHandle(hSnap);
return procId;
}
uintptr_t GetModuleBaseAddress(DWORD procId, const char* modName)
{
uintptr_t modBaseAddr = 0;
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, procId);
std::cout << "err: " << GetLastError() << std::endl;
if (hSnap != INVALID_HANDLE_VALUE)
{
MODULEENTRY32 modEntry;
modEntry.dwSize = sizeof(modEntry);
if (Module32First(hSnap, &modEntry))
{
do
{
if (!stricmp(modEntry.szModule, modName))
{
modBaseAddr = (uintptr_t)modEntry.modBaseAddr;
break;
}
} while (Module32Next(hSnap, &modEntry));
}
} else {
std::cout << "INVALID_HANDLE_VALUE returned" << std::endl;
}
CloseHandle(hSnap);
return modBaseAddr;
}
int main()
{
DWORD procId = GetProcId("Game.exe");
std::cout << "Process ID = " << procId << std::endl;
uintptr_t baseAddr = GetModuleBaseAddress(procId, "Game.exe");
std::cout << "BaseAddr = " << baseAddr << std::endl;
std::getchar();
return 0;
}
解决方案
推荐阅读
- c# - 当我尝试离线安装 nuget 包文件时,Visual Studio 2019 出现错误
- bazel - javadoc 的 Bazel 规则无法传递输入源
- jms - JMS 客户端和 JMS 代理有什么区别?
- spring-boot - 如何从 Spring Boot 项目中仅导出一些包并在另一个非 Spring Boot 项目中执行它?
- python - 为给定类别创建唯一标识符(Python)
- 3d - 计算/实现两个具有 9 个自由度的边界框的真实 3D 并集交点 (IoU)
- javascript - 使用正则表达式如何排除邮件域及其子域?
- reactjs - Reactjs在浏览器页面刷新后渲染相同的路由
- php - 扩展运算符 PHP
- javascript - 在 vue js 的子组件中使用 getElementbyId 无法呈现自定义组件的样式