Подтвердить что ты не робот

Почему у ReadProcessMemory есть `lpNumberOfBytesRead`?

Из ReadProcessMemory в MSDN:

lpBaseAddress [in]:
Указатель на базовый адрес в указанном процессе, из которого следует читать. Прежде чем произойдет какая-либо передача данных, система проверит, что все данные в базовом адресе и памяти указанного размера доступны для доступа на чтение, а если он недоступен, функция не работает.

nSize [in]:
Количество байтов, которые нужно читать из указанного процесса.

lpNumberOfBytesRead [out]
Указатель на переменную, которая получает количество байтов, переданных в указанный буфер. Если значение lpNumberOfBytesRead равно NULL, параметр игнорируется.

Итак, ReadProcessMemory может полностью преуспеть или полностью выйти из строя. И размер, очевидно, известен вызывающему, - должен был передать его, чтобы позвонить. Почему lpNumberOfBytesRead?

4b9b3361

Ответ 1

От winerror.h:

//
// MessageId: ERROR_PARTIAL_COPY
//
// MessageText:
//
//  Only part of a ReadProcessMemory or WriteProcessMemory request was completed.
//
#define ERROR_PARTIAL_COPY               299L

ReadProcessMemory вернет FALSE, а GetLastError вернет ERROR_PARTIAL_COPY, когда копия попадет на страницу с ошибкой. Это общий сценарий в самосвалах, которые должны работать с потенциально поврежденным процессом, поэтому они не могут быть уверены, что запрашиваемая область действительна или нет (указатель, который они преследовали, чтобы получить начальный адрес, мог быть поврежден и указать на la- la-land), но они все равно хотели бы скопировать как можно больше в дамп.

Ответ 2

Возможно, в некоторых предыдущих версиях API эта функция не полностью потерпела неудачу, но могла возвращать частичные результаты. Таким образом, параметр out поддерживается для совместимости, но более новые программы могут передавать NULL и игнорировать его.

Ответ 3

Я предполагаю, что область может быть доступна с точки зрения разрешений, но ошибка в ошибке страницы может позволить только часть ее чтения. Это всего лишь предположение.

Изменить: Смотрите эту страницу: ReactOS - STATUS_PARTIAL_COPY

> // Otherwise, we failed  probably during the move

Кажется, что любая проблема, которая из-под контроля функции может вернуть этот код ошибки.

Ответ 4

Другая возможность, кроме 9000 answer, заключается в том, что этот параметр существует для будущих целей расширения. Возможно, в какой-то момент (и, возможно, даже сейчас) планировалось реализовать реализации ReadProcessMemory, которые могли бы частично потерпеть неудачу, поэтому по этой причине был поставлен параметр out. Это было бы (не особенно хорошим) способом избежать всего API/APIEx/APIEx2/любой проблемы, с которой в течение многих лет работали API Win32.

Ответ 5

Есть неотъемлемое состояние расы. Копии не мгновенные. Несомненно, функция проверяет, может ли она преуспеть, но возможно, что диапазон памяти не будет отображаться во время копирования. В конце концов, это еще один процесс, который вы смотрите, скорее всего, не знаете о вашем текущем ReadProcessMemory().

(Ремус Русану также намекнул на такую ​​частичную копию, но предложил испорченный процесс как первопричину, а не расу.)