Win7 / 8 DWM Draw挂钩

问题描述 投票:6回答:1

我正在尝试为Desktop Window Manager开发某些扩展。我选择了DLL注入和函数挂钩的方法。应该可以在Windows 7和Windows 8中使用。

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

[只要将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);
        }
    }
}

任何人都对钩子有经验,他能给我一些帮助吗?非常感谢!

hook code-injection direct3d protection dwm
1个回答
0
投票

我有相同的项目。我在dwm中挂了D3D11CreateDevice。但是它不会再次运行,为时已晚。我认为它仅在dwm启动时运行。我尝试使用DwmEnableComposition(DWM_EC_DISABLECOMPOSITION)和DwmEnableComposition(DWM_EC_ENABLECOMPOSITION) ,但仅适用于win7,而不适用于win8 / 10。可以分享您的解决方案,非常感谢。

© www.soinside.com 2019 - 2024. All rights reserved.