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