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