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


Функция 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 , для которого применяются различные оптимизации компилятора.

  • Когда вызов возвращается, буфер перезаписывается нужным значением. Эти функции обращаются к памяти к целевому объекту только в пределах функции (например, компилятор не может переместить доступ к памяти из этой функции).

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

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

Примечание

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

Требования

Требование Значение
Заголовок wdm.h (включая Wdm.h)
Библиотека volatileaccessk.lib (режим ядра), volatileaccessu.lib (режим пользователя)

См. также раздел

RtlFillMemory