Freigeben über


RtlCopyDeviceMemory-Funktion (wdm.h)

Die RtlCopyDeviceMemory-Funktion stellt das Verhalten von RtlCopyVolatileMemory bereit (z. B. das Kopieren von Speicher von einem Speicherort an einen anderen ohne Störungen durch Compileroptimierungen), wenn der Entwickler zusätzlich sicherstellen muss, dass beim Zugriff auf den Gerätespeicher keine Ausrichtungsfehler generiert werden.

Syntax

volatile void * RtlCopyDeviceMemory(
  [out] volatile void       *Destination,
  [in]  volatile const void *Source,
  [in]  size_t              Length
);

Parameter

[out] Destination

Ein Zeiger auf die Startadresse des Ziels des kopierten Blocks.

[in] Source

Ein Zeiger auf die Startadresse des zu kopierenden Speicherblocks.

[in] Length

Die Größe des zu kopierenden Speicherblocks in Bytes.

Rückgabewert

Gibt den Wert von Destination zurück.

Hinweise

Die RtlCopyDeviceMemory-Funktion verfügt über die folgenden Eigenschaften:

  • Die Funktion wird nicht als intrinsischer Compiler erkannt, sodass der Compiler den Aufruf niemals wegoptimiert (entweder vollständig, oder ersetzt den Aufruf durch eine entsprechende Sequenz von Anweisungen). Dies unterscheidet sich von RtlCopyMemory , das verschiedenen Compileroptimierungen unterliegt.

  • Wenn der Aufruf zurückgibt, wurden die Daten von Quelle zu Ziel kopiert. Die Speicherzugriffe dieser Funktion auf die Quelle und das Ziel werden nur innerhalb der Funktion ausgeführt (z. B. kann der Compiler Speicherzugriffe nicht aus dieser Funktion verschieben).

  • Die Funktion kann nicht ausgerichtete Speicherzugriffe nur ausführen, wenn die CPU nicht ausgerichtete Speicherzugriffe auf den Gerätespeicher unterstützt. Wenn die CPU nicht ausgerichtete Gerätespeicherzugriffe unterstützt, werden nur ausgerichtete Zugriffe ausgeführt.

  • Die Funktion kann im Rahmen des Kopiervorgangs mehrmals auf Speicherspeicherorte zugreifen.

  • Unterstützt keine Kopiervorgänge, wenn Quelle und Ziel sich überlappen. Wenn überlappende Puffer bereitgestellt werden, schlägt schnell mit dem Fehlercode FAST_FAIL_INVALID_ARG fehl.

Hinweis

Diese Funktion garantiert nur, dass die CPU-Anforderungen für den Zugriff auf den Als Gerätespeicher zugeordneten Arbeitsspeicher eingehalten werden. Wenn ein bestimmtes Gerät eigene spezifische Anforderungen für den Zugriff hat, sollte diese Funktion nicht verwendet werden (und der Entwickler muss stattdessen eigene Accessorfunktionen implementieren). Beispielsweise übernimmt diese Funktion keine Garantie für die Größe der generierten Speicherzugriffe (es sei denn, die CPU erzwingt diese Anforderungen selbst).

Hinweis

Diese Funktion funktioniert für alle Versionen von Windows, nicht nur für die neuesten Versionen. Sie müssen den neuesten WDK nutzen, um die Funktionsdeklaration aus dem wdm.h-Header abzurufen. Sie benötigen auch die Bibliothek (volatileaccessk.lib) aus dem neuesten WDK. Der resultierende Treiber wird jedoch in älteren Versionen von Windows einwandfrei ausgeführt.

Beispiel

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);

Anforderungen

Anforderung Wert
Header wdm.h (einschließen von Wdm.h)
Bibliothek volatileaccessk.lib (Kernelmodus), volatileaccessu.lib (Benutzermodus)

Weitere Informationen

RtlCopyMemory

RtlCopyVolatileMemory