Поделиться через


Функция RtlSetVolatileMemory (wdm.h)

The RtlSetVolatileMemory function provides RtlFillMemory behavior (for example, setting the contents of a buffer) in situations where the developer needs to be sure that the setting operation occurs (for example, isn't subject to compiler optimizations). Функция возвращает указатель на заполненную память.

Syntax

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

Parameters

[out] Destination

Указатель на начальный адрес блока памяти для заполнения.

[in] Fill

Значение байта, с помощью которого заполняется блок памяти.

[in] Length

Размер блока памяти для заполнения в байтах. This value must be less than the size of the Destination buffer.

Return value

Returns a pointer to the filled memory block (Destination).

Remarks

  • Функция не распознается как встроенный компилятор, поэтому компилятор никогда не оптимизирует вызов (полностью или замените вызов эквивалентной последовательностью инструкций). This differs from RtlFillMemory which is subject to various compiler optimizations.

  • При возврате вызова буфер перезаписан с требуемым значением. This function's memory accesses to the Destination will only be performed within the function (for example, the compiler can't move memory accesses out of this function).

  • Функция может выполнять неуправляемый доступ к памяти, если платформа позволяет ей.

  • Функция может получить доступ к расположениям памяти более одного раза в рамках своей операции.

Эта функция работает во всех версиях Windows, а не только на последних версиях. Чтобы получить объявление функции из заголовка wdm.h, необходимо использовать последнюю версию WDK. Вам также нужна библиотека (volatileaccessk.lib) из последней версии WDK. Однако результирующий драйвер будет работать в более ранних версиях Windows.

Example

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 can use RtlSetVolatileMemory
// to fill the buffer and get a pointer to the filled memory.
// This call will not be optimized away by the compiler.

volatile VOID* clearedBuffer = RtlSetVolatileMemory(&SensitiveData, 0, sizeof(SensitiveData));

Requirements

Requirement Value
Минимальный поддерживаемый клиент See Remarks
Header wdm.h (include Wdm.h)
Library volatileaccessk.lib (режим ядра), volatileaccessu.lib (режим пользователя)

See also

RtlFillMemory

RtlFillVolatileMemory