共用方式為


(wdm.h) RtlCopyDeviceMemory 函式

例如,RtlCopyDeviceMemory 函式會提供 RtlCopyVolatileMemory 行為 (例如,從某個位置將記憶體複製到另一個位置,而不會干擾編譯程式優化) 在開發人員需要另外確定存取裝置記憶體時不會產生對齊錯誤。

語法

volatile void * RtlCopyDeviceMemory(
  [out] volatile void       *Destination,
  [in]  volatile const void *Source,
  [in]  size_t              Length
);

參數

[out] Destination

所複製區塊目的地之起始位址的指標。

[in] Source

要複製之內存區塊起始位址的指標。

[in] Length

要複製的記憶體區塊大小,以位元組為單位。

傳回值

傳回 Destination 的值。

備註

RtlCopyDeviceMemory 函式具有下列屬性:

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

  • 當呼叫傳回時,數據已從來源複製到目的地。 此函式記憶體存取 來源目的地 只會在函式內執行 (例如,編譯程式無法將記憶體存取移出此函式) 。

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

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

  • 當來源目的地彼此重疊時,不支援複製作業。 如果提供了重疊的緩衝區,則快速失敗,並出現錯誤碼FAST_FAIL_INVALID_ARG。

注意

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

注意

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

範例

UCHAR* CopyBuffer;

// In this scenario we are copying data from 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 memcpy, RtlCopyMemory,
// and even RtlCopyVolatileMemory may perform unaligned memory accesses
// because it is typically faster to do this.
// To ensure only naturally aligned accesses happen, use RtlCopyDeviceMemory.

RtlCopyDeviceMemory(CopyBuffer, DeviceMemoryBuffer, 100);

規格需求

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

另請參閱

RtlCopyMemory

RtlCopyVolatileMemory