Поделиться через


Функция 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

См. также

MM_COPY_ADDRESS

MmMapIoSpace