Hi, ich versuche gerade einen Hook zu schreiben für meine Direct3D8-Anwendung. Da die d3d8.dll keine Exports der einzelnen Funktionen hat, muss ich erst über Direct3DCreate8 hooken und dann iwie IDirect3D8 .. dazu weiß ich aber nicht ganz, wie ich das anstellen soll. Wäre schön, wenn ihr mir sagt, wie ich weiter vorgehen soll. Ich poste mal meinen momentanen Code. Leider funktioniert mein Code so auch nicht richtig. Bekomme nen Error vom Beziehen einer Adresse
Hoffe ihr könnt mir weiter helfen.
Delphi-Quellcode:
library Project1;
uses
SysUtils,
windows,
GenCodeHook,
Direct3D8,
d3dx8,
funcs
in '
funcs.pas';
{$R *.res}
type
Direct3DCreate8 =
function( D3D_SDK_VERSION : cardinal ): IDirect3D8;
stdcall;
var
oDirect3DCreate8 : Direct3DCreate8;
pIDirect3D8 : IDirect3D8;
//Die neue Funktion
function pDirect3DCreate8( D3D_SDK_VERSION : cardinal ): IDirect3D8;
stdcall;
begin
pIdirect3D8 := oDirect3DCreate8( D3D_SDK_VERSION );
if pIdirect3D8 <>
nil then
Writelog('
Direct3DCreate8 gehookt!');
result := pIDirect3D8;
end;
procedure dllmain(dwReason: integer);
// Wird gecalled, wenn der Prozess die dll lädt / unlädt
var
module : HMODULE;
begin
case dwreason
of
1:
begin
// Wenn die dll geladen wurde, alles laden, was benötigt wird
//Die Adressen aus der D3D8.dll beziehen
module := GetModuleHandle('
D3D8.dll');
//Detour.
CreateGenericCodeHook( GetProcAddress(module,pchar('
Direct3DCreate8')), @pDirect3DCreate8, @oDirect3DCreate8 );
end;
0:
begin
// Wenn die dll wieder entladen wird
//Die original Funk wieder laden
RemoveGenericCodeHook(@oDirect3DCreate8);
end;
end;
end;
begin
DLLProc := @DLLMain;
// Einsteigspunkt setzen
DLLMain(1);
// DllMain callen
end.