2014-01-13 47 views
0

为了覆盖图形应用程序屏幕上的区域,我成功地将DirectX9的DeviceEx的BeginScene/EndScene方法挂钩。我通过用x86跳转命令覆盖适当的vtable条目指定的函数的第一行(对于EndScene为42)来完成。DirectX设备的线程安全挂钩

问题是,当我想调用原始的EndScene方法时,我必须写入由跳转覆盖的原始代码。此操作不是线程安全的,并且该应用程序有两个线程使用的两个设备。

我试着覆盖vtable条目或复制它并覆盖COM接口指针到vtable,这两种方式都没有奏效。我猜原来的函数指针会被缓存到某个地方,或者在编译时被优化。

我想过把整个原始方法体复制到另一个内存块,但我害怕的两个问题:(1)(我觉得很简单)我不知道如何发现方法的长度(2)我不知道函数体是否存储相对于函数在内存中的位置的偏移。

我试图钩住WPF的设备,如果它可以帮助莫名其妙。

有没有人知道这种挂钩线程安全的方式?

回答

0

回答我自己的问题:看来,为了我的目的(在我自己的过程之前执行另一种方法,或者替代原来的方法),“蹦床”就是答案。一般来说,这意味着我需要制作另一个代码段,以使得overriden组装命令完成。

因为这不是一件容易的事情,所以建议使用外部库。

关于此主题的讨论: How to create a trampoline function for hook