Я сделал этот простой класс, чтобы открыть процесс и прочитать из него память:
Проблема в том, что когда я вызываю ReadDWORD
с любым адресом памяти ReadProcessMemory
, происходит сбой с кодом ошибки 6: ERROR_INVALID_HANDLE, The handle is invalid
. И я не могу понять, что я делаю неправильно.
Если я добавлю деталь OpenProcess
в функцию ReadDWORD
, она будет работать нормально. Что-то не так с тем, как я храню ручку? Почему он становится недействительным, прежде чем я его использую?
memory.h
#ifndef MEMORY_H
#define MEMORY_H
#include <windows.h>
#include <psapi.h>
#pragma comment(lib, "psapi.lib")
#include <iostream>
class Memory
{
public:
Memory();
Memory(DWORD offset);
~Memory();
DWORD ReadDWORD(DWORD addr);
private:
HANDLE m_hProc;
DWORD m_Offset;
};
#endif
Memory.cpp
#include "Memory.h"
Memory::Memory()
{
Memory(0);
}
Memory::Memory(DWORD offset)
{
m_hProc = OpenProcess(PROCESS_VM_READ | PROCESS_QUERY_INFORMATION, false, 5444); // 5444 is the PID of a process I'm testing this with
m_Offset = offset;
}
Memory::~Memory()
{
CloseHandle(m_hProc);
}
DWORD Memory::ReadDWORD(DWORD addr)
{
// Optional memory offset
addr += m_Offset;
DWORD value = -1;
int result = ReadProcessMemory(m_hProc, (LPVOID)addr, &value, sizeof(DWORD), NULL);
if (result == 0)
std::cout << "ReadProcessMemory error: " << GetLastError() << std::endl;
return value;
}