Função MmCopyMemory (ntddk.h)

A rotina MmCopyMemory copia o intervalo especificado de memória virtual ou física no buffer fornecido pelo chamador.

Sintaxe

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

Um ponteiro para um buffer fornecido pelo chamador. Esse buffer deve estar na memória não página.

[in] SourceAddress

Uma estrutura MM_COPY_ADDRESS , passada por valor, que contém o endereço virtual ou o endereço físico dos dados a serem copiados para o buffer apontado por TargetAddress.

[in] NumberOfBytes

O número de bytes a serem copiados de SourceAddress para TargetAddress.

[in] Flags

Sinalizadores que indicam se SourceAddress é um endereço virtual ou um endereço físico. Os bits de sinalizador a seguir são definidos para esse parâmetro.

Bit de sinalizador Descrição
MM_COPY_MEMORY_PHYSICAL SourceAddress especifica um endereço físico.
MM_COPY_MEMORY_VIRTUAL SourceAddress especifica um endereço virtual.

Esses dois bits de sinalizador são mutuamente exclusivos. O chamador deve definir um ou outro, mas não ambos.

[out] NumberOfBytesTransferred

Um ponteiro para um local no qual a rotina grava o número de bytes copiados com êxito do local SourceAddress para o buffer em TargetAddress.

Retornar valor

MmCopyMemory retornará STATUS_SUCCESS se todo o intervalo tiver sido copiado com êxito. Caso contrário, um erro status será retornado e o chamador deverá inspecionar o valor de saída apontado pelo parâmetro NumberOfBytesTransferred para determinar quantos bytes foram realmente copiados.

Comentários

Os drivers no modo kernel podem chamar essa rotina para acessar com segurança endereços físicos ou virtuais arbitrários.

Se o sinalizador MM_COPY_MEMORY_PHYSICAL estiver definido, SourceAddress deverá apontar para a memória regular que está sob controle do sistema operacional. MmCopyMemory retornará um erro status código para endereços físicos que se referem ao espaço de E/S, que inclui dispositivos mapeados em memória e tabelas de firmware. Para acessar a memória física no espaço de E/S, os drivers podem usar a rotina MmMapIoSpace .

Se o sinalizador MM_COPY_MEMORY_VIRTUAL estiver definido, SourceAddress poderá apontar para um buffer no espaço de endereço do sistema ou um buffer no espaço de endereço do usuário do processo atual. Se o chamador não controlar o tempo de vida da alocação que contém o endereço de origem especificado, MmCopyMemory poderá falhar ou retornar dados inconsistentes, mas não causará uma falha no sistema, mesmo para endereços do sistema inválidos e dispararia um bug marcar se referenciado diretamente. MmCopyMemory retornará um erro status código para endereços virtuais do sistema que se referem ao espaço de E/S.

Se a memória no endereço virtual especificado por SourceAddress não for residente, MmCopyMemory tentará torná-la residente.

Requisitos

Requisito Valor
Cliente mínimo com suporte Disponível a partir do Windows 8.1.
Plataforma de Destino Universal
Cabeçalho ntddk.h
Biblioteca Ntoskrnl.lib
IRQL <= APC_LEVEL

Confira também

MM_COPY_ADDRESS

MmMapIoSpace