Программа использует ReadProcessMemory
сканировать куски памяти на определенное значение. К сожалению когда я звоню ReadProcessMemory
Я получаю ошибку 299.
void update_memblock(MEMBLOCK *mb)
{
//variables
static unsigned char tempbuf[128*1024];
size_t bytes_left;
size_t total_read;
size_t bytes_to_read;
size_t bytes_read;
size_t sizeMem;
size_t MemoryBase;
bytes_left = mb->size;
total_read = 0;
while (bytes_left)
{
bytes_to_read = (bytes_left > sizeof(tempbuf)) ? sizeof(tempbuf) : bytes_left;
ReadProcessMemory(mb->hProc ,mb->addr + total_read,mb->buffer, bytes_to_read, (SIZE_T*)&bytes_read);
if (bytes_read != bytes_to_read)break;
memcpy(mb->buffer + total_read, tempbuf,bytes_read);
bytes_left -= bytes_read;
total_read += bytes_read;
}
mb->size = total_read;
}
Код ошибки 299 (0x12B) ERROR_PARTIAL_COPY
«Была выполнена только часть запроса ReadProcessMemory или WriteProcessMemory»
Вы получаете эту ошибку, потому что вы пытаетесь прочитать память со страницы, которая не «выделена».
Вы хотите использовать VirtualQueryEx () на каждой странице памяти, которая дает MEMORY_BASIC_INFORMATION структура, которая содержит 2 переменные заметки:
Состояние: может быть MEM_COMMIT, MEM_FREE или MEM_RESERVE
Защитить: может быть любой из Константы защиты памяти
Вы хотите пройтись по всем страницам памяти, вызвать на них VirtualQueryEx () и пропустить все плохие страницы. Мне нравится пропускать все страницы / регионы в каком состоянии! = MEM_COMMIT и Protect == PAGE_NOACCESS
Вот пример кода psuedo:
MEMORY_BASIC_INFORMATION mbi = { 0 };
while (LoopingThroughTheMemories.bat)
{
if (!VirtualQueryEx(hProc, currentMemoryAddress, &mbi, sizeof(mbi))) continue
if (mbi.State != MEM_COMMIT || mbi.Protect == PAGE_NOACCESS) continue;
//good mem region, do ReadProcessMemory() stuffs
}
Других решений пока нет …