Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Das Makro "CopyFromModeAligned " kopiert Daten sicher aus dem Speicher des angegebenen Modus in den Kernelspeicher, wobei die Ausrichtung überprüft wird.
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] Ein Zeiger auf den Kernelspeicherort, an dem die Daten kopiert werden.
Source
[in] Ein Zeiger auf den Speicherort, von dem die Daten kopiert werden sollen.
Length
[in] Die Anzahl der zu kopierenden Bytes.
Mode
[in] Der Prozessormodus, der bestimmt, wie der Speicherzugriff ausgeführt wird. Der Modus kann einen der folgenden Werte aufweisen.
| Value | Meaning |
|---|---|
| KernelMode | Die Quelle verweist auf den Kernelmodusspeicher. Das Makro führt eine direkte Speicherkopie mit memory_order_relaxed Semantik aus. |
| UserMode | Die Quelle verweist auf den Arbeitsspeicher im Benutzermodus. Das Makro löst eine Ausnahme aus, wenn Die Quelle nicht auf den Arbeitsspeicher des Benutzermodus verweist. andernfalls wird eine Kopie aus der angegebenen Adresse mit memory_order_relaxed Semantik ausgeführt. |
Alignment
[in] Die Ausrichtungsgrenze, die der Quellzeiger erfüllen muss.
Rückgabewert
None
Remarks
Dieses Makro bietet eine sichere Möglichkeit, Daten vom Kernel- oder Benutzermodusspeicher in den Kernelspeicher zu kopieren, wobei der Kopiermechanismus durch den angegebenen Prozessormodus und die Überprüfung der Ausrichtung bestimmt wird. Dies ermöglicht flexible Speichervorgänge, die sich an verschiedene Ausführungskontexte anpassen und gleichzeitig die richtigen Ausrichtungsanforderungen sicherstellen können.
Wenn der ModusKernelMode ist:
Das Makro führt eine veränderliche Kopie mit memory_order_relaxed Semantik aus.
Das Makro wird nicht als systeminterner Compiler erkannt, sodass der Compiler den Aufruf niemals entfernt (entweder vollständig oder durch eine entsprechende Abfolge von Anweisungen ersetzen).
Wenn der Aufruf zurückgegeben wird, wurden die Daten aus Der Quelle in das Ziel kopiert. Der Speicherzugriff dieses Makros auf die Quelle und das Ziel wird nur innerhalb der Funktion ausgeführt (z. B. kann der Compiler keine Speicherzugriffe aus dieser Funktion verschieben).
Das Makro kann mehr als einmal im Rahmen des Kopiervorgangs auf Speicherspeicherorte zugreifen.
Das Makro unterstützt keine Kopiervorgänge, wenn quelle und Ziel sich gegenseitig überlappen.
Das Makro löst eine strukturierte Ausnahme aus, wenn der Kopiervorgang fehlschlägt, z. B. wenn die Quelladresse für den angegebenen Modus nicht gültig ist, nicht ordnungsgemäß entsprechend dem Ausrichtungsparameter ausgerichtet ist oder nicht darauf zugegriffen werden kann.
Wenn Sie aus einer Struktur mit fester Größe kopieren, sollten Sie stattdessen ReadStructFromModeAligned verwenden, um das Risiko zu vermeiden, die falsche Größe zu übergeben.
Dieses Makro wird niemals vom Compiler optimiert, oder der Compiler erstellt zusätzlichen Zugriff auf diesen Speicherspeicherort, bevor das Makro aufgerufen wird oder nachdem das Makro zurückgegeben wird (es sei denn, der Quellcode führt diese Zugriffe explizit aus).
Dieses Makro funktioniert auf allen Versionen von Windows, nicht nur auf dem neuesten. Sie müssen den neuesten WDK verwenden, um die Funktionsdeklaration aus dem Header usermode_accessors.h abzurufen. Außerdem benötigen Sie die Bibliothek (umaccess.lib) aus dem neuesten WDK. Der resultierende Treiber wird jedoch in älteren Versionen von Windows einwandfrei ausgeführt.
Requirements
| Requirement | Value |
|---|---|
| Mindestens unterstützter Client | Siehe Hinweise |
| Header | usermode_accessors.h |
| Library | umaccess.lib |
| IRQL | Kleiner oder gleich APC_LEVEL |