Condividi tramite


Funzione RtlCopyDeviceMemory (wdm.h)

La funzione RtlCopyDeviceMemory fornisce il comportamento RtlCopyVolatileMemory (ad esempio, la copia della memoria da una posizione a un'altra 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 * RtlCopyDeviceMemory(
  [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 RtlCopyDeviceMemory ha le proprietà seguenti:

  • La funzione non viene riconosciuta come intrinseco del compilatore, quindi il compilatore non ottimizza mai la chiamata (interamente o sostituirà la chiamata con una sequenza equivalente di istruzioni). Ciò è diverso da RtlCopyMemory , che è 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 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 di copia.

  • Non supporta le operazioni di copia quando l'origine e la destinazione si sovrappongono tra loro. Se vengono forniti buffer sovrapposti, si verifica un errore rapido con il codice di errore FAST_FAIL_INVALID_ARG.

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

UCHAR* CopyBuffer;

// In this scenario we are copying data from 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 memcpy, RtlCopyMemory,
// and even RtlCopyVolatileMemory may perform unaligned memory accesses
// because it is typically faster to do this.
// To ensure only naturally aligned accesses happen, use RtlCopyDeviceMemory.

RtlCopyDeviceMemory(CopyBuffer, DeviceMemoryBuffer, 100);

Requisiti

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

Vedi anche

RtlCopyMemory

RtlCopyVolatileMemory