Condividi tramite


Funzione RtlCopyVolatileMemory (wdm.h)

La funzione RtlCopyVolatileMemory fornisce il comportamento RtlCopyMemory (ad esempio, la copia della memoria da una posizione a un'altra) in situazioni in cui lo sviluppatore deve assicurarsi che l'operazione di copia si verifichi (ad esempio, non è soggetta alle ottimizzazioni del compilatore).

Sintassi

volatile void * RtlCopyVolatileMemory(
  [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 RtlCopyVolatileMemory ha le proprietà seguenti:

  • La funzione non viene riconosciuta come intrinseca del compilatore in modo che il compilatore non ottimizza mai la chiamata (completamente o sostituisca la chiamata con una sequenza equivalente di istruzioni). Ciò è diverso da RtlCopyMemory che è soggetto a varie ottimizzazioni del compilatore.

  • Quando la chiamata viene restituita, i dati sono stati copiati da Origine a Destinazione. Queste funzioni accedono alla memoria all'origine e alla destinazione verranno eseguite solo all'interno della funzione( ad esempio, il compilatore non può spostare gli accessi alla memoria fuori da questa funzione).

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

  • La funzione può accedere alle posizioni di memoria più di una volta come parte dell'operazione di copia.

  • È simile a RtlCopyMemory in cui non 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 sull'ultima versione. È necessario utilizzare il WDK più recente per ottenere la dichiarazione di funzione dall'intestazione wdm.h. È anche necessaria la libreria (volatileaccessk.lib) dall'ultimo 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
// RtlCopyMemory so those functions are not guaranteed to actually
// make a local copy of data.
//
// RtlCopyVolatileMemory does not handle a source/dest buffer that overlap
// with each other (RtlCopyMemory 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;

RtlCopyVolatileMemory(&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 RtlCopyMemory had been used to copy the data, it is possible
    // that a compiler may optimize away the call to RtlCopyMemory 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)

Vedi anche

RtlCopyMemory