Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
La macro CopyFromModeAligned copia in modo sicuro i dati dalla memoria in modalità specificata alla memoria kernel, con il controllo dell'allineamento.
Syntax
#define CopyFromModeAligned(Destination, Source, Length, Mode, Alignment) \
do { \
if ((Mode) != KernelMode) { \
ExProbeAlignment((Source), (Length), (Alignment)); \
} \
CopyFromMode((Destination), (Source), (Length), (Mode)); \
} while (0)
Parameters
Destination
[out] Puntatore al percorso di memoria del kernel in cui verranno copiati i dati.
Source
[in] Puntatore alla posizione di memoria da cui copiare i dati.
Length
[in] Numero di byte da copiare.
Mode
[in] Modalità processore che determina la modalità di esecuzione dell'accesso alla memoria. La modalità può essere uno dei valori seguenti.
| Value | Meaning |
|---|---|
| KernelMode | L'origine punta alla memoria in modalità kernel. La macro esegue una copia di memoria diretta con memory_order_relaxed semantica. |
| UserMode | L'origine punta alla memoria in modalità utente. La macro genera un'eccezione se Source non punta alla memoria in modalità utente; in caso contrario, esegue una copia dall'indirizzo specificato con memory_order_relaxed semantica. |
Alignment
[in] Limite di allineamento che il puntatore di origine deve soddisfare.
Valore restituito
None
Remarks
Questa macro offre un modo sicuro per copiare i dati dalla memoria kernel o in modalità utente alla memoria kernel, con il meccanismo di copia determinato dalla modalità processore e dalla verifica dell'allineamento specificati. Ciò consente operazioni di memoria flessibili che possono adattarsi a contesti di esecuzione diversi garantendo al tempo stesso requisiti di allineamento appropriati.
Quando la modalità è KernelMode:
La macro esegue una copia volatile utilizzando memory_order_relaxed semantica.
La macro non viene riconosciuta come intrinseco del compilatore, quindi il compilatore non ottimizza mai la chiamata (completamente o sostituisce la chiamata con una sequenza equivalente di istruzioni).
Al termine della chiamata, i dati sono stati copiati da Origine a Destinazione. Gli accessi alla memoria di questa macro all'origine e alla destinazione verranno eseguiti solo all'interno della funzione ( ad esempio, il compilatore non può spostare gli accessi alla memoria da questa funzione).
La macro potrebbe accedere ai percorsi di memoria più volte come parte dell'operazione di copia.
La macro non supporta le operazioni di copia quando l'origine e la destinazione si sovrappongono tra loro.
La macro genera un'eccezione strutturata se l'operazione di copia non riesce, ad esempio quando l'indirizzo di origine non è valido per la modalità specificata, non è allineato correttamente in base al parametro Alignment o non è accessibile.
Se si esegue la copia da una struttura a dimensione fissa, è consigliabile usare ReadStructFromModeAligned per evitare il rischio di passare le dimensioni errate.
Questa macro non verrà mai ottimizzata dal compilatore, né il compilatore creerà accessi aggiuntivi a questo percorso di memoria prima che la macro venga chiamata o dopo la restituzione della macro (a meno che il codice sorgente non esegua in modo esplicito questi accessi).
Questa macro funziona su tutte le versioni di Windows, non solo sulla versione più recente. Per ottenere la dichiarazione di funzione dall'intestazione usermode_accessors.h , è necessario utilizzare la versione più recente di WDK. È necessaria anche la libreria (umaccess.lib) dalla versione più recente di WDK. Tuttavia, il driver risultante verrà eseguito correttamente nelle versioni precedenti di Windows.
Requirements
| Requirement | Value |
|---|---|
| Client minimo supportato | Vedere le osservazioni |
| Header | usermode_accessors.h |
| Library | umaccess.lib |
| IRQL | Minore o uguale a APC_LEVEL |