Função RtlFillDeviceMemory (wdm.h)
A função RtlFillDeviceMemory fornece o comportamento RtlFillVolatileMemory (por exemplo, definir o conteúdo de um buffer sem interferência de otimizações do compilador) em situações em que o desenvolvedor precisa ter certeza adicionalmente de que falhas de alinhamento não serão geradas ao acessar a memória do dispositivo.
Sintaxe
volatile void * RtlFillDeviceMemory(
[out] volatile void *Destination,
[in] size_t Length,
[in] int Fill
);
Parâmetros
[out] Destination
Um ponteiro para o endereço inicial do bloco de memória a ser preenchido.
[in] Length
O tamanho do bloco de memória a ser preenchido, em bytes. Esse valor deve ser menor que o tamanho do buffer de destino .
[in] Fill
O valor de byte com o qual preencher o bloco de memória.
Retornar valor
Retorna o valor de Destination.
Comentários
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 RtlFillMemory , que está sujeito a várias otimizações do compilador.
Quando a chamada for concluída, o buffer será substituído pelo valor desejado. Essas funções de acesso de memória 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 poderá executar acessos de memória não alinhados somente se a CPU der suporte a acessos de memória não alinhados na memória do dispositivo. Se a CPU não der suporte a acessos de memória de dispositivo não alinhados, 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.
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 corretamente em versões mais antigas do Windows.
Exemplo
// In this scenario we are setting data on 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 memset, RtlFillMemory,
// and even RtlFillVolatileMemory may perform unaligned memory accesses
// because it is typically faster to do this.
// To ensure only naturally aligned accesses happen, use RtlFillDeviceMemory.
RtlFillDeviceMemory(DeviceMemoryBuffer, 100, 0xAA);
Requisitos
Requisito | Valor |
---|---|
Cabeçalho | wdm.h (include Wdm.h) |
Biblioteca | volatileaccessk.lib (modo Kernel), volatileaccessu.lib (Modo de usuário) |