AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi DirectX-Hook: Wireframe funktioniert aber nicht DrawTextA
Thema durchsuchen
Ansicht
Themen-Optionen

DirectX-Hook: Wireframe funktioniert aber nicht DrawTextA

Ein Thema von napsterxx · begonnen am 4. Okt 2008 · letzter Beitrag vom 5. Okt 2008
Antwort Antwort
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
napsterxx

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

Re: DirectX-Hook: Wireframe funktioniert aber nicht DrawText

  Alt 5. Okt 2008, 09:21
*push*
Irgendjemand muss doch wissen was falsch ist
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
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#3

Re: DirectX-Hook: Wireframe funktioniert aber nicht DrawText

  Alt 5. Okt 2008, 12:54
Ganz blöde Vermutung: Du hookst erst das Create, rufst darin bereits das Zeichnen des Textes auf, hookst danach aber erst das Device, in dem der Font initialisiert wird. So lange der Font also nicht bereits vom Host erstellt wird, was ich erstmal nicht glaube, läufst du da einfach gesagt auf eine AV wenn ich die Reihenfolge der Ereignisse jetzt richtig bewerte.

Edit: Um selbst etwas zeichnen zu können, müsstest du imho auch eher den PageFilp (oder wie auch immer das Umschalten des Backbuffers zum Frontbuffer bei DX nun heisst ) hooken, da du ja ohnehin jeden Frame zeichnen musst. Da langt es natürlich nicht mehr wie beim Ändern des Renderstates es einfach einmalig zu machen.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:28 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz