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) |