共用方式為


RtlFillVolatileMemory 函式 (wdm.h)

例如,RtlFillVolatileMemory 函式會提供 RtlFillMemory 行為 (,例如) ,在開發人員需要確定設定作業 (發生的情況下,不會受限於編譯程式優化) 。

語法

volatile void * RtlFillVolatileMemory(
  [out] volatile void *Destination,
  [in]  size_t        Length,
  [in]  int           Fill
);

參數

[out] Destination

要填滿之內存區塊起始位址的指標。

[in] Length

要填入的記憶體區塊大小,以位元組為單位。 此值必須小於 目的地 緩衝區的大小。

[in] Fill

要填入記憶體區塊的位元組值。

傳回值

傳回 Destination 的值。

備註

  • 函式無法辨識為編譯程式內部函數,因此編譯程式永遠不會完全將呼叫優化 (,或以對等的指令序列取代呼叫) 。 這與 RtlFillMemory 不同,這受限於各種編譯程序優化。

  • 當呼叫傳回時,緩衝區已被所需的值覆寫。 此函式記憶體存取 目的地 只會在函式內執行 (例如,編譯程式無法將記憶體存取移出此函式) 。

  • 如果平台允許,函式可能會執行未對齊的記憶體存取。

  • 函式可能會在其作業中多次存取記憶體位置。

注意

此函式適用於所有版本的 Windows,而不只是最新的。 您需要取用最新的 WDK,才能從 wdm.h 標頭取得函式宣告。 您也需要來自最新 WDK 的連結庫 (volatileaccessk.lib) 。 不過,產生的驅動程式會在舊版 Windows 上正常執行。

範例

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

規格需求

需求
標頭 wdm.h (包含 Wdm.h)
程式庫 volatileaccessk.lib (核心模式) 、volatileaccessu.lib (使用者模式)

另請參閱

RtlFillMemory