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


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