RtlFillVolatileMemory 函数 (wdm.h)

例如,RtlFillVolatileMemory 函数提供 RtlFillMemory 行为 (,例如,在开发人员需要确保设置操作) (发生的情况下设置缓冲区的内容不受编译器优化) 。

语法

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

参数

[out] Destination

指向要填充的内存块的起始地址的指针。

[in] Length

要填充的内存块的大小(以字节为单位)。 此值必须小于 目标 缓冲区的大小。

[in] Fill

用于填充内存块的字节值。

返回值

返回 Destination 的值。

注解

  • 函数未被识别为编译器内部函数,因此编译器永远不会完全优化调用 (,也不会将调用替换为) 的等效指令序列。 这与 RtlFillMemory 不同,RtlFillMemory 受各种编译器优化的约束。

  • 调用返回时,缓冲区已被所需值覆盖。 此函数对 Destination 的内存访问只会在函数 (例如,编译器无法将内存访问移出此函数) 。

  • 如果平台允许,函数可能会执行未对齐的内存访问。

  • 函数可以在其操作过程中多次访问内存位置。

注意

此函数适用于所有版本的 Windows,而不仅仅是最新版本。 需要使用最新的 WDK 才能从 wdm.h 标头获取函数声明。 还需要从最新 WDK (volatileaccessk.lib) 库。 但是,生成的驱动程序将在较旧版本的 Windows 上运行正常。

示例

UCHAR SensitiveData[100];

// Imagine we temporarily store some sensitive cryptographic
// material in a buffer.

StoreCryptographicKey(&SensitiveData);

DoCryptographicOperation(&SensitiveData);

// Now that we are done using the sensitive data we want to
// erase it from the stack. We cannot call RtlFillMemory because
// if the compiler realizes that "SensitiveData" is not
// referenced again the compiler can remove the call to RtlFillMemory.
// Instead we can call RtlSecureZeroMemory2, RtlZeroVolatileMemory, or RtlFillVolatileMemory
// (the former two are convenience wrappers around the latter). These
// calls will not be optimized away by the compiler.
// Note that RtlSecureZeroMemory2 performs better than
// RtlSecureZeroMemory function.

RtlFillVolatileMemory(&SensitiveData, sizeof(SensitiveData), 0);

要求

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

另请参阅

RtlFillMemory