2014-01-13 52 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