Freigeben über


RtlFillVolatileMemory-Funktion (wdm.h)

Die RtlFillVolatileMemory-Funktion bietet rtlFillMemory-Verhalten (z. B. festlegen des Inhalts eines Puffers) in Situationen, in denen der Entwickler sicher sein muss, dass der Einstellungsvorgang ausgeführt wird (z. B. keine Compileroptimierungen unterliegt).

Syntax

volatile void * RtlFillVolatileMemory(
  [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 nie wegoptimiert (entweder vollständig oder ersetzt den Aufruf durch eine entsprechende Reihenfolge von Anweisungen). Dies unterscheidet sich von RtlFillMemory , das verschiedenen Compileroptimierungen unterliegt.

  • Wenn der Aufruf zurückgibt, wurde der Puffer mit dem gewünschten Wert überschrieben. Die Speicherzugriffe dieser Funktion auf 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 ausführen, wenn die Plattform dies zulässt.

  • Die Funktion kann im Rahmen ihres Vorgangs mehrmals auf Speicherspeicherorte zugreifen.

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 SensitiveData[100];

// Imagine we temporarily store some sensitive cryptographic
// material in a buffer.

StoreCryptographicKey(&SensitiveData);

DoCryptographicOperation(&SensitiveData);

// Now that we are done using the sensitive data we want to
// erase it from the stack. We cannot call RtlFillMemory because
// if the compiler realizes that "SensitiveData" is not
// referenced again the compiler can remove the call to RtlFillMemory.
// Instead we can call RtlSecureZeroMemory2, RtlZeroVolatileMemory, or RtlFillVolatileMemory
// (the former two are convenience wrappers around the latter). These
// calls will not be optimized away by the compiler.
// Note that RtlSecureZeroMemory2 performs better than
// RtlSecureZeroMemory function.

RtlFillVolatileMemory(&SensitiveData, sizeof(SensitiveData), 0);

Anforderungen

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

Weitere Informationen

RtlFillMemory