Функция RtlFillDeviceMemory (wdm.h)
Функция RtlFillDeviceMemory обеспечивает поведение RtlFillVolatileMemory (например, задание содержимого буфера без вмешательства оптимизации компилятора) в ситуациях, когда разработчику необходимо дополнительно убедиться, что ошибки выравнивания не будут создаваться при доступе к памяти устройства.
Синтаксис
volatile void * RtlFillDeviceMemory(
[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.
Пример
// In this scenario we are setting data on memory mapped
// as "device memory" (for example, memory not backed by RAM).
// On some platforms like ARM64, device memory cannot tolerate
// memory accesses that are not naturally aligned (for example, a 4-byte
// load must be 4-byte aligned). Functions like memset, RtlFillMemory,
// and even RtlFillVolatileMemory may perform unaligned memory accesses
// because it is typically faster to do this.
// To ensure only naturally aligned accesses happen, use RtlFillDeviceMemory.
RtlFillDeviceMemory(DeviceMemoryBuffer, 100, 0xAA);
Требования
Требование | Значение |
---|---|
Заголовок | wdm.h (включая Wdm.h) |
Библиотека | volatileaccessk.lib (режим ядра), volatileaccessu.lib (пользовательский режим) |