我想跟踪VirtualAlloc
完成的内存分配。为此,我尝试使用mhook和easyhook。只要我自己拨打VirtualAlloc
,两者都可以正常工作。调用挂起的钩子,从那里我调用真正的VirtualAlloc
函数,并按预期返回内存。
我现在的问题是我尝试打开一个SFML窗口并且捕获了VirtualAlloc
调用,但没有返回内存。函数调用通过sfml-window-2.dll并从那里调用wglCreateContext调用调用VirtualAlloc
的CreateAnyContext。 wglCreateContext
位于Opengl32.dll中。我想我的用户空间代码没有为其分配内存的权限。我的问题是,如果我不允许为它分配内存,为什么系统库会通过相同的存根(我挂钩)?我怎么能将这些电话打破并防止这种情况发生?
我的意思是,在我的特定情况下,我可以等到窗口打开并在此之后挂钩VirtualAlloc
。但这将是一个非常糟糕的解决方案,因为我想跟踪任意程序甚至可能注入我的dll来跟踪内存。
修改
我不仅想跟踪程序内存,而且我还希望能够将它重置为一个记录状态,所有这些都不会减慢程序的执行速度,因为在我的情况下它将是游戏。因此,我想从VirtualAlloc开始,设置MEM_WRITE_WATCH
标志并手动跟踪GetWriteWatch
返回的页面。我已经编写了一个可以通过这种方式重置的向量,但我需要它更通用。的 /修改
另外需要注意的是,我已经尝试了HeapAlloc
,它也在所述函数中调用,但它返回内存。这就是我尝试两个库的原因。
任何帮助表示赞赏。
答案 0 :(得分:0)
原来我不允许改变旗帜。我的解决方法,因为我无法以合理的方式知道调用者是谁,我使用更改的标志分配它,如果失败,我会用原始标志再次分配它。