Condividi tramite


Funzione RtlFillVolatileMemory (wdm.h)

La funzione RtlFillVolatileMemory fornisce il comportamento RtlFillMemory (ad esempio, l'impostazione del contenuto di un buffer) in situazioni in cui lo sviluppatore deve assicurarsi che si verifichi l'operazione di impostazione (ad esempio, non è soggetta alle ottimizzazioni del compilatore).

Sintassi

volatile void * RtlFillVolatileMemory(
  [out] volatile void *Destination,
  [in]  size_t        Length,
  [in]  int           Fill
);

Parametri

[out] Destination

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

[in] Length

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

[in] Fill

Valore di byte con cui riempire il blocco di memoria.

Valore restituito

Restituisce il valore di Destination.

Commenti

  • La funzione non viene riconosciuta come intrinseco del compilatore, quindi il compilatore non ottimizza mai la chiamata (interamente o sostituisce la chiamata con una sequenza equivalente di istruzioni). Ciò è diverso da RtlFillMemory , soggetto a varie ottimizzazioni del compilatore.

  • Al termine della chiamata, il buffer è stato sovrascritto con il valore desiderato. Queste funzioni accedono alla memoria alla destinazione verranno eseguite solo all'interno della funzione ( ad esempio, il compilatore non può spostare gli accessi alla memoria da questa funzione).

  • La funzione può eseguire accessi alla memoria non allineati se la piattaforma lo consente.

  • La funzione può accedere più volte ai percorsi di memoria come parte dell'operazione.

Nota

Questa funzione funziona su tutte le versioni di Windows, non solo sulla versione più recente. Per ottenere la dichiarazione di funzione dall'intestazione wdm.h, è necessario utilizzare la chiave WDK più recente. È necessaria anche la libreria (volatileaccessk.lib) dalla versione più recente di WDK. Tuttavia, il driver 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 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);

Requisiti

Requisito Valore
Intestazione wdm.h (include Wdm.h)
Libreria volatileaccessk.lib (modalità kernel), volatileaccessu.lib (modalità utente)

Vedi anche

RtlFillMemory