Funzione FillVolatileMemory

La funzione FillVolatileMemory riempie un blocco di memoria con il valore di riempimento specificato.

Importante

Alcune informazioni riguardano un prodotto in versione preliminare che può essere modificato in modo sostanziale prima che venga rilasciato commercialmente. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.

Parametri

Destinazione param [out]

Puntatore all'indirizzo iniziale del blocco di memoria da riempire.

Lunghezza param [in]

Dimensione del blocco di memoria da riempire, in byte. Questo valore deve essere minore delle dimensioni del buffer di destinazione .

Riempimento param [in]

Valore di byte con cui riempire il blocco di memoria.

Sintassi

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

Osservazioni:

Questa API esiste per fornire il comportamento FillMemory (ad esempio, l'impostazione del contenuto di un buffer) in situazioni in cui lo sviluppatore deve assicurarsi che l'operazione di impostazione si verifichi (ad esempio, non è soggetta alle ottimizzazioni del compilatore). L'API ha le proprietà seguenti:

  • L'API non viene riconosciuta come un compilatore intrinseco, quindi il compilatore non ottimizza mai la chiamata (interamente o sostituisce la chiamata con una sequenza di istruzioni "equivalente"). Questo comportamento è diverso da FillMemory , soggetto a un'ampia gamma di ottimizzazioni del compilatore.
  • Al termine della chiamata, il buffer è stato sovrascritto con il valore desiderato. Questa funzione accede alla memoria alla destinazione verrà eseguita solo all'interno della funzione ( ad esempio, il compilatore non può spostare gli accessi alla memoria all'esterno di questa funzione).
  • L'API può eseguire accessi in memoria non idonei se la piattaforma lo consente.
  • L'API può accedere ai percorsi di memoria più di una volta come parte dell'operazione.

Nota

Questa funzione funziona su tutte le versioni di Windows, non solo sulla versione più recente. È necessario usare l'SDK più recente per ottenere la dichiarazione di funzione dall'intestazione winbase.h . È necessaria anche la libreria (volatileaccessu.lib) dall'SDK più recente. Tuttavia, il file binario risultante verrà eseguito correttamente nelle versioni precedenti di Windows.

Esempio

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

Requisiti

Client minimo supportato: Windows 11 Insider Preview Build TBD

Intestazione: winbase.h (include Winbase.h)

Libreria in modalità kernel: volatileaccessk.lib

Libreria in modalità utente: volatileaccessu.lib

Vedi anche