Einzelnen Beitrag anzeigen

GOOFY009

Registriert seit: 24. Okt 2009
20 Beiträge
 
#1

D3D9 Hook bzw. als "proxy.dll"

  Alt 24. Okt 2009, 14:58
Hallo Leute,

ich versuche gerade die Proxy.dll von Michael Koch (Link ) nach Delphi zu portieren, da ich im Netzt nichts brauchbares in Delphi gefunden habe.

Leider sind meine Kentnisse in C++ eher "bescheiden" (eigentlich gegen NULL). Was mich aber nicht abhalten soll es dennoch irgendwie zu schaffen .

Zu Beginn würde es mir schon einmal reichen, die Originalfunktion aus der im SystemDir liegenden d3d9.dll zu laden und an das aufrufende Programm zurück zu geben.

Das Laden der Function stellt dabei kein Problem da.... nur wenn ich die Funktion
oDirect3D9_Create := GetProcAddress(gl_hOriginalDll, 'Direct3DCreate9'); aufrufe (Rückgabe ist ein Pointer) und dann mit
Delphi-Quellcode:
ppIDirect3D9_orig := IDirect3D9(oDirect3D9_Create(SDKVersion));
result := ppIDirect3D9_orig;
zurück geben will, habe ich ein Problem.

ppIDirect3D9_orig wird mir als Pointer(xxxxx) of IDirect3D9 angezeigt und damit kommt es zum Absturz des Programms/der Dll.

Ich habe auch hier schon im Forum gesucht und habe dabei diesen Beitrag gefunden, welcher mir aber nicht wirklich geholfen hat.

Wenn also jemmand eine Idee hätte oder vieleicht sogar vor dem gleichen Problem stand und mir helfen könnte
würde ich mich über entsprechene Hilfe/Tips sehr freuen.

Zum Abschluß noch der Code der DLL :
Delphi-Quellcode:
library d3d9;

uses
  Windows,
  SysUtils,
  Classes,
  Direct3D9,
  d3dx9,
  my_IDirect3DDevice9 in 'my_IDirect3DDevice9.pas',
  my_IDirect3D9 in 'my_IDirect3D9.pas',
  tools in 'tools.pas',
  global_var in 'global_var.pas';

type
  TDirect3DCreate9 = function(SDKVersion: LongWord): Pointer; stdcall;

var
  oDirect3D9_Create : TDirect3DCreate9 = nil;
  ppIDirect3D9_orig : IDirect3D9;

{$R *.res}


function Direct3DCreate9(SDKVersion: LongWord): IDirect3D9;
begin
  if gl_hOriginalDll = 0 then LoadOriginalDLL;

  oDirect3D9_Create := GetProcAddress(gl_hOriginalDll, 'Direct3DCreate9');

  ppIDirect3D9_orig := IDirect3D9(oDirect3D9_Create(SDKVersion));

  result := ppIDirect3D9_orig;

end;

procedure InitInstance;
begin
  gl_hOriginalDll := 0;
end;

procedure ExitInstance;
begin
  if gl_hOriginalDll <> 0 then begin
    FreeLibrary(gl_hOriginalDll);
    gl_hOriginalDll := 0;
  end;
end;

procedure DLLEntryPoint(reason : Integer);
begin
  case reason of
    DLL_PROCESS_DETACH :
      begin
        ExitInstance;
      end;
    DLL_PROCESS_ATTACH :
      begin
        InitInstance;
      end;
    DLL_THREAD_DETACH : exit;
    DLL_THREAD_ATTACH : exit;
  end;
end;

exports

Direct3DCreate9;

begin
  DLLProc := @DLLEntryPoint;
  DLLEntryPoint(DLL_PROCESS_ATTACH);

end.
Bei der ersten Quelle gibt es auch den Quellcode in C++ wenn benötigt.


CU
GOOFY
  Mit Zitat antworten Zitat