Join Date: Mar 2011
Posts: 16
|
Hi Leute,
Nach langem Suchen bin ich schließlich auf etwas brauchbares gestoßen:
TEXT Code: (...) function CreateDeviceCallback(const Self: Pointer; Adapter: LongWord; DeviceType: TD3DDevType; hFocusWindow: HWND; BehaviorFlags: DWord; pPresentationParameters: PD3DPresentParameters; out ppReturnedDeviceInterface: IDirect3DDevice9) : HResult; stdcall; begin Result := CreateDeviceNext(Self, Adapter, DeviceType, hFocusWindow, BehaviorFlags, pPresentationParameters, ppReturnedDeviceInterface); Callback.pD3D := ppReturnedDeviceInterface; Callback.Initialize(); // Hook EndScene if (Result = 0) and (@EndSceneNext = nil) then gHook.HookJMP(GetInterfaceMethod(ppReturnedDeviceInterface, 42), @EndSceneCallback, @EndSceneNext); // Hook DrawIndexedPrimitive if (Result = 0) and (@DrawIndexedPrimitiveNext = nil) then gHook.HookJMP(GetInterfaceMethod(ppReturnedDeviceInterface, 82), @DrawIndexedPrimitiveCallback, @DrawIndexedPrimitiveNext); end; function Direct3DCreate9Callback(SDKVersion: Cardinal): Pointer; stdcall; begin Result := Direct3DCreate9Next(SDKVersion); // Hook CreateDevice if not(Result = nil) and (@CreateDeviceNext = nil) then gHook.HookJMP(GetPtrMethod(Result, 16), @CreateDeviceCallback, @CreateDeviceNext); end; procedure DllMain(dwReason: DWord); begin if (dwReason = DLL_PROCESS_ATTACH) then begin gHook := CDeepHook.Create(); // Hook the interface. gHook.HookJMP(GetProcAddress(GetModuleHandle('d3d9.dll'), 'Direct3DCreate9'), @Direct3DCreate9Callback, @Direct3DCreate9Next); end; end; begin DllProc := @DllMain; DllMain(DLL_PROCESS_ATTACH); end.
Credit: "The Acid", "DeepBluaSea"
Das ist das Grundgerüst, wenn ich mich nicht irre. Jetzt habe ich noch eine Procedure zum zeichnen eines Fadenkreuzes:
TEXT Code: procedure DrawXhair (const Device: IDirect3DDevice9; color: D3DCOLOR); var viewP: D3DVIEWPORT9; ScreenCenterX,ScreenCenterY: DWORD; rec1,rec2: D3DRECT; begin Device.GetViewport(viewP); ScreenCenterX:= ((viewP.Width div 2) - 1); ScreenCenterY:= ((viewP.Height div 2) - 1); rec1.x1:= ScreenCenterX-20; rec1.y1:= ScreenCenterY; rec1.x2:= ScreenCenterX+ 20; rec1.y2:= ScreenCenterY+1; rec2.x1:= ScreenCenterX; rec2.y1:= ScreenCenterY-20; rec2.x2:= ScreenCenterX+ 1; rec2.y2:= ScreenCenterY+20; Device.Clear(1, @rec1, D3DCLEAR_TARGET, color, 0, 0); Device.Clear(1, @rec2, D3DCLEAR_TARGET, color, 0, 0); end;
Mein Problem ist jetzt, ich weiss nicht wo ich die Prozedur genau aufrufen muss, und ob das schon alles war. Wie gesagt ich will nur ein "simples" crosshair darstellen.
Rein Intuitiv würde ich die Prozedur hier aufrufen:
TEXT Code: function Direct3DCreate9Callback(SDKVersion: Cardinal): Pointer; stdcall; begin Result := Direct3DCreate9Next(SDKVersion); DrawXhair(Self, $ 0 0 0 0 f f f f ); //Farbe (...) end;
Wenn ich aber versuche das zu compilieren spuckt er mir "Undefinierter Bezeichner: 'Self' " aus. Hoffe jemand kann mich auf den richtigen Weg bringen.
|