【问题标题】:Sharing unnamed memory on Windows在 Windows 上共享未命名内存
【发布时间】:2015-11-17 08:37:21
【问题描述】:

在 Windows 上,如何在进程之间共享已分配的未命名内存?

上下文:

我想从两个不同的进程访问相同的物理内存,而其中一个进程“不知道”它。基本上,我想从进程 B 中读取进程 A 的内存。

我想过 ReadProcessMemory() 但是,根据我的理解(我可能错了,如果我错了,请告诉我),ReadProcessMemory 实际上将内存从一个物理地址复制到另一个,然后将复制映射到进程 B 的虚拟内存(或者把它放在已经映射的区域,没关系)。

我希望能够从两个进程映射相同的物理区域。我考虑过 CreateFileMapping()/MapViewOfFile(),但是(再次,据我了解)您需要明确命名要映射的区域。我没有进程 A 的内存的名称,我只知道进程 A 的该内存的虚拟地址(来自 VirtualQueryEx() )。在我看来,我相信这应该足以完成工作,但我还没有找到方法。有什么建议吗?

编辑:我应该明确表示我不想分享一个单词或一些小东西,而是一组虚拟页面,所以偏移量和类似物不是问题。

【问题讨论】:

  • 这在最新版本的 Windows 10 中现在可以通过使用 MEM_RESERVE_PLACEHOLDER 标志调用 VirtualAlloc2 来实现。然后使用MEM_REPLACE_PLACEHOLDER 调用MapViewOfFile3。但是,示例代码很简单。

标签: windows winapi memory


【解决方案1】:

共享内存(命名或未命名)必须通过 CreateFileMapping() 创建,然后通过 MapViewOfFile() 访问。结构通常用于定义偏移量和类型。我不知道如何共享进程的正常内存。

ReadProcessMemory() 和 WriteProcessMemory() 是类似于调试器的函数,可以从另一个进程读取/写入内存。

【讨论】:

  • ReadProcessMemory 让我担心的是可能的开销。它是否真的像 memcpy() 调用那样复制指定的内存,或者操作系统做了一些隐藏的优化,理想情况下类似于 UNIX fork 上的写时复制会做的事情? (我可以在不复制的情况下读取其他进程的内存,但是如果我弄乱了缓冲区,它实际上会被复制吗?)
  • @Shinatose - 它复制内存。似乎 Windows 没有办法为进程的主内存创建共享映射。必须使用 CreateFileMapping() 分配共享内存。
猜你喜欢
  • 1970-01-01
  • 2018-11-24
  • 2020-07-08
  • 2016-10-02
  • 2013-05-20
  • 2019-01-12
  • 2017-09-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多