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 |
库 | Ntoskrnl.lib |
IRQL | <= APC_LEVEL |