Функция 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 (режим пользователя) |