Freigeben über


RtlFillDeviceMemory-Funktion (wdm.h)

Die RtlFillDeviceMemory-Funktion stellt rtlFillVolatileMemory-Verhalten bereit (z. B. festlegen des Inhalts eines Puffers 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 * RtlFillDeviceMemory(
  [out] volatile void *Destination,
  [in]  size_t        Length,
  [in]  int           Fill
);

Parameter

[out] Destination

Ein Zeiger auf die Startadresse des zu füllenden Speicherblocks.

[in] Length

Die Größe des zu füllenden Speicherblocks in Bytes. Dieser Wert muss kleiner als die Größe des Zielpuffers sein.

[in] Fill

Der Bytewert, mit dem der Speicherblock gefüllt werden soll.

Rückgabewert

Gibt den Wert von Destination zurück.

Hinweise

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

  • Wenn der Aufruf abgeschlossen ist, wurde der Puffer mit dem gewünschten Wert überschrieben. Mit dieser Funktion werden Speicherzugriffe auf das Ziel nur innerhalb der Funktion ausgeführt (z. B. kann der Compiler speicherzugriffe nicht aus dieser Funktion verschieben).

  • Die Funktion kann nur dann nicht ausgerichtete Speicherzugriffe 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 ihres Vorgangs mehrmals auf Speicherspeicherorte zugreifen.

Hinweis

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

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 unter älteren Versionen von Windows einwandfrei ausgeführt.

Beispiel

// In this scenario we are setting data on 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 memset, RtlFillMemory,
// and even RtlFillVolatileMemory may perform unaligned memory accesses
// because it is typically faster to do this.
// To ensure only naturally aligned accesses happen, use RtlFillDeviceMemory.

RtlFillDeviceMemory(DeviceMemoryBuffer, 100, 0xAA);

Anforderungen

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

Weitere Informationen

RtlFillMemory

RtlFillVolatileMemory