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

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

Syntax

VOID CopyFromUserToMode(
  volatile VOID       *Destination,
  volatile 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.

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

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

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

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

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

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

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

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

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

Requirements

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

См. также

CopyFromUser

CopyFromMode

CopyToUserFromUser