Hallo liebe Community,
bin gerade dabei ein etwas älteres Spiel was DirectDraw (dx7) benutzt zu Hooken..Da ich mich mit DirectDraw nicht gut auskenne und nicht wie bei dx9 wüsste wie ich an eine EndScene käme versuche ich die Blt Funktion zu detouren und dort das BackSurface abzugreifen, welches schließlich auf das FrontSurface gezeichnet werden müsste.. (falls ich Unrecht habe bitte korrigieren)
Um nun an die Blt Methode zu gelangen, besorg ich mir zunächst das DirectDraw7-Interface.
Anschließend über die CreateSurface Methode das DirectDrawSurface7-Interface und damit auch die Blt Funktion (hier):
Klappt alles wunderbar bis hierhin.
GetInterfaceMethod(dxSurfaceInterface, i)
gibt mir auch nen wunderschönen Pointer auf die vermeintliche Blt-Function, allerdings stürzt das Spiel beim Aufrufen der originalen Blt-Function ab und wirft mir ne Access-Violation vor die Füße. :/
Verwundert mich ziemlich, da ich im Prinzip genau wie bei der CreateSurface-Methode vorgegangen bin..
Hier nochmal ein paar Code-Schnippsel zur Blt-Function:
und oben:
Würde mich freuen wenn jemand mir helfen könnte, oder Ideen hat.
Byteanzahl die beim detouren gesaved werden sollte stimmen.
Liege ich vielleicht Falsch bei der Annahme, dass die Blt-Methode sich an Stelle 5 im Interface befindet? Laut "DDraw.h" müsste ich richtig liegen..
Vielen Dank im Voraus,
Qu4rry
bin gerade dabei ein etwas älteres Spiel was DirectDraw (dx7) benutzt zu Hooken..Da ich mich mit DirectDraw nicht gut auskenne und nicht wie bei dx9 wüsste wie ich an eine EndScene käme versuche ich die Blt Funktion zu detouren und dort das BackSurface abzugreifen, welches schließlich auf das FrontSurface gezeichnet werden müsste.. (falls ich Unrecht habe bitte korrigieren)
Um nun an die Blt Methode zu gelangen, besorg ich mir zunächst das DirectDraw7-Interface.
Anschließend über die CreateSurface Methode das DirectDrawSurface7-Interface und damit auch die Blt Funktion (hier):
Code:
HRESULT WINAPI hkCreateSurface(LPDIRECTDRAW7 poi, PVOID self, IUnknown** directDrawSurface, IUnknown FAR * unkOuter)
{
add_log("Create Surface Methode wurde aufgerufen");
HRESULT result = pCreateSurface(poi, self, directDrawSurface, unkOuter);
IUnknown* dxSurfaceInterface;
if ( !result )
{
if (!SetCooperativeLevelNext || !CreateDevice7Next)
{
if (!(*directDrawSurface)->QueryInterface(IID_IDirectDrawSurface7, (PVOID*) &dxSurfaceInterface))
{
int i = 5;
add_log("BltFunction( %i InterfaceMethod) : %x",i,GetInterfaceMethod(dxSurfaceInterface, i));
pBlt = (Blt_t) DetourFunc((PBYTE)GetInterfaceMethod(dxSurfaceInterface, i), (PBYTE)hkBlt, 10);
dxSurfaceInterface->Release();
}
}
}
add_log("Got out of here!");
return result;
}
GetInterfaceMethod(dxSurfaceInterface, i)
gibt mir auch nen wunderschönen Pointer auf die vermeintliche Blt-Function, allerdings stürzt das Spiel beim Aufrufen der originalen Blt-Function ab und wirft mir ne Access-Violation vor die Füße. :/
Verwundert mich ziemlich, da ich im Prinzip genau wie bei der CreateSurface-Methode vorgegangen bin..
Hier nochmal ein paar Code-Schnippsel zur Blt-Function:
Code:
HRESULT WINAPI hkBlt(LPDIRECTDRAWSURFACE7 lpdds, LPRECT recta,IUnknown** lpdd, LPRECT rectb,DWORD dw, LPDDBLTFX lpddtfx)
{
add_log("Blt in");
HRESULT result = pBlt(lpdds, recta, lpdd, rectb, dw, lpddtfx);
add_log("Blt out");
return result;
}
Code:
//BLT typedef HRESULT ( WINAPI *Blt_t)(LPDIRECTDRAWSURFACE7, LPRECT ,IUnknown** , LPRECT ,DWORD , LPDDBLTFX); Blt_t pBlt; HRESULT WINAPI hkBlt(LPDIRECTDRAWSURFACE7 lpdds, LPRECT recta,IUnknown** lpdd, LPRECT rectb,DWORD dw, LPDDBLTFX lpddtfx);
Byteanzahl die beim detouren gesaved werden sollte stimmen.
Liege ich vielleicht Falsch bei der Annahme, dass die Blt-Methode sich an Stelle 5 im Interface befindet? Laut "DDraw.h" müsste ich richtig liegen..
Vielen Dank im Voraus,
Qu4rry