Hooked VirtualAlloc在被系统DLL调用时返回nullptr

时间:2017-12-16 09:13:31

标签: c++ c windows memory dll

我想跟踪VirtualAlloc完成的内存分配。为此,我尝试使用mhookeasyhook。只要我自己拨打VirtualAlloc,两者都可以正常工作。调用挂起的钩子,从那里我调用真正的VirtualAlloc函数,并按预期返回内存。

我现在的问题是我尝试打开一个SFML窗口并且捕获了VirtualAlloc调用,但没有返回内存。函数调用通过sfml-window-2.dll并从那里调用wglCreateContext调用调用VirtualAlloc的CreateAnyContext。 wglCreateContext位于Opengl32.dll中。我想我的用户空间代码没有为其分配内存的权限。我的问题是,如果我不允许为它分配内存,为什么系统库会通过相同的存根(我挂钩)?我怎么能将这些电话打破并防止这种情况发生?

我的意思是,在我的特定情况下,我可以等到窗口打开并在此之后挂钩VirtualAlloc。但这将是一个非常糟糕的解决方案,因为我想跟踪任意程序甚至可能注入我的dll来跟踪内存。

修改 我不仅想跟踪程序内存,而且我还希望能够将它重置为一个记录状态,所有这些都不会减慢程序的执行速度,因为在我的情况下它将是游戏。因此,我想从VirtualAlloc开始,设置MEM_WRITE_WATCH标志并手动跟踪GetWriteWatch返回的页面。我已经编写了一个可以通过这种方式重置的向量,但我需要它更通用。的 /修改

另外需要注意的是,我已经尝试了HeapAlloc,它也在所述函数中调用,但它返回内存。这就是我尝试两个库的原因。 任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

原来我不允许改变旗帜。我的解决方法,因为我无法以合理的方式知道调用者是谁,我使用更改的标志分配它,如果失败,我会用原始标志再次分配它。