为了覆盖图形应用程序屏幕上的区域,我成功地将DirectX9的DeviceEx的BeginScene/EndScene方法挂钩。我通过用x86跳转命令覆盖适当的vtable条目指定的函数的第一行(对于EndScene为42)来完成。DirectX设备的线程安全挂钩
问题是,当我想调用原始的EndScene方法时,我必须写入由跳转覆盖的原始代码。此操作不是线程安全的,并且该应用程序有两个线程使用的两个设备。
我试着覆盖vtable条目或复制它并覆盖COM接口指针到vtable,这两种方式都没有奏效。我猜原来的函数指针会被缓存到某个地方,或者在编译时被优化。
我想过把整个原始方法体复制到另一个内存块,但我害怕的两个问题:(1)(我觉得很简单)我不知道如何发现方法的长度(2)我不知道函数体是否存储相对于函数在内存中的位置的偏移。
我试图钩住WPF的设备,如果它可以帮助莫名其妙。
有没有人知道这种挂钩线程安全的方式?