Функция MmCopyMemory (ntddk.h)
Подпрограмма mmCopyMemory копирует указанный диапазон виртуальной или физической памяти в буфер, предоставленный вызывающим объектом.
Синтаксис
NTSTATUS MmCopyMemory(
[in] PVOID TargetAddress,
[in] MM_COPY_ADDRESS SourceAddress,
[in] SIZE_T NumberOfBytes,
[in] ULONG Flags,
[out] PSIZE_T NumberOfBytesTransferred
);
Параметры
[in] TargetAddress
Указатель на буфер, предоставленный вызывающим объектом. Этот буфер должен находиться в неизменяемой памяти.
[in] SourceAddress
Структура MM_COPY_ADDRESS, передаваемая по значению, которая содержит виртуальный адрес или физический адрес данных, скопированные в буфер, на который указывает TargetAddress.
[in] NumberOfBytes
Количество байтов для копирования из SourceAddress в TargetAddress.
[in] Flags
Флаги, указывающие, является ли SourceAddress виртуальным адресом или физическим адресом. Для этого параметра определены следующие биты флагов.
Бит флага | Описание |
---|---|
MM_COPY_MEMORY_PHYSICAL | SourceAddress указывает физический адрес. |
MM_COPY_MEMORY_VIRTUAL | SourceAddress указывает виртуальный адрес. |
Эти два бита флага являются взаимоисключающими. Вызывающий объект должен задать один или другой, но не оба.
[out] NumberOfBytesTransferred
Указатель на расположение, в которое подпрограмма записывает количество байтов, успешно скопированных из SourceAddress расположение в буфере в TargetAddress.
Возвращаемое значение
MmCopyMemory возвращает STATUS_SUCCESS, если весь диапазон успешно скопирован. В противном случае возвращается состояние ошибки, и вызывающий объект должен проверить выходное значение, указываемое параметром NumberOfBytesTransferred, чтобы определить, сколько байтов было скопировано.
Замечания
Драйверы режима ядра могут вызывать эту подпрограмму для безопасного доступа к произвольным физическим или виртуальным адресам.
Если установлен флаг MM_COPY_MEMORY_PHYSICAL, SourceAddress должен указывать на обычную память, которая находится под контролем операционной системы. MmCopyMemory вернет код состояния ошибки для физических адресов, ссылающихся на пространство ввода-вывода, включающее устройства, сопоставленные с памятью, и таблицы встроенного ПО. Чтобы получить доступ к физической памяти в пространстве ввода-вывода, драйверы могут использовать подпрограмму MmMapIoSpace.
Если установлен флаг MM_COPY_MEMORY_VIRTUAL, SourceAddress может указывать на буфер в адресном пространстве системы или буфер в адресном пространстве пользователя текущего процесса. Если вызывающий объект не контролирует время существования выделения, содержащего указанный исходный адрес, MmCopyMemory может завершиться ошибкой или возвратить несогласованные данные, но не приведет к сбою системы, даже для системных адресов, которые являются недопустимыми и активируют проверку ошибок, если ссылка указана напрямую. MmCopyMemory возвращает код состояния ошибки для системных виртуальных адресов, ссылающихся на пространство ввода-вывода.
Если память на виртуальном адресе, указанном SourceAddress не является резидентом, MmCopyMemory попытается сделать его резидентным.
Требования
Требование | Ценность |
---|---|
минимальные поддерживаемые клиентские | Доступно начиная с Windows 8.1. |
целевая платформа | Всеобщий |
заголовка | ntddk.h |
библиотеки | Ntoskrnl.lib |
IRQL | <= APC_LEVEL |