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


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

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

RtlFillMemory

RtlFillVolatileMemory