Thema: Delphi Direct3D hook

Einzelnen Beitrag anzeigen

fortu

Registriert seit: 21. Mär 2008
1 Beiträge
 
#1

Direct3D hook

  Alt 21. Mär 2008, 23:22
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.
  Mit Zitat antworten Zitat