Hallo daze,
als aller erstes wirst du auf jeden Fall das Handle für das Interface brauchen. Solange du dich im Userland befindest, wirst du nicht ohne weiteres die geöffneten Handles eines Prozesses auflisten können(afaik = ich kann mich irren).
Um im DirectX Fenster rumstochern zu können, _brauchst_ du das Interface.
Ich hätte da vielleicht ein Beispiel *im alten code rumgrab* ... ach, da haben wir es ja. Ich brauchte in dem folgenden Beispiel das DirectDraw Interface, da zu der Zeit noch kaum jemand an 3D gedacht hat (das Spiel ist etwa 10 Jahre alt

). Das Prinzip ist das gleiche, nur das es sich um einen anderen Dll Namen und Funktion handelt. Du wirst warscheinlich nach "Direct3DCreate9" und/oder d3d9.dll suchen müssen. Schaue dir die Importtable der Spieldateien durch und wenn du nichts findest, wird die Direct3D Dll dynamisch geladen, somit gibt es irgendwo ein "LoadLibrary" Aufruf.
Hier wird die Dll geladen und das Handle in einer globalen Variable gespeichert(uninteressant):
Code:
.text:15012110 loc_15012110:
.text:15012110 * * * * * * * * mov * * eax, dword_15039B08
.text:15012115 * * * * * * * * mov * * dword_15039AF0, 1
.text:1501211F * * * * * * * * test * *eax, eax
.text:15012121 * * * * * * * * mov * * dword_15039AFC, 0
.text:1501212B * * * * * * * * jnz * * short loc_15012141
.text:1501212D * * * * * * * * push * *offset aDdraw_dll; "ddraw.dll"
.text:15012132 * * * * * * * * call * *ds:LoadLibraryA
.text:15012138 * * * * * * * * test * *eax, eax
.text:1501213A * * * * * * * * mov * * dword_15039B08, eax
.text:1501213F * * * * * * * * jz * * *short loc_1501215C
Kurz danach haben wir sofort den Aufruf von "DirectDrawCreate":
Code:
.text:15012141 * * * * * * * * push * *offset aDirectdrawcrea; "DirectDrawCreate"
.text:15012146 * * * * * * * * push * *eax * * * * * *; hModule
.text:15012147 * * * * * * * * call * *ds:GetProcAddress
.text:1501214D * * * * * * * * test * *eax, eax
.text:1501214F * * * * * * * * jz * * *short loc_1501215C
.text:15012151 * * * * * * * * push * *0
.text:15012153 * * * * * * * * push * *offset dword_15039B0C
.text:15012158 * * * * * * * * push * *0
.text:1501215A * * * * * * * * call * *eax
.text:1501215C
.text:1501215C loc_1501215C:
.text:1501215C
.text:1501215C * * * * * * * * mov * * eax, dword_15039B0C
.text:15012161 * * * * * * * * test * *eax, eax
Wenn wir uns die Deklaration von "DirectDrawCreate" ansehen, sehen wir, dass wir an die Funktion einen Pointer übergeben, unter dem wir nach dem Aufruf(zweiter Parameter) das Interface finden sollten - wenn alles geklappt hat. In unserem Fall liegt das unter "15039B0C". Das bedeutet wenn wir eine Dll injiziert haben, können wir sie mithilfe dieses Pointers auslesen und auch benutzen.
Dieser Teil des Codes sah bei mir so aus:
Code:
#include <windows.h>
#include "C:\DXSDK\Include\ddraw.h"
HMODULE g_hDll;
IDirectDraw *g_pDD;
// blah ...
// 1: Offset, 2: bufout, 3: len
ReadLocalMemory(0x15039B0C, g_pDD, sizeof(g_pDD));
(*schäm*)
DirectX/OpenGL ist leider nicht mein Lieblingsbereich, deshalb habe ich für dich kein aktuelles Beispiel. Trotzdem hoffe ich das es hilfreich war.
Eine Möglichkeit um immer an das Handle zu kommen, wäre es einen Loader zu Programmieren der als erste Aktion (Break beim Entrypoint der Exe) deine Dll läd (Dll-Injection) und wenn die d3d9 sich noch nicht im Prozess befindet, kannst du z. B. ein Hook auf LoadLibrary(Ex) setzen. In deiner Hooked_LoadLibrary, lädst du selbst die d3d9.dll (deinen Hook kannst du an dem Punkt vorher schon ausschalten, wirst du dafür nicht mehr brauchen) und mithilfe der Exporttable von d3d9 findest du dann den Entry zu Direct3DCreate9. Nur noch ein Hook auf diese Funktion und sich den Rückgabewert(Interface) abgreifen ;-)
Damit ist dir das Interface vor dem Spiel bekannt und bevor das Spiel ein Fenster erstellt hat ... wie wären ein paar Hooks mehr für eine andere Auflösung, Windowmode etc. ? :-)
Das wenn du es selbst machen willst. Wenn du es einfach haben willst, suchst du dir den "alten" Quellcode des hacks von Bubbafate für WoW - ich persönlich habe mir den nicht angeschaut, er sollte aber das beinhalten was du suchst.