Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Функция CopyFromUserNonTemporal безопасно копирует данные из памяти пользовательского режима в память ядра с помощью непоральных инструкций.
Syntax
VOID CopyFromUserNonTemporal(
VOID *Destination,
volatile const VOID *Source,
SIZE_T Length
);
Parameters
Destination
[out] Указатель на расположение памяти ядра, в котором будут скопированы данные.
Source
[in] Указатель на расположение памяти в пользовательском режиме, из которого копируются данные.
Length
[in] Количество байтов для копирования.
Возвращаемое значение
None
Remarks
Эта функция обеспечивает безопасный способ копирования данных из памяти пользовательского режима в память ядра с помощью инструкций, отличных от темпоральных (потоковой передачи). Это позволяет выполнять гибкие операции с памятью, когда код в режиме ядра должен извлекать данные из буферов пользовательского режима при оптимизации производительности кэша для передачи больших данных.
Функция имеет следующие свойства:
Функция выполняет переменную копию с помощью 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 |