6

我正在尝试为桌面窗口管理器开发某些扩展。我选择了DLL注入和函数挂钩的方法。它应该在 Windows 7 和 Windows 8 中工作。

我成功地将我的 DLL 注入 dwm.exe 进程并挂钩 Direct3D 设备创建(Win7 上的 D3D10CreateDevice1 和 Win8 上的 D3D11CreateDevice/D3D11Device::GetImmediateContext)。但是,我在挂钩绘图程序(Draw/DrawIndexed/etc.)时遇到问题。

每当我用指向我的函数的指针替换 vtable 中的指针时,它们会在一段时间内恢复为原始指针。可能在 DWM/Direct3D 中有一些钩子保护???我尝试创建后台线程来替换仍然存在的指针。它适用于 Win7,但很少在 Win8 上运行(似乎指针在那里恢复得更快)

void thread(void* _device)
{
    ID3D10Device1* device = (ID3D10Device1*)_device;
    while(threadRunning)
    {
        if(device->lpVtbl->Draw != My_ID3D10Device1_Draw)
        {
            DX_METHOD_HOOK(device, ID3D10Device1, Draw);
            DX_METHOD_HOOK(device, ID3D10Device1, DrawIndexed);
        }
    }
}

有没有人有过钩子的经验,他能给我一些帮助吗?非常感谢!

4

0 回答 0