Funzione RtlFillDeviceMemory (wdm.h)
La funzione RtlFillDeviceMemory fornisce il comportamento RtlFillVolatileMemory (ad esempio, impostando il contenuto di un buffer senza interferenze dalle ottimizzazioni del compilatore) in situazioni in cui lo sviluppatore deve anche assicurarsi che gli errori di allineamento non vengano generati durante l'accesso alla memoria del dispositivo.
Sintassi
volatile void * RtlFillDeviceMemory(
[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 in memoria non allineati solo se la CPU supporta gli accessi alla memoria non ottimizzata nella memoria del dispositivo. Se la CPU non supporta gli accessi non allineati alla memoria del dispositivo, verranno eseguiti solo gli accessi allineati.
La funzione può accedere più volte ai percorsi di memoria come parte dell'operazione.
Nota
Questa funzione garantisce solo che i requisiti della CPU per l'accesso alla memoria mappata come memoria del dispositivo siano rispettati. Se un dispositivo specifico ha requisiti specifici per l'accesso, questa funzione non deve essere usata e, invece, lo sviluppatore deve implementare le proprie funzioni di accesso. Ad esempio, questa funzione non garantisce le dimensioni degli accessi alla memoria generati (a meno che la CPU non applichi questi requisiti).
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
// In this scenario we are setting data on memory mapped
// as "device memory" (for example, memory not backed by RAM).
// On some platforms like ARM64, device memory cannot tolerate
// memory accesses that are not naturally aligned (for example, a 4-byte
// load must be 4-byte aligned). Functions like memset, RtlFillMemory,
// and even RtlFillVolatileMemory may perform unaligned memory accesses
// because it is typically faster to do this.
// To ensure only naturally aligned accesses happen, use RtlFillDeviceMemory.
RtlFillDeviceMemory(DeviceMemoryBuffer, 100, 0xAA);
Requisiti
Requisito | Valore |
---|---|
Intestazione | wdm.h (include Wdm.h) |
Libreria | volatileaccessk.lib (modalità kernel), volatileaccessu.lib (modalità utente) |