Com DirectX设备的线程安全挂钩

Com DirectX设备的线程安全挂钩,com,thread-safety,directx,hook,vtable,Com,Thread Safety,Directx,Hook,Vtable,我成功地钩住了DirectX9的DeviceEx的BeginScene/EndScene方法,以便覆盖图形应用程序屏幕上的区域。我通过使用x86跳转命令覆盖EndScene的适当vtable条目42所指向的函数的第一行来实现 问题是,当我想调用原始的EndScene方法时,我必须编写由跳转覆盖的原始代码。此操作不是线程安全的,并且应用程序有两个线程使用的两个设备 我试图重写vtable条目或复制它,并重写指向vtable的COM接口指针,但两种方法都不起作用。我猜原始函数指针是缓存在某个地方的,

我成功地钩住了DirectX9的DeviceEx的BeginScene/EndScene方法,以便覆盖图形应用程序屏幕上的区域。我通过使用x86跳转命令覆盖EndScene的适当vtable条目42所指向的函数的第一行来实现

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

我试图重写vtable条目或复制它,并重写指向vtable的COM接口指针,但两种方法都不起作用。我猜原始函数指针是缓存在某个地方的,或者是在编译过程中优化的

我曾考虑将整个原始方法体复制到另一个内存块,但我担心两个问题:1.简单的一个,我想我不知道如何发现方法的长度;2.我不知道函数体是否存储相对于函数在内存中位置的偏移量

如果WPF的设备能帮上什么忙的话,我正在尝试连接它


有人知道这种挂钩的线程安全方法吗?

回答我自己的问题:似乎出于我的目的,在我自己的过程中,在执行另一种方法之前,或者执行另一种方法,而不是原来的方法,“蹦床”就是答案。通常,这意味着我需要生成另一个代码段,该代码段与重写的汇编命令完全相同

因为这不是一项容易的任务,所以建议使用外部库

关于此主题的讨论: