DirectDraw example

c++ / delphi package - dll injection and api hooking
Post Reply
Vati
Posts: 3
Joined: Sun Jul 18, 2004 8:29 am

DirectDraw example

Post by Vati »

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.
madshi
Site Admin
Posts: 10754
Joined: Sun Mar 21, 2004 5:25 pm

Post by madshi »

Code: Select all

void* GetInterfaceMethod(IUnknown* intf, DWORD methodIndex)
  {
  return (void*) (* ((void**)(*((DWORD*)intf) + methodIndex * 4)));
  }
(Converted by Maciej Donotek.)
Vati
Posts: 3
Joined: Sun Jul 18, 2004 8:29 am

Post by Vati »

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.

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;
}
madshi
Site Admin
Posts: 10754
Joined: Sun Mar 21, 2004 5:25 pm

Post by madshi »

Those interface methods all have an additional hidden "Self" parameter. You need to list that as well. You can see it in the Delphi code. You need to do the very same in C++.
Vati
Posts: 3
Joined: Sun Jul 18, 2004 8:29 am

Post by Vati »

Thank you Madshi, that had solved the issue indeed!
This "hidden" self paramether is the class which methods are called. It makes sanse now.
Post Reply