Compartir a través de


Función MmCopyMemory (ntddk.h)

La rutina MmCopyMemory copia el intervalo especificado de memoria virtual o física en el búfer proporcionado por el autor de la llamada.

Sintaxis

NTSTATUS MmCopyMemory(
  [in]  PVOID           TargetAddress,
  [in]  MM_COPY_ADDRESS SourceAddress,
  [in]  SIZE_T          NumberOfBytes,
  [in]  ULONG           Flags,
  [out] PSIZE_T         NumberOfBytesTransferred
);

Parámetros

[in] TargetAddress

Puntero a un búfer proporcionado por el autor de la llamada. Este búfer debe estar en memoria no paginable.

[in] SourceAddress

Estructura de MM_COPY_ADDRESS , pasada por valor, que contiene la dirección virtual o la dirección física de los datos que se van a copiar en el búfer al que apunta TargetAddress.

[in] NumberOfBytes

Número de bytes que se van a copiar de SourceAddress a TargetAddress.

[in] Flags

Marcas que indican si SourceAddress es una dirección virtual o una dirección física. Los siguientes bits de marca se definen para este parámetro.

Bit de marca Descripción
MM_COPY_MEMORY_PHYSICAL SourceAddress especifica una dirección física.
MM_COPY_MEMORY_VIRTUAL SourceAddress especifica una dirección virtual.

Estos dos bits de marca son mutuamente excluyentes. El autor de la llamada debe establecer uno u otro, pero no ambos.

[out] NumberOfBytesTransferred

Puntero a una ubicación en la que la rutina escribe correctamente el número de bytes copiados correctamente de la ubicación SourceAddress en el búfer en TargetAddress.

Valor devuelto

MmCopyMemory devuelve STATUS_SUCCESS si todo el intervalo se ha copiado correctamente. De lo contrario, se devuelve un estado de error y el autor de la llamada debe inspeccionar el valor de salida al que apunta el parámetro NumberOfBytesTransferred para determinar cuántos bytes se copiaron realmente.

Comentarios

Los controladores en modo kernel pueden llamar a esta rutina para acceder de forma segura a direcciones físicas o virtuales arbitrarias.

Si se establece la marca MM_COPY_MEMORY_PHYSICAL, SourceAddress debe apuntar a la memoria normal que está bajo control del sistema operativo. MmCopyMemory devolverá un código de estado de error para las direcciones físicas que hacen referencia al espacio de E/S, que incluye dispositivos asignados a memoria y tablas de firmware. Para acceder a la memoria física en el espacio de E/S, los controladores pueden usar la rutina MmMapIoSpace .

Si se establece la marca MM_COPY_MEMORY_VIRTUAL, SourceAddress puede apuntar a un búfer en el espacio de direcciones del sistema o a un búfer en el espacio de direcciones del usuario del proceso actual. Si el autor de la llamada no controla la duración de la asignación que contiene la dirección de origen especificada, MmCopyMemory podría producir un error o podría devolver datos incoherentes, pero no provocará un bloqueo del sistema, incluso para las direcciones del sistema que no son válidas y desencadenaría una comprobación de errores si se hace referencia directamente. MmCopyMemory devolverá un código de estado de error para las direcciones virtuales del sistema que hacen referencia al espacio de E/S.

Si la memoria en la dirección virtual especificada por SourceAddress no es residente, MmCopyMemory intentará convertirla en residente.

Requisitos

Requisito Value
Cliente mínimo compatible Disponible a partir de Windows 8.1.
Plataforma de destino Universal
Encabezado ntddk.h
Library Ntoskrnl.lib
IRQL <= APC_LEVEL

Consulte también

MM_COPY_ADDRESS

MmMapIoSpace