Registriert seit: 18. Mär 2007
Ort: Borland
556 Beiträge
Delphi 7 Enterprise
|
DirectX-Hook: Wireframe funktioniert aber nicht DrawTextA
4. Okt 2008, 15: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.
|