Compartilhar via


Função FillVolatileMemory

A função FillVolatileMemory preenche um bloco de memória com o valor de preenchimento especificado.

Importante

Algumas informações referem-se a um produto de pré-lançamento que pode ser substancialmente modificado antes de ser lançado comercialmente. A Microsoft não oferece nenhuma garantia, explícita ou implícita, quanto às informações fornecidas aqui.

Parâmetros

Parâmetro Destination [saída]

Um ponteiro para o endereço inicial do bloco de memória a ser preenchido.

Parâmetro Length [entrada]

O tamanho do bloco de memória a ser preenchido, em bytes. Esse valor deve ser menor que o tamanho do buffer de Destination.

Parâmetro Fill [entrada]

O valor em bytes usado para preencher o bloco de memória.

Sintaxe

volatile void*
  FillVolatileMemory (
    _Out_writes_bytes_all_(Length) volatile void* Destination,
    SIZE_T Length,
    INT Fill
  );

Comentários

Essa API existe para fornecer o comportamento de fillMemory (ou seja, definir o conteúdo de um buffer) em situações em que o desenvolvedor precisa garantir que a operação de configuração ocorra (ou seja, não está sujeita a otimizações do compilador). A API possui as seguintes características:

  • A API não é reconhecida como uma função intrínseca do compilador, portanto, o compilador nunca otimizará a chamada (seja totalmente ou substituindo a chamada por uma sequência "equivalente" de instruções). Isso difere de FillMemory, que está sujeito a uma variedade de otimizações do compilador.
  • Após o retorno da chamada, o buffer é completamente atualizado com o valor desejado. Os acessos à memória desta função a Destination só serão realizados dentro da função (ou seja, o compilador não pode mover acessos à memória para fora desta função).
  • A API pode realizar acessos à memória não alinhados se a plataforma permitir.
  • A API pode acessar locais de memória mais de uma vez como parte da operação.

Observação

Esta função é compatível com todas as versões do Windows, não apenas as mais recentes. Você precisa utilizar o SDK mais recente para obter a declaração de função do cabeçalho winbase.h. Você também precisa da biblioteca (volatileaccessu.lib) do SDK mais recente. No entanto, o binário resultante será executado bem 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 FillMemory because
// if the compiler realizes that "SensitiveData" is not
// referenced again the compiler can remove the call to FillMemory.
// Instead we can call SecureZeroMemory2, ZeroVolatileMemory, or FillVolatileMemory
// (the former two are convenience wrappers around the latter). These
// calls will not be optimized away by the compiler.
// Note that SecureZeroMemory2 performs better than the old
// SecureZeroMemory API.

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

Requisitos

Cliente mínimo suportado: Windows 11 Insider Preview Build TBD

Cabeçalho: winbase.h (incluir Winbase.h)

Biblioteca de modo kernel: volatileaccessk.lib

Biblioteca de modo de usuário: volatileaccessu.lib

Confira também