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