【问题标题】:How to tell which module in my process created which heap?如何判断我的进程中的哪个模块创建了哪个堆?
【发布时间】:2017-10-30 06:10:45
【问题描述】:

如果我在我的进程中使用GetProcessHeaps API enumerate heaps,有没有办法知道这些堆是由哪些模块创建的?

这就是我需要这个的原因:对于purpose of my security application,我需要我的进程使用的lock virtual memory(即Windows 公共控件使用的内存,通过new operator、COM 等分配的任何内容)

我需要知道哪个模块创建了堆的原因是为了消除任何可以加载到我的进程中但与它无关的 DLL。例如,TeamViewer 加载到正在运行的进程中以添加任何他们需要的内容,所以我不想锁定它的私有堆,如果它有一个,等等。

【问题讨论】:

  • 进程堆内部结构 (_HEAP) 没有关于谁(调用者的返回地址?)创建此堆的任何信息。系统不关心这个。所以你不能得到不存在的信息。在这里你可以做的最大的事情——钩住HeapCreateRtlCreateHeap 看看谁打电话给这个。但是说 msvcrt 也为客户端创建私有堆......你会做堆栈遍历吗?认为任务没有任何可接受的解决方案
  • 挂钩堆创建函数并遍历调用堆栈。但我怀疑这会非常强大。
  • 好的。谢谢你们俩。我就是这么想的。
  • 那些使用 VirtualAlloc 或 NUMA 分配函数实现自己的堆的模块呢?
  • @DavidHeffernan:他们不会被这个方法覆盖。

标签: c++ windows winapi heap-memory virtual-memory


【解决方案1】:

如果您只关心自己的分配,那么您可以只使用自己的私有堆并覆盖默认的 new 和 delete 处理程序以使用您的堆。

【讨论】:

  • 就像我上面所说的,这不仅仅是我自己的分配。它主要是常见的控件,COM 对象,以及 C++ 自己的隐式 new 运算符。
  • 如果你使用 com,你会因为编组而遇到其他问题。您可能应该使这些对象仅基于逻辑并将内部数据保存在受保护的堆上。
  • 我不专门使用COM,但常用控件可以。例如,RichEdit 控件可以。也许也只是一个普通的 EDIT 文本框。
  • @c00000fd - 所有常用控件仅使用 GetProcessHeap() - 所以只锁定它并忽略所有其他控件
  • @RbMm:我在这个基于 MFC 对话框的应用程序中获得了 5 个堆。这是一个库存项目,我刚刚添加了一个编辑和丰富编辑控件,也称为AfxInitRichEdit2()OleInitialize()。所以肯定有别的东西……
猜你喜欢
  • 1970-01-01
  • 2011-10-05
  • 1970-01-01
  • 2010-11-06
  • 1970-01-01
  • 2013-04-18
  • 1970-01-01
  • 1970-01-01
  • 2015-03-30
相关资源
最近更新 更多