我想跟踪由VirtualAlloc完成的内存分配。为此,我尝试使用麦胡克和易钩。只要我亲自给VirtualAlloc打电话,这两种设备都能正常工作。调用注册的钩子,然后调用实际的VirtualAlloc函数,并按预期返回内存。
我现在的问题是,我尝试打开一个SFML-window,其中的VirtualAlloc调用被捕获,但没有返回内存。函数调用通过sfml-window-2.dll,然后调用wglCreateContext,它调用CreateAnyContext,后者调用VirtualAlloc。wglCreateContext在Opengl32.dll。我猜我的用户空间代码没有为它分配内存的权限。我的问题是,如果不允许为系统库分配内存,为什么系统库要通过相同的存根(与我所挂的一样)?我怎么才能区分这些电话,防止这种情况发生呢?
我的意思是,在我的特殊情况下,我可以等到窗口打开,然后挂起VirtualAlloc。但这将是一个非常糟糕的解决方案,因为我想跟踪任意程序,甚至可能注入我的dll来跟踪内存。
编辑:--我不仅希望跟踪程序内存,而且还希望能够将其重置为记录状态,尽管程序执行速度不应放慢太多,因为在我的情况下,这将是游戏。因此,我想从VirtualAlloc开始,设置MEM_WRITE_WATCH标志并手动跟踪GetWriteWatch返回的页面。我已经写了一个向量,可以这样重置,但我需要它更一般。/EDIT
另一件要注意的是,我已经用HeapAlloc尝试过了,它也是在上述函数中调用的,但它返回内存。这就是为什么我尝试了两个库。任何帮助都是非常感谢的。
发布于 2017-12-18 12:20:07
原来我不被允许改变旗子。我的解决办法,因为我不知道谁是一个合理的调用者,我分配它修改标志,如果失败,我再分配它与原始标志。
https://stackoverflow.com/questions/47844170
复制相似问题