线程安全挂钩DirectX设备

时间:2014-01-13 20:34:13

标签: com thread-safety directx hook vtable

我成功地连接了DirectX9的DeviceEx的BeginScene / EndScene方法,以覆盖图形应用程序屏幕上的区域。我通过使用x86跳转命令覆盖适当的vtable条目(42为EndScene)指向的函数的第一个“行”来完成它。

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

我尝试覆盖vtable条目或复制它并覆盖指向vtable的COM接口指针,这两种方法都不起作用。我想原始函数指针在某处缓存或在编译中进行了优化。

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

我正试图挂钩WPF的设备,如果它能以某种方式提供帮助。

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

1 个答案:

答案 0 :(得分:0)

回答我自己的问题:似乎为了我的目的(在我自己的过程之前或之前执行另一种方法),“蹦床”就是答案。通常,这意味着我需要创建另一个代码段,使其完全覆盖汇编命令。

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

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