(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 (使用者模式) |