Функция CopyToModeNonTemporal (usermode_accessors.h)

Функция CopyToModeNonTemporal безопасно копирует данные из памяти ядра в ядро или в память пользовательского режима, используя непоральные инструкции на основе указанного режима процессора.

Syntax

VOID CopyToModeNonTemporal(
  volatile VOID   *Destination,
  const VOID      *Source,
  SIZE_T          Length,
  KPROCESSOR_MODE Mode
);

Parameters

Destination

[out] Указатель на расположение памяти, в котором будут скопированы данные.

Source

[in] Указатель на расположение памяти ядра, из которого копируются данные.

Length

[in] Количество байтов для копирования.

Mode

[in] Режим процессора, определяющий, как выполняется доступ к памяти. Режим может быть одним из следующих значений.

Value Meaning
KernelMode Назначение указывает на память в режиме ядра. Функция выполняет прямую копию памяти с помощью непорпоральных инструкций с семантикой memory_order_relaxed.
UserMode Назначение указывает на память в пользовательском режиме. Функция вызывает исключение, если назначение не указывает на память в пользовательском режиме; в противном случае он выполняет копию в указанный адрес, используя непорпоральные инструкции с семантикой memory_order_relaxed.

Возвращаемое значение

None

Remarks

Эта функция обеспечивает безопасный способ копирования данных из памяти ядра в ядро или в память пользовательского режима с помощью инструкций, отличных от темпоральных (потоковой передачи), с механизмом копирования, определенным заданным режимом процессора. Это позволяет выполнять гибкие операции памяти, которые могут адаптироваться к разным контекстам выполнения при оптимизации производительности кэша для передачи больших данных.

Если используется режимKernelMode:

  • Функция выполняет переменную копию с помощью memory_order_relaxed семантики с непорпоральными инструкциями.

  • Функция не распознается как встроенный компилятор, поэтому компилятор никогда не оптимизирует вызов (полностью или замените вызов эквивалентной последовательностью инструкций).

  • Когда вызов возвращается, данные копируются из источника в назначение. Доступ к памяти этой функции к источнику и назначению будет выполняться только в функции (например, компилятор не может перемещать доступ к памяти из этой функции).

  • Функция может выполнять неуправляемый доступ к памяти, если платформа позволяет ей.

  • Функция может получить доступ к расположениям памяти более одного раза в рамках операции копирования.

  • Функция не поддерживает операции копирования , когда источник и назначение перекрываются друг с другом.

  • Функция использует непорпоральные инструкции, которые могут повысить производительность для передачи больших данных, обходя кэш процессора, уменьшая загрязнение кэша.

Эта функция особенно полезна при копировании больших объемов данных, к которым вряд ли будет доступ в ближайшее время, так как она избегает вытеснения других полезных данных из кэша.

Если вы копируете структуру фиксированного размера, вместо этого следует использовать WriteStructToMode , чтобы избежать риска передачи неправильного размера.

Эта функция никогда не будет оптимизирована компилятором, и компилятор не создаст дополнительные доступы к этому расположению памяти до вызова функции или после возврата функции (если исходный код явно не выполняет эти доступы).

Эта функция работает во всех версиях Windows, а не только на последних версиях. Чтобы получить объявление функции из заголовка usermode_accessors.h , необходимо использовать последнюю версию WDK. Вам также нужна библиотека (umaccess.lib) из последней версии WDK. Однако результирующий драйвер будет работать в более ранних версиях Windows.

Requirements

Requirement Value
Минимальный поддерживаемый клиент См. примечания
Header usermode_accessors.h
Library umaccess.lib
IRQL Меньше или равно APC_LEVEL

См. также

CopyToMode

CopyToUserNonTemporal

CopyFromModeNonTemporal