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语义执行易失性副本。
宏无法识别为编译器内部函数,因此编译器永远不会优化调用(完全或用等效指令序列替换调用)。
调用返回时,数据已从 源 复制到 目标。 此宏对 源 和 目标的 内存访问将仅在宏中执行(例如,编译器无法将内存访问移出此宏)。
宏在复制作过程中可能会多次访问内存位置。
当 源 和 目标 相互重叠时,宏不支持复制作。
如果复制作失败(例如源地址不是有效的用户模式地址、未根据 Alignment 参数正确对齐或不可访问),则宏将引发结构化异常。
如果要从固定大小的结构复制,则应改用 ReadStructFromUserAligned ,以避免传递错误大小的风险。
编译器永远不会优化此宏,也不会在调用宏或宏返回之后(除非源代码显式执行这些访问)之前创建对此内存位置的其他访问权限。
此宏适用于所有版本的 Windows,而不仅仅是最新版本。 需要使用最新的 WDK 从 usermode_accessors.h 标头获取宏声明。 还需要最新的 WDK 中的库(umaccess.lib)。 但是,生成的驱动程序将在较旧版本的 Windows 上运行。
Requirements
| Requirement | Value |
|---|---|
| 最低支持的客户端 | 请参阅备注 |
| Header | usermode_accessors.h |
| Library | umaccess.lib |
| IRQL | 小于或等于APC_LEVEL |