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