FillVolatileMemory 函数

FillVolatileMemory 函数使用指定的填充值填充内存块

重要

一些信息与预发布产品相关,在商业发行之前可能会发生实质性修改。 Microsoft 对此处提供的信息不提供任何明示或暗示的保证。

参数

参数 Destination [输出]

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

参数 Length [输入]

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

参数 Fill [输入]

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

语法

volatile void*
  FillVolatileMemory (
    _Out_writes_bytes_all_(Length) volatile void* Destination,
    SIZE_T Length,
    INT Fill
  );

备注

此 API 在开发人员需要确保设置操作发生(即不受编译器优化约束)时,用于提供 FillMemory 行为(即设置缓冲区的内容)。 此 API 具有以下属性:

  • API 不会被识别为编译器内部函数,因此编译器永远不会优化调用(完全去除或用“等效”指令序列替换调用)。 这不同于 FillMemory,后者受多项编译器优化的影响。
  • 调用返回时,缓冲区已被所需值覆盖。 此函数内存对目标的访问只在函数中执行(即编译器无法在此函数外访问内存)
  • 如果平台允许,API 可能会执行不一致的内存访问。
  • API 在操作期间可以多次访问内存位置。

注意

此函数适用于所有版本的 Windows,而不仅仅是最新版本。 需要使用最新的 SDK 从 winbase.h 标头获取函数声明。 还需要最新 SDK 中的库 (volatileaccessu.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 FillMemory because
// if the compiler realizes that "SensitiveData" is not
// referenced again the compiler can remove the call to FillMemory.
// Instead we can call SecureZeroMemory2, ZeroVolatileMemory, or FillVolatileMemory
// (the former two are convenience wrappers around the latter). These
// calls will not be optimized away by the compiler.
// Note that SecureZeroMemory2 performs better than the old
// SecureZeroMemory API.

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

要求

支持的最低客户端:Windows 11 Insider 预览版(待定)

标头:winbase.h(包括 Winbase.h)

Kernel-mode 库:volatileaccessk.lib

User-mode 库:volatileaccessu.lib

另请参阅