Макрос CopyFromModeAligned (usermode_accessors.h)

Макрос CopyFromModeAligned безопасно копирует данные из указанного режима памяти в память ядра с проверкой выравнивания.

Syntax

#define CopyFromModeAligned(Destination, Source, Length, Mode, Alignment)                           \
            do {                                                                                    \
                if ((Mode) != KernelMode) {                                                         \
                    ExProbeAlignment((Source), (Length), (Alignment));                              \
                }                                                                                   \
                CopyFromMode((Destination), (Source), (Length), (Mode));                            \
            } while (0)

Parameters

Destination

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

Source

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

Length

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

Mode

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

Value Meaning
KernelMode Источник указывает на память в режиме ядра. Макрос выполняет прямую копию памяти с семантикой memory_order_relaxed.
UserMode Источник указывает на память в пользовательском режиме. Макрос вызывает исключение, если источник не указывает на память в пользовательском режиме; в противном случае он выполняет копию из указанного адреса с семантикой memory_order_relaxed.

Alignment

[in] Граница выравнивания, которая должна соответствовать исходному указателю.

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

None

Remarks

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

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

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

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

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

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

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

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

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

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

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

Requirements

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

См. также

CopyFromMode

CopyFromUser

CopyFromUserAligned

CopyFromModeNonTemporal

CopyToMode