Einzelnen Beitrag anzeigen

napsterxx

Registriert seit: 18. Mär 2007
Ort: Borland
556 Beiträge
 
Delphi 7 Enterprise
 
#1

DirectX-Hook: Wireframe funktioniert aber nicht DrawTextA

  Alt 4. Okt 2008, 14:10
Hallo liebe DPler,
also ich bastel an einer DLL welche in einem Spiel Text anzeigt. Das Spiel ist recht alt und verwendet DirectX8.
Ich habe die madCollection genommen, da dort Beispiele dabei sind für DirectX Hooks.
Wenn ich die DLL nun systemweit injiziere und mein Spiel starte sehe ich alle "vertices" einzeln, also so ein Drahtgitter.
Nun dachte ich wenn das geht muss ich doch auch einen Text zeichnen können.

Lange rede, kurzer Quelltext

Delphi-Quellcode:
var
  font: ID3DXFont;
  fonttype: WIndows.HFONT;
  D3DXDev8: IDirect3DDevice8;
  Direct3DCreate8Next : function (sdkVersion : dword ) : dword; stdcall = nil;
  CreateDevice8Next : function (self, adapter, devType, wnd, flags, params, device : pointer) : dword; stdcall = nil;
  SetRenderState8Next : function (self: pointer; stateType, state : dword ) : dword; stdcall = nil;


function SetRenderState8Callback(self: pointer; stateType, state: dword) : dword; stdcall;
begin
  if stateType = D3DRS_FILLMODE then
    if state = D3DFILL_WIREFRAME then
         state := D3DFILL_SOLID
    else state := D3DFILL_WIREFRAME;
  result := SetRenderState8Next(self, stateType, state);

end;


procedure ShowText;
var
  rect : TRect;
begin
  rect.Top := 1; rect.Left := 1;
  rect.Bottom := 1+200; rect.Right := 1+200;

  font.DrawTextA( 'Hello World',Length('Hello World'),rect,DT_TOP,$aa00ff00);
end;

function CreateDevice8Callback(self, adapter, devType, wnd, flags, params, device: pointer) : dword; stdcall;
begin
  result := CreateDevice8Next(self, adapter, devType, wnd, flags, params, device);
  D3DXDev8 := IDirect3DDevice8(device^);
  if font = nil then
  begin
    fonttype := CreateFont(14,0,0,0,FW_BOLD,1,0,0,DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
                         CLIP_DEFAULT_PRECIS, PROOF_QUALITY, VARIABLE_PITCH,'Arial' );
    D3DXCreateFont(D3DXDev8, fonttype, font );
  end;
  if result = 0 then begin
    if @SetRenderState8Next = nil then
      HookCode(GetInterfaceMethod(device^, 50), @SetRenderState8Callback, @SetRenderState8Next);
    if (device <> nil) and (pointer(device^) <> nil) then
      SetRenderState8Next(pointer(device^), D3DRS_FILLMODE, D3DFILL_WIREFRAME);
  end;
end;

function Direct3DCreate8Callback(sdkVersion: dword) : dword; stdcall;
begin
  result := Direct3DCreate8Next(sdkVersion);

  ShowText; // Lasse ich es weg sehe ich ein Drahtgitter, mit dieser Zeile crasht alles

  if result <> 0 then
    if @CreateDevice8Next = nil then
      HookCode(GetInterfaceMethod(result, 15), @CreateDevice8Callback, @CreateDevice8Next);
end;


function HookDirect3D8 : boolean;
begin
  result := HookApiIAT('d3d8.dll', 'Direct3DCreate8', @Direct3DCreate8Callback, @Direct3DCreate8Next);
end;
Die Methode mit dem DrawTextA habe ich aus einem DirectX9 Buch für Delphi. Da ich die madCollection nicht besitze habe ich alles auf die uAllHook.pas umgeschrieben.

Das Problem. Ich starte das game, es stürtzt ab Ich kann nur Schließen klicken.
Du derefernzierst p2 einmal und weißt die Adresse von i zu. Das heißt p2 (also der Zeiger auf einen Zeiger) zeigt auf den Zeiger p1 welchen du so auf i zeigen lässt.
  Mit Zitat antworten Zitat