問題
修改 `Present` 前 5 字節安裝 Hook,若其他線程正執行至此,會導致崩潰或執行到修改中斷的指令流。
解決思路:前置 Hook
- 在 D3D 設備創建階段(`CreateDevice`/`CreateDeviceEx`/`IDXGISwapChain::Present` 等)提前安裝 Hook。
- 此時渲染線程尚未啟動,`Present` 不會被調用,安全修改指令碼。
- 常見注入點:`Direct3DCreate9`、`D3D11CreateDeviceAndSwapChain`、`IDXGIFactory::CreateSwapChain`。
補充同步手段
- 暫停所有線程(`SuspendThread`)修改後恢復——風險極高,易死鎖。
- 使用無鎖原子寫入(`InterlockedExchange64` 修改函數指針表/VTable)——需架構支持。
- 最穩健:**早期注入,靜態修改 VTable/代碼段,運行期不再動態 Patch**。
參考
參考開源 Hook 框架(MinHook、Detours)的初始化流程,均採用「設備創建前 Hook」。