爲了覆蓋圖形應用程序屏幕上的區域,我成功地將DirectX9的DeviceEx的BeginScene/EndScene方法掛鉤。我通過用x86跳轉命令覆蓋適當的vtable條目指定的函數的第一行(對於EndScene爲42)來完成。DirectX設備的線程安全掛鉤
問題是,當我想調用原始的EndScene方法時,我必須寫入由跳轉覆蓋的原始代碼。此操作不是線程安全的,並且該應用程序有兩個線程使用的兩個設備。
我試着覆蓋vtable條目或複製它並覆蓋COM接口指針到vtable,這兩種方式都沒有奏效。我猜原來的函數指針會被緩存到某個地方,或者在編譯時被優化。
我想過把整個原始方法體複製到另一個內存塊,但我害怕的兩個問題:(1)(我覺得很簡單)我不知道如何發現方法的長度(2)我不知道函數體是否存儲相對於函數在內存中的位置的偏移。
我試圖鉤住WPF的設備,如果它可以幫助莫名其妙。
有沒有人知道這種掛鉤線程安全的方式?