Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
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 (режим пользователя) |