Compartilhar via


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)

Confira também

RtlFillMemory

RtlFillVolatileMemory