Funzione RtlMoveVolatileMemory (wdm.h)
La funzione RtlMoveVolatileMemory esiste per fornire il comportamento RtlMoveMemory (ad esempio, la copia della memoria da una posizione a un'altra) in situazioni in cui lo sviluppatore deve assicurarsi che si verifichi l'operazione di copia (ad esempio, non è soggetta alle ottimizzazioni del compilatore). A differenza di RtlCopyVolatileMemory, questa funzione gestisce i casi in cui il buffer di origine e di destinazione si sovrappone.
Sintassi
volatile void * RtlMoveVolatileMemory(
[out] volatile void *Destination,
[in] volatile const void *Source,
[in] size_t Length
);
Parametri
[out] Destination
Puntatore all'indirizzo iniziale della destinazione del blocco copiato.
[in] Source
Puntatore all'indirizzo iniziale del blocco di memoria da copiare.
[in] Length
Dimensioni del blocco di memoria da copiare, in byte.
Valore restituito
Restituisce il valore di Destination.
Commenti
La funzione RtlMoveVolatileMemory ha le proprietà seguenti:
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 RtlMoveMemory , soggetto a varie ottimizzazioni del compilatore.
Al termine della chiamata, i dati sono stati copiati da Source a Destination. Questa funzione accede alla memoria all'origine e alla destinazione verrà eseguita 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 di copia.
Analogamente a RtlMoveMemory , in quanto supporta le operazioni di copia quando l'origine e la destinazione si sovrappongono tra loro.
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
HEADER MyHeader;
UCHAR RawBuffer[100];
// Ensure that the shared memory (which could be constantly changing)
// is copied in to the local MyHeader variable.
// Note that the compiler is allowed to optimize away calls to
// RtlMoveMemory so those functions are not guaranteed to actually
// make a local copy of data.
//
// RtlMoveVolatileMemory does handle buffers
// that overlap with each other (MoveMemory semantics).
// Assume SharedMemory points to virtual memory that is also mapped in an untrusted process.
// Assume that untrusted process is changing the memory contents while you are accessing it.
PVOID SharedMemory;
RtlMoveVolatileMemory(&MyHeader, SharedMemory, sizeof(MyHeader));
if (MyHeader.Size < 100) {
// Because MyHeader is local and we are guaranteed we actually made
// a local copy, we can be sure that the "Size" value will not change
// between the previous bounds check and the below call to RtlFillMemory.
// If RtlMoveMemory had been used to copy the data, it is possible
// that a compiler may optimize away the call to MoveMemory and instead fetch
// the "size" field of MyHeader directly from untrusted memory two times.
// The first time it would be fetched for the bounds check, and the second
// time it is fetched is for the call to RtlFillMemory. It is possible the memory
// could have changed between the two accesses resulting in the size check
// being ineffective.
RtlFillMemory (RawBuffer, MyHeader.Size, 0);
}
Requisiti
Requisito | Valore |
---|---|
Intestazione | wdm.h (include Wdm.h) |
Libreria | volatileaccessk.lib (modalità kernel), volatileaccessu.lib (modalità utente) |