CopyFromUserToMode 函数 (usermode_accessors.h)

CopyFromUserToMode 函数根据指定的处理器模式安全地将数据从用户模式内存复制到内核或用户模式内存。

Syntax

VOID CopyFromUserToMode(
  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,而不仅仅是最新版本。 需要使用最新的 WDK 从 usermode_accessors.h 标头获取函数声明。 还需要最新的 WDK 中的库(umaccess.lib)。 但是,生成的驱动程序将在较旧版本的 Windows 上运行。

Requirements

Requirement Value
最低支持的客户端 请参阅备注
Header usermode_accessors.h
Library umaccess.lib
IRQL 小于或等于APC_LEVEL

另请参阅

CopyFromUser

CopyFromMode

CopyToUserFromUser