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

问题描述 投票:1回答:1

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

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

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

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

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

c++ c windows memory dll
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.