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


Функция FillVolatileMemory

Функция FillVolatileMemory заполняет блок памяти указанным значением заливки.

Важно!

Некоторые сведения относятся к предварительному продукту, который может быть существенно изменен до его коммерческого выпуска. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.

Параметры

Назначение Param [out]

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

Длина param [in]

Размер блока памяти для заполнения в байтах. Это значение должно быть меньше размера буфера назначения .

Param Fill [in]

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

Синтаксис

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

Замечания

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

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

Примечание.

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

Requirements

Минимальный поддерживаемый клиент: сборка предварительной версии Windows 11 Insider Preview ТБ D

Заголовок: winbase.h (включая Winbase.h)

Библиотека режима ядра: volatileaccessk.lib

Библиотека пользовательского режима: volatileaccessu.lib

См. также