Win7/8 DWM绘制挂钩

big*_*cle 6 hook protection direct3d code-injection dwm

我正在尝试为桌面窗口管理器开发某些扩展.我选择了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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有人有挂钩的经验,他可以给我一些帮助吗?非常感谢你!