Compartilhar via


Função RtlFillVolatileMemory (wdm.h)

A função RtlFillVolatileMemory fornece o comportamento RtlFillMemory (por exemplo, definindo o conteúdo de um buffer) em situações em que o desenvolvedor precisa ter certeza de que a operação de configuração ocorre (por exemplo, não está sujeita a otimizações do compilador).

Sintaxe

volatile void * RtlFillVolatileMemory(
  [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 retorna, o buffer foi 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 se a plataforma permitir.

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

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

UCHAR SensitiveData[100];

// Imagine we temporarily store some sensitive cryptographic
// material in a buffer.

StoreCryptographicKey(&SensitiveData);

DoCryptographicOperation(&SensitiveData);

// Now that we are done using the sensitive data we want to
// erase it from the stack. We cannot call RtlFillMemory because
// if the compiler realizes that "SensitiveData" is not
// referenced again the compiler can remove the call to RtlFillMemory.
// Instead we can call RtlSecureZeroMemory2, RtlZeroVolatileMemory, or RtlFillVolatileMemory
// (the former two are convenience wrappers around the latter). These
// calls will not be optimized away by the compiler.
// Note that RtlSecureZeroMemory2 performs better than
// RtlSecureZeroMemory function.

RtlFillVolatileMemory(&SensitiveData, sizeof(SensitiveData), 0);

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