デスクトップウィンドウマネージャー用の特定の拡張機能を開発しようとしています。DLLインジェクションと関数フックの方法を選択しました。Windows7とWindows8で動作するはずです。
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);
}
}
}
誰かがフックの経験がありますか、そして彼は私にいくつかの助けを提供できますか?どうもありがとうございます!