ReadProcessMemory всегда завершается ошибкой с GLE: 299 - PullRequest
1 голос
/ 11 сентября 2011

Может кто-нибудь, пожалуйста, помогите мне, я не знаю, почему функция ReadProcessMemory не работает и GetLastError = 299. Вот мой код, я не вижу, что я делаю что-то не так.

if(ReadProcessMemory(hProcess, (void*)0, IDH_Buffer, sizeof(IMAGE_DOS_HEADER), 0) != true)
        std::cout << "Failed to read from Process, GLE=" << GetLastError()  << "\n";

IDH_Buffer имеетбыть назначенным, hProcess не NULL

Мое приложение работает от имени администратора, а приложение, из которого я пытаюсь прочитать, является стандартным приложением пользовательского режима.

Пожалуйста, не могли бы вы посоветовать мне.Спасибо

1 Ответ

4 голосов
/ 11 сентября 2011

Цитирование из MSDN на Win32 Коды ошибок :

ERROR_PARTIAL_COPY
299 (0x12B)
Только часть запроса ReadProcessMemory или WriteProcessMemory была выполнена.

Я предполагаю, что указанный вами адрес содержал некоторые действительные данные, но где-то между этим адресом и (адрес + длина копии) не было отображенной памяти.

См. википедию на странице таблицы или виртуальная память , чтобы понять немного больше о том, как операционная система устанавливает адресное пространство. На этом языке где-то в этом диапазоне памяти была недопустимая запись в таблице страниц.

На самом деле, глядя на ваш код ... Очевидно, что это не сработает. Параметр BaseAddress равен нулю. Вы пытаетесь разыменовать нулевой указатель в адресном пространстве другого процесса. Если сам процесс назначения попытается это сделать, он потерпит крах. :-) Заголовок EXE не сопоставлен с адресом 0. Если вы пытаетесь прочитать из самого файла EXE, я бы предложил просто вызвать CreateFile по пути, полученному с помощью GetModuleFileNameEx.

...