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.
Die CopyFromUserNonTemporal-Funktion kopiert Daten sicher aus dem Benutzermodusspeicher mithilfe von nicht zeitlichen Anweisungen in den Kernelspeicher.
Syntax
VOID CopyFromUserNonTemporal(
VOID *Destination,
volatile const VOID *Source,
SIZE_T Length
);
Parameters
Destination
[out] Ein Zeiger auf den Kernelspeicherort, an dem die Daten kopiert werden.
Source
[in] Ein Zeiger auf den Speicherspeicherort des Benutzermodus, von dem die Daten kopiert werden sollen.
Length
[in] Die Anzahl der zu kopierenden Bytes.
Rückgabewert
None
Remarks
Diese Funktion bietet eine sichere Möglichkeit, Daten aus dem Arbeitsspeicher des Benutzermodus mithilfe von nicht zeitlichen Anweisungen (Streaming) in den Kernelspeicher zu kopieren. Dies ermöglicht flexible Speichervorgänge, wenn Kernelmoduscode Daten aus Benutzermoduspuffern abrufen muss, während die Cacheleistung für große Datenübertragungen optimiert wird.
Die Funktion weist die folgenden Eigenschaften auf:
Die Funktion führt eine veränderliche Kopie mit memory_order_relaxed Semantik mit nicht zeitlichen Anweisungen aus.
Die Funktion wird nicht als compilerintern erkannt, sodass der Compiler den Aufruf nie 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 dieser Funktion auf die Quelle und das Ziel wird nur innerhalb der Funktion ausgeführt (z. B. kann der Compiler speicherzugriffe nicht aus dieser Funktion verschieben).
Die Funktion kann nicht ausgerichtete Speicherzugriffe ausführen, wenn die Plattform dies zulässt.
Die Funktion kann mehr als einmal im Rahmen des Kopiervorgangs auf Speicherspeicherorte zugreifen.
Die Funktion unterstützt kopiervorgänge nicht, wenn Quelle und Ziel sich gegenseitig überlappen.
Die Funktion verwendet nicht zeitliche Anweisungen, die die Leistung für große Datenübertragungen verbessern können, indem der Prozessorcache umgangen wird, wodurch die Cacheverschmutzung reduziert wird.
Die Funktion löst eine strukturierte Ausnahme aus, wenn der Kopiervorgang fehlschlägt, z. B. wenn die Quelladresse keine gültige Benutzermodusadresse ist oder nicht auf sie zugegriffen werden kann.
Diese Funktion ist besonders nützlich, wenn große Datenmengen kopiert werden, auf die in Kürze nicht mehr zugegriffen werden kann, da dadurch keine weiteren nützlichen Daten aus dem Cache entfernt werden.
Wenn Sie aus einer Struktur mit fester Größe kopieren, sollten Sie stattdessen ReadStructFromUser verwenden, um das Risiko zu vermeiden, dass die falsche Größe übergeben wird.
Diese Funktion wird niemals vom Compiler optimiert, oder der Compiler erstellt zusätzlichen Zugriff auf diesen Speicherspeicherort, bevor die Funktion aufgerufen wird oder nachdem die Funktion zurückgegeben wird (es sei denn, der Quellcode führt diese Zugriffe explizit aus).
Diese Funktion 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 |