RtlCopyDeviceMemory 函数 (wdm.h)

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 不同,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);

要求

要求
Header wdm.h (包括 Wdm.h)
Library volatileaccessk.lib (内核模式) ,volatileaccessu.lib (用户模式)

另请参阅

RtlCopyMemory

RtlCopyVolatileMemory