RtlFillDeviceMemory 函数 (wdm.h)
RtlFillDeviceMemory 函数提供 RtlFillVolatileMemory 行为 (例如,在开发人员需要额外确保访问设备内存时不会生成对齐错误的情况下,设置缓冲区的内容不受编译器优化) 的影响。
语法
volatile void * RtlFillDeviceMemory(
[out] volatile void *Destination,
[in] size_t Length,
[in] int Fill
);
参数
[out] Destination
指向要填充的内存块的起始地址的指针。
[in] Length
要填充的内存块的大小(以字节为单位)。 此值必须小于 目标 缓冲区的大小。
[in] Fill
用于填充内存块的字节值。
返回值
返回 Destination 的值。
注解
函数未被识别为编译器内部函数,因此编译器永远不会完全优化调用 (,也不会将调用替换为) 的等效指令序列。 这与 RtlFillMemory 不同,RtlFillMemory 受各种编译器优化的约束。
调用完成后,缓冲区已被所需值覆盖。 此函数对 Destination 的内存访问只会在函数 (例如,编译器无法将内存访问移出此函数) 。
仅当 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);
要求
要求 | 值 |
---|---|
Header | wdm.h (包括 Wdm.h) |
Library | volatileaccessk.lib (内核模式) ,volatileaccessu.lib (用户模式) |