Freigeben über


FillVolatileMemory-Funktion

Die FillVolatileMemory-Funktion füllt einen Speicherblock mit dem angegebenen Füllwert.

Wichtig

Einige Informationen beziehen sich auf Vorabversionen, die vor der kommerziellen Freigabe grundlegend geändert werden können. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.

Parameter

Param Destination [out]

Ein Verweis auf die Startadresse des Speicherblocks, der gefüllt werden soll

Param Length [in]

Die Bytegröße des Speicherblocks, der gefüllt werden soll. Dieser Wert muss kleiner als die Größe des Destination-Puffers sein.

Param Fill [in]

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

Syntax

volatile void*
  FillVolatileMemory (
    _Out_writes_bytes_all_(Length) volatile void* Destination,
    SIZE_T Length,
    INT Fill
  );

Hinweise

Diese API ist vorhanden, um das FillMemory-Verhalten bereitzustellen, bei dem der Inhalt eines Puffers festgelegt wird. Dieses Verhalten wird in Situationen bereitgestellt, in denen Entwickler*innen sicherstellen müssen, dass der Festlegungsvorgang durchgeführt wird und keinen Compileroptimierungen unterliegt. Die API verfügt über die folgenden Eigenschaften:

  • Die API wird nicht als systeminterner Compiler erkannt, wodurch der Aufruf niemals durch Optimierungen des Compilers entfernt wird, die den Aufruf vollständig entfernen oder mit einer „equivalent“-Anweisungssequenz ersetzen würden. Das unterscheidet sich vom FillMemory-Verhalten, das einer Vielzahl von Compileroptimierungen unterliegt.
  • Wenn der Aufruf zurückgegeben wird, wurde der Puffer mit dem gewünschten Wert überschrieben. Dieser Zugriff des Funktionsarbeitsspeichers auf den Destination-Puffer wird ausschließlich innerhalb der Funktion ausgeführt, wobei der Compiler den Arbeitsspeicherzugriff nicht aus dieser Funktion verschieben kann.
  • Die API kann möglicherweise nicht ausgerichtete Zugriffe auf den Arbeitsspeicher ausführen, sofern die Plattform das zulässt.
  • Die API greift als Teil ihrer Ausführung möglicherweise mehr als einmal auf Speicherorte im Arbeitsspeicher zu.

Hinweis

Diese Funktion funktioniert nicht nur auf der neuesten Windows-Version, sondern auf allen Versionen. Sie müssen das neueste SDK verwenden, um die Funktionsdeklaration aus dem winbase.h-Header abzurufen. Außerdem benötigen Sie die Bibliothek (volatileaccessu.lib) aus dem neuesten SDK. Die resultierende Binärdatei wird jedoch in älteren Versionen von Windows problemlos 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 FillMemory because
// if the compiler realizes that "SensitiveData" is not
// referenced again the compiler can remove the call to FillMemory.
// Instead we can call SecureZeroMemory2, ZeroVolatileMemory, or FillVolatileMemory
// (the former two are convenience wrappers around the latter). These
// calls will not be optimized away by the compiler.
// Note that SecureZeroMemory2 performs better than the old
// SecureZeroMemory API.

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

Anforderungen

Unterstützte Mindestversion (Client): Windows 11 Insider-Vorabversion TBD

Header: winbase.h (Winbase.h eingeschlossen)

Kernelmodusbibliothek: volatileaccessk.lib

Benutzermodusbibliothek: volatileaccessu.lib

Siehe auch