Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Макрос CopyFromUserAligned безопасно копирует данные из памяти пользовательского режима в память ядра с проверкой выравнивания.
Syntax
#define CopyFromUserAligned(Destination, Source, Length, Alignment) \
do { \
ExProbeAlignment((Source), (Length), (Alignment)); \
CopyFromUser((Destination), (Source), (Length)); \
} while (0)
Parameters
Destination
[out] Указатель на расположение памяти ядра, в котором будут скопированы данные.
Source
[in] Указатель на расположение памяти в пользовательском режиме, из которого копируются данные.
Length
[in] Количество байтов для копирования.
Alignment
[in] Граница выравнивания, которая должна соответствовать исходному указателю.
Возвращаемое значение
None
Remarks
Этот макрос обеспечивает безопасный способ копирования данных из памяти пользовательского режима в память ядра с проверкой выравнивания. Это позволяет выполнять гибкие операции с памятью, когда код в режиме ядра должен извлекать данные из буферов пользовательского режима с определенными требованиями к выравниванию.
Макрос имеет следующие свойства:
Макрос выполняет переменную копию с помощью семантики memory_order_relaxed.
Макрос не распознается как встроенный компилятор, поэтому компилятор никогда не оптимизирует вызов (полностью или замените вызов эквивалентной последовательностью инструкций).
Когда вызов возвращается, данные копируются из источника в назначение. Доступ к памяти этого макроса к источнику и назначению будет выполняться только в макросе (например, компилятор не может перемещать доступ к памяти из этого макроса).
Макрос может получить доступ к расположениям памяти более одного раза в рамках операции копирования.
Макрос не поддерживает операции копирования , когда источник и назначение перекрываются друг с другом.
Макрос вызывает структурированное исключение, если операция копирования завершается ошибкой, например если исходный адрес не является допустимым адресом пользовательского режима, неправильно выровнен в соответствии с параметром Выравнивания или недоступен.
При копировании из структуры фиксированного размера следует использовать ReadStructFromUserAligned , чтобы избежать риска передачи неправильного размера.
Этот макрос никогда не будет оптимизирован компилятором, и компилятор не создаст дополнительные доступы к этому расположению памяти до вызова макроса или после возврата макроса (если исходный код явно не выполняет эти доступы).
Этот макрос работает во всех версиях Windows, а не только на последних версиях. Чтобы получить объявление макроса из заголовка usermode_accessors.h , необходимо использовать последнюю версию WDK. Вам также нужна библиотека (umaccess.lib) из последней версии WDK. Однако результирующий драйвер будет работать в более ранних версиях Windows.
Requirements
| Requirement | Value |
|---|---|
| Минимальный поддерживаемый клиент | См. примечания |
| Header | usermode_accessors.h |
| Library | umaccess.lib |
| IRQL | Меньше или равно APC_LEVEL |