共用方式為


(wdm.h) RtlFillDeviceMemory 函式

例如,RtlFillDeviceMemory 函式會提供 RtlFillVolatileMemory 行為 (例如,在開發人員需要額外確定存取裝置記憶體時,不會干擾編譯程式優化) 設定緩衝區的內容。

語法

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

參數

[out] Destination

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

[in] Length

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

[in] Fill

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

傳回值

傳回 Destination 的值。

備註

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

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

  • 只有在 CPU 支援裝置記憶體上的未對齊記憶體存取時,函式才能執行未對齊的記憶體存取。 如果 CPU 不支援未對齊的裝置記憶體存取,則只會執行對齊的存取。

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

注意

此函式只會保證會遵守 CPU 存取對應為裝置記憶體的記憶體需求。 如果特定裝置有自己的存取特定需求,則不應該 (使用此函式,而是開發人員必須實作自己的存取子函式) 。 例如,除非 CPU 本身強制執行這些) 需求,否則此函式不保證 (產生的記憶體存取大小。

注意

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

範例

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

規格需求

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

另請參閱

RtlFillMemory

RtlFillVolatileMemory