Compartilhar via


Função RtlCopyDeviceMemory (wdm.h)

A função RtlCopyDeviceMemory fornece o comportamento RtlCopyVolatileMemory (por exemplo, copiar memória de um local para outro sem interferência de otimizações do compilador) em situações em que o desenvolvedor precisa ter certeza adicional de que falhas de alinhamento não serão geradas ao acessar a memória do dispositivo.

Sintaxe

volatile void * RtlCopyDeviceMemory(
  [out] volatile void       *Destination,
  [in]  volatile const void *Source,
  [in]  size_t              Length
);

Parâmetros

[out] Destination

Um ponteiro para o endereço inicial do destino do bloco copiado.

[in] Source

Um ponteiro para o endereço inicial do bloco de memória a ser copiado.

[in] Length

O tamanho do bloco de memória a ser copiado, em bytes.

Retornar valor

Retorna o valor de Destination.

Comentários

A função RtlCopyDeviceMemory tem as seguintes propriedades:

  • A função não é reconhecida como um compilador intrínseco, portanto, o compilador nunca otimizará a chamada (totalmente ou substituirá a chamada por uma sequência equivalente de instruções). Isso difere de RtlCopyMemory , que está sujeito a várias otimizações do compilador.

  • Quando a chamada retorna, os dados foram copiados de Origem para Destino. Essas funções de acesso de memória à Origem e ao Destino só serão executadas dentro da função (por exemplo, o compilador não pode mover acessos de memória para fora dessa função).

  • A função só poderá executar acessos de memória não assinados se a CPU der suporte a acessos de memória não assinados na memória do dispositivo. Se a CPU não oferecer suporte a acessos de memória de dispositivo não assinados, somente os acessos alinhados serão executados.

  • A função pode acessar locais de memória mais de uma vez como parte de sua operação de cópia.

  • Não dá suporte a operações de cópia quando Source e Destination se sobrepõem. Se forem fornecidos buffers sobrepostos, falhará rapidamente com o código de erro FAST_FAIL_INVALID_ARG.

Observação

Essa função garante apenas que os requisitos da CPU para acessar a memória mapeada como memória do dispositivo sejam respeitados. Se um dispositivo específico tiver seus próprios requisitos específicos para ser acessado, essa função não deverá ser usada (e, em vez disso, o desenvolvedor deverá implementar suas próprias funções de acessador). Por exemplo, essa função não garante o tamanho dos acessos de memória gerados (a menos que a própria CPU imponha esses requisitos).

Observação

Essa função funciona em todas as versões do Windows, não apenas nas mais recentes. Você precisa consumir o WDK mais recente para obter a declaração de função do cabeçalho wdm.h. Você também precisa da biblioteca (volatileaccessk.lib) do WDK mais recente. No entanto, o driver resultante será executado bem em versões mais antigas do Windows.

Exemplo

UCHAR* CopyBuffer;

// In this scenario we are copying data from memory mapped
// as "device memory" (for example, memory not backed by RAM). On
// some platforms like ARM64, device memory cannot tolerate
// memory accesses that are not naturally aligned (for example, a 4-byte
// load must be 4-byte aligned). Functions like memcpy, RtlCopyMemory,
// and even RtlCopyVolatileMemory may perform unaligned memory accesses
// because it is typically faster to do this.
// To ensure only naturally aligned accesses happen, use RtlCopyDeviceMemory.

RtlCopyDeviceMemory(CopyBuffer, DeviceMemoryBuffer, 100);

Requisitos

Requisito Valor
Cabeçalho wdm.h (inclua Wdm.h)
Biblioteca volatileaccessk.lib (modo Kernel), volatileaccessu.lib (modo usuário)

Confira também

RtlCopyMemory

RtlCopyVolatileMemory