Microsoft Detours und directX ohne Effekt

Cromon

Erfahrenes Mitglied
Hallo zusammen!

Ich habe im Internet gerade per Zufall Microsoft Detours entdeckt und wollte damit ein paar Tests mit meiner directX-Applikation machen. Leider bin ich bisher nur mässig erfolgreich!

Folgende DLL verwende ich:
Code:
HRESULT __stdcall hkEndScene(LPDIRECT3DDEVICE9 pDevice)
{
	MessageBoxA(0, "EndScene!", "", MB_OK);
	return pEndScene(pDevice);
}

void InitHook(HINSTANCE hModul)
{
	HMODULE hModule = 0;
	while(!hModule)
	{
		hModule = GetModuleHandle("d3d9.dll");
		Sleep(100);
	}
	DisableThreadLibraryCalls((HMODULE)hModul);
	DetourTransactionBegin();
	DetourUpdateThread(GetCurrentThread());
	LPVOID func = (LPVOID)0x7542CE09;
	DetourAttach(&func, hkEndScene);
	if(DetourTransactionCommit() == NO_ERROR)
	{
		MessageBoxA(0, "Detoured endscene!", "", MB_OK);
	}

}

int WINAPI DllMain(HINSTANCE hInst ,DWORD reason, LPVOID reserved)
{
	switch(reason)
	{
	case DLL_PROCESS_ATTACH:
		CreateThread(0, 0, (LPTHREAD_START_ROUTINE)InitHook, hInst, 0, 0);
		break;
	}
	return true;
}

In meiner Applikation nun, die ich detouren will geschieht folgendes:
Code:
LoadLibraryA("HookDLL.dll");

Es erscheint beim Programmstart schön sauber "Detoured endscene" allerdings erscheint keine MessageBox, aber die Applikation rendert noch immer einwandfrei. Daher vermute ich, dass EndScene nicht umgeleitet wird.

Woran könnte das liegen? Ich habe mit IDA die Adresse von CD3DBase::EndScene nachgeschaut in meiner d3d9.dll und die Addresse entsprechend eingetragen (mehrfach auf Schreibfehler überprüft).

Ich hoffe jemand kann mir helfen!

Gruss
Cromon
 
Ich habe OllyDBG mal verwendet und geschaut, welcher Wert in EDX liegt für [ptrVtbl + 0xA8] und habe gemerkt, dass die Adresse oben nicht korrekt ist und sie ersetzt durch den Wert in EDX. Nun funktioniert das ganze soweit wunderbar!

Nun habe ich aber gleich noch eine Frage:
Ich richte via ATL gerade einen COM-Server ein welcher die Funktionalitäten leisten wird. Nun sollte da drin auch eine Funktion vorkommen, welche einen Parameter des Typs IDirect3DDevice9* erwartet.

Wo ist das Problem?
Ganz einfach, beim Compilieren:
1>.\DXHookServer.idl(20) : error MIDL2025 : syntax error : expecting a type specification near "IDirect3DDevice9"

Gemeint ist folgende Zeile:
Code:
[id(2), helpstring("Methode OnRender")] HRESULT OnRender([in] ULONG* dwThreadId, [in] IDirect3DDevice9* pDevice);

in der Datei DXHookServer.idl. Wie kann ich dem mitteilen, dass der Typ soweit in Ordnung ist?

Gruss
Cromon
 
Zurück