OldSchoolHack

Register / Login English

[DELPHI] d3d crosshair

icon Thread: [DELPHI] d3d crosshair

Join Date: Mar 2011

Posts: 16

Hi Leute,

Nach langem Suchen bin ich schließlich auf etwas brauchbares gestoßen:
TEXT Code:
  1.  
  2. (...)
  3. function CreateDeviceCallback(const Self: Pointer; Adapter: LongWord; DeviceType: TD3DDevType; hFocusWindow: HWND; BehaviorFlags: DWord; pPresentationParameters: PD3DPresentParameters; out ppReturnedDeviceInterface: IDirect3DDevice9) : HResult; stdcall;
  4. begin
  5. Result := CreateDeviceNext(Self, Adapter, DeviceType, hFocusWindow, BehaviorFlags, pPresentationParameters, ppReturnedDeviceInterface);
  6.  
  7. Callback.pD3D := ppReturnedDeviceInterface;
  8. Callback.Initialize();
  9.  
  10. // Hook EndScene
  11. if (Result = 0) and (@EndSceneNext = nil) then
  12. gHook.HookJMP(GetInterfaceMethod(ppReturnedDeviceInterface, 42), @EndSceneCallback, @EndSceneNext);
  13.  
  14. // Hook DrawIndexedPrimitive
  15. if (Result = 0) and (@DrawIndexedPrimitiveNext = nil) then
  16. gHook.HookJMP(GetInterfaceMethod(ppReturnedDeviceInterface, 82), @DrawIndexedPrimitiveCallback, @DrawIndexedPrimitiveNext);
  17. end;
  18.  
  19. function Direct3DCreate9Callback(SDKVersion: Cardinal): Pointer; stdcall;
  20. begin
  21. Result := Direct3DCreate9Next(SDKVersion);
  22.  
  23. // Hook CreateDevice
  24. if not(Result = nil) and (@CreateDeviceNext = nil) then
  25. gHook.HookJMP(GetPtrMethod(Result, 16), @CreateDeviceCallback, @CreateDeviceNext);
  26. end;
  27.  
  28. procedure DllMain(dwReason: DWord);
  29. begin
  30. if (dwReason = DLL_PROCESS_ATTACH) then
  31. begin
  32. gHook := CDeepHook.Create();
  33.  
  34. // Hook the interface.
  35. gHook.HookJMP(GetProcAddress(GetModuleHandle('d3d9.dll'), 'Direct3DCreate9'), @Direct3DCreate9Callback, @Direct3DCreate9Next);
  36. end;
  37. end;
  38.  
  39. begin
  40. DllProc := @DllMain;
  41. DllMain(DLL_PROCESS_ATTACH);
  42. end.
  43.  
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:
  1.  
  2. procedure DrawXhair (const Device: IDirect3DDevice9; color: D3DCOLOR);
  3. var
  4. viewP: D3DVIEWPORT9;
  5. ScreenCenterX,ScreenCenterY: DWORD;
  6. rec1,rec2: D3DRECT;
  7. begin
  8. Device.GetViewport(viewP);
  9. ScreenCenterX:= ((viewP.Width div 2) - 1);
  10. ScreenCenterY:= ((viewP.Height div 2) - 1);
  11.  
  12. rec1.x1:= ScreenCenterX-20;
  13. rec1.y1:= ScreenCenterY;
  14. rec1.x2:= ScreenCenterX+ 20;
  15. rec1.y2:= ScreenCenterY+1;
  16. rec2.x1:= ScreenCenterX;
  17. rec2.y1:= ScreenCenterY-20;
  18. rec2.x2:= ScreenCenterX+ 1;
  19. rec2.y2:= ScreenCenterY+20;
  20.  
  21. Device.Clear(1, @rec1, D3DCLEAR_TARGET, color, 0, 0);
  22. Device.Clear(1, @rec2, D3DCLEAR_TARGET, color, 0, 0);
  23. end;
  24.  

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:
  1.  
  2. function Direct3DCreate9Callback(SDKVersion: Cardinal): Pointer; stdcall;
  3. begin
  4. Result := Direct3DCreate9Next(SDKVersion);
  5. DrawXhair(Self, $ 0 0 0 0 f f f f ); //Farbe
  6.  
  7. (...)
  8. end;
  9.  

Wenn ich aber versuche das zu compilieren spuckt er mir "Undefinierter Bezeichner: 'Self' " aus.
Hoffe jemand kann mich auf den richtigen Weg bringen.