MmCopyMemory 函数 (ntddk.h)

MmCopyMemory 例程将指定的虚拟内存或物理内存范围复制到调用方提供的缓冲区中。

语法

NTSTATUS MmCopyMemory(
  [in]  PVOID           TargetAddress,
  [in]  MM_COPY_ADDRESS SourceAddress,
  [in]  SIZE_T          NumberOfBytes,
  [in]  ULONG           Flags,
  [out] PSIZE_T         NumberOfBytesTransferred
);

参数

[in] TargetAddress

指向调用方提供的缓冲区的指针。 此缓冲区必须位于不可分页内存中。

[in] SourceAddress

由 值传递 的MM_COPY_ADDRESS 结构,包含要复制到 TargetAddress 指向的缓冲区的数据的虚拟地址或物理地址。

[in] NumberOfBytes

要从 SourceAddress 复制到 TargetAddress 的字节数。

[in] Flags

指示 SourceAddress 是虚拟地址还是物理地址的标志。 为此参数定义了以下标志位。

标记位 说明
MM_COPY_MEMORY_PHYSICAL SourceAddress 指定物理地址。
MM_COPY_MEMORY_VIRTUAL SourceAddress 指定虚拟地址。

这两个标志位是互斥的。 调用方必须设置一个或另一个,但不能同时设置两者。

[out] NumberOfBytesTransferred

指向某个位置的指针,例程将成功从 SourceAddress 位置复制到 TargetAddress 缓冲区的字节数写入该位置。

返回值

如果已成功复制整个范围,MmCopyMemory 将返回STATUS_SUCCESS。 否则,将返回错误状态,调用方必须检查 NumberOfBytesTransferred 参数指向的输出值,以确定实际复制的字节数。

注解

内核模式驱动程序可以调用此例程,以安全地访问任意物理或虚拟地址。

如果设置了MM_COPY_MEMORY_PHYSICAL标志, SourceAddress 应指向受操作系统控制的常规内存。 MmCopyMemory 将为引用 I/O 空间(包括内存映射设备和固件表)的物理地址返回错误状态代码。 若要访问 I/O 空间中的物理内存,驱动程序可以使用 MmMapIoSpace 例程。

如果设置了MM_COPY_MEMORY_VIRTUAL标志, SourceAddress 可以指向系统地址空间中的缓冲区,也可以指向当前进程的用户地址空间中的缓冲区。 如果调用方不控制包含指定源地址的分配的生存期,则 MmCopyMemory 可能会失败或返回不一致的数据,但不会导致系统崩溃,即使对于无效的系统地址,并且如果直接引用,则会触发 bug 检查。 MmCopyMemory 将为引用 I/O 空间的系统虚拟地址返回错误状态代码。

如果 SourceAddress 指定的虚拟地址上的内存不是驻留的, 则 MmCopyMemory 将尝试使其驻留。

要求

要求
最低受支持的客户端 从Windows 8.1开始可用。
目标平台 通用
标头 ntddk.h
Library Ntoskrnl.lib
IRQL <= APC_LEVEL

另请参阅

MM_COPY_ADDRESS

MmMapIoSpace