Функция RtlCopyDeviceMemory (wdm.h)
Функция RtlCopyDeviceMemory обеспечивает поведение RtlCopyVolatileMemory (например, копирование памяти из одного расположения в другое без вмешательства оптимизации компилятора) в ситуациях, когда разработчику необходимо дополнительно убедиться, что ошибки выравнивания не будут создаваться при доступе к памяти устройства.
Синтаксис
volatile void * RtlCopyDeviceMemory(
[out] volatile void *Destination,
[in] volatile const void *Source,
[in] size_t Length
);
Параметры
[out] Destination
Указатель на начальный адрес назначения скопированного блока.
[in] Source
Указатель на начальный адрес копируемого блока памяти.
[in] Length
Размер копируемого блока памяти в байтах.
Возвращаемое значение
Возвращает значение Destination.
Комментарии
Функция RtlCopyDeviceMemory имеет следующие свойства:
Функция не распознается как встроенная функция компилятора, поэтому компилятор никогда не будет оптимизировать вызов (полностью или заменить вызов эквивалентной последовательностью инструкций). Это отличается от RtlCopyMemory , для которого применяются различные оптимизации компилятора.
Когда вызов возвращается, данные копируются из источника в назначение. Эти функции обращаются к памяти к источнику и назначению только в пределах функции (например, компилятор не может переместить доступ к памяти из этой функции).
Функция может выполнять незаровненный доступ к памяти только в том случае, если ЦП поддерживает доступ к памяти устройства без привязки к памяти. Если ЦП не поддерживает незаровненный доступ к памяти устройства, будут выполняться только выровненные доступы.
Функция может обращаться к расположениям в памяти несколько раз в рамках операции копирования.
Не поддерживает операции копирования, если источник и назначение перекрывают друг друга. Если предоставляются перекрывающиеся буферы, быстрый сбой с кодом ошибки FAST_FAIL_INVALID_ARG.
Примечание
Эта функция гарантирует только соблюдение требований ЦП для доступа к памяти, сопоставленной как память устройства. Если к определенному устройству предъявляются собственные требования к доступу, эту функцию не следует использовать (и вместо этого разработчик должен реализовать собственные функции доступа). Например, эта функция не дает никаких гарантий относительно размера созданных операций доступа к памяти (если только сам ЦП не применяет эти требования).
Примечание
Эта функция работает во всех версиях Windows, а не только в последней версии. Чтобы получить объявление функции из заголовка wdm.h, необходимо использовать последнюю версию WDK. Вам также потребуется библиотека (volatileaccessk.lib) из последней версии WDK. Однако полученный драйвер будет работать нормально в более старых версиях Windows.
Пример
UCHAR* CopyBuffer;
// In this scenario we are copying data from 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 memcpy, RtlCopyMemory,
// and even RtlCopyVolatileMemory may perform unaligned memory accesses
// because it is typically faster to do this.
// To ensure only naturally aligned accesses happen, use RtlCopyDeviceMemory.
RtlCopyDeviceMemory(CopyBuffer, DeviceMemoryBuffer, 100);
Требования
Требование | Значение |
---|---|
Заголовок | wdm.h (включая Wdm.h) |
Библиотека | volatileaccessk.lib (режим ядра), volatileaccessu.lib (режим пользователя) |