Madshi, would you be so kind and explain function GetInterfaceMethod in your DD sample?
What I mean is translation of that code into the C++ from delphi.
DirectDraw example
Code: Select all
void* GetInterfaceMethod(IUnknown* intf, DWORD methodIndex)
{
return (void*) (* ((void**)(*((DWORD*)intf) + methodIndex * 4)));
}
Thx Madshi, however looks like my conversion of your sample to c++ is not working.
I get error on HookCode. There is problem w/ casting. If you could help me solve this issue, I would be really grateful.
I get error on HookCode. There is problem w/ casting. If you could help me solve this issue, I would be really grateful.
Code: Select all
void LogE(char* text)
{
ofstream logefile("log", ios::app);
if (logefile.is_open())
{
logefile << text;
logefile.close();
}
}
void* GetInterfaceMethod(IUnknown* intf, DWORD methodIndex)
{
// result := pointer(pointer(dword(pointer(intf)^) + methodIndex * 4)^);
return (void*) (* ((void**)(*((DWORD*)intf) + methodIndex * 4)));
}
HRESULT (WINAPI *FlipNext)(LPDIRECTDRAWSURFACE7 lpDDSurfaceTargetOverride, DWORD dwFlags);
HRESULT (WINAPI *CreateSurfaceNext)(LPDDSURFACEDESC2 lpDDSurfaceDesc2, LPDIRECTDRAWSURFACE7 FAR *lplpDDSurface, IUnknown FAR *pUnkOuter);
HRESULT (WINAPI *DirectDrawCreateExNext)(GUID FAR *lpGUID, LPVOID *lplpDD, REFIID iid, IUnknown FAR *pUnkOuter);
HRESULT WINAPI FlipCallback(LPDIRECTDRAWSURFACE7 lpDDSurfaceTargetOverride,
DWORD dwFlags)
{
LogE("\nFlipCallback");
HRESULT hr = FlipNext(lpDDSurfaceTargetOverride, dwFlags);
return hr;
}
HRESULT WINAPI CreateSurfaceCallback(LPDDSURFACEDESC2 lpDDSurfaceDesc2,
LPDIRECTDRAWSURFACE7 FAR *lplpDDSurface,
IUnknown FAR *pUnkOuter)
{
LogE("\nCreateSurfaceCallback");
HRESULT hr = CreateSurfaceNext(lpDDSurfaceDesc2, lplpDDSurface, pUnkOuter);
if (!FAILED(hr) && (FlipNext == NULL))
{
if (!HookCode(GetInterfaceMethod(*lplpDDSurface, 11), FlipCallback, (PVOID*)&FlipNext))
LogE(" - FlipCallback hook Failed!");
}
return hr;
}
HRESULT WINAPI DirectDrawCreateExCallback(GUID FAR *lpGUID,
LPVOID *lplpDD,
REFIID iid,
IUnknown FAR *pUnkOuter)
{
LogE("\nDirectDrawCreateExCallback");
HRESULT hr = DirectDrawCreateExNext(lpGUID, lplpDD, iid, pUnkOuter);
if (!FAILED(hr) && (CreateSurfaceNext == NULL))
{
if (!HookCode(GetInterfaceMethod(reinterpret_cast<IUnknown*>(*lplpDD), 6), CreateSurfaceCallback, (PVOID*)&CreateSurfaceNext))
LogE(" - CreateSurfaceCallback hook Failed!");
}
return hr;
}
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
if (ul_reason_for_call == DLL_PROCESS_ATTACH)
{
LogE("\nDllMain");
//HookAPI("d3d8.dll","Direct3DCreate8",Direct3DCreate8Callback, (PVOID*) &Direct3DCreate8Next);
if(!HookAPI("ddraw.dll","DirectDrawCreateEx",DirectDrawCreateExCallback, (PVOID*)&DirectDrawCreateExNext))
LogE(" - DirectDrawCreateExCallback hook Failed!");
}
return TRUE;
}