Entwickler-Ecke
Algorithmen, Optimierung und Assembler - -
Avanel - Sa 29.01.11 00:42
Titel: -
----
BenBE - Sa 29.01.11 00:49
Crossposts bitte immer mit Link angeben ;-)
Bzgl. deiner Routine:
Kannst Du bitte von der gehookten Funktion den ASM-Source der ersten Zeilen mal geben? Auch bei deiner Prozedur: Wenn Du einen __thiscall haben willst: Wo ist der Instanz-Zeiger bei der Parameter-Übergabe?
Auch zerlegst Du Dir durch deine derzeitige Vermischung von ASM und Pascal höchstwahrscheinlich das Stackframe.
Avanel - Sa 29.01.11 01:02
~~~~
BenBE - Sa 29.01.11 02:03
Jeder ASM-Block in Delphi erzeugt eine Reihe von zusätzlichem ASM-Code, der in jeder Delphi-Version wechseln kann. Grad wenn man über die Register auf Sachen zugreift, hab ich's nicht erst einmal erlebt, dass der Compiler die Register dann genau woanders hingelegt hat.
Die einfachste Lösung hier wäre, den zusätzlichen Parameter für This als
const __this: Pointer; als erstes Argument mit anzugeben, wenn der auf'm Stack liegt, ODERdeinen Hook selber zu wrappen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| procedure Wrapper(p1, p2: DWORD); stdcall;
Procedure ActualFunc(__this: Pointer; P1, p2: DWORD); Begin end;
asm push ebp mov ebp, esp SUB esp, $0C
MOV EAX, DWORD PTR [EBP] MOV EDX, DWORD PTR [EBP+4] CALL ActualFunc
POP EBP end; |
Zum Aufruf der weitergeleiteten Funktion einfach ein Trampolin verwenden:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure CallThisfunc(F: Pointer; __this: Pointer; d1, d2: DWORD); asm PUSH ECX XCHG ECX, DWORD PTR [ESP+8] XCHG ECX, DWORD PTR [ESP] PUSH ECX XCHG ECX, EDX PUSH EAX end; |
Ist ungetestet, dürfte aber das Prinzip zeigen.
Avanel - Sa 29.01.11 02:39
------
Flamefire - Sa 29.01.11 11:11
Dein Problem liegt aber woanders: Es werden 2 Timestamps gepusht (wie du schon erkannt hast)
Also liegt nahe, dass die Funktion die Differenz der beiden berechnet um auf die vergangene Zeit zu kommen. Du verschiebst jetzt aber beide Timestamps um die gleiche Zeit --> Differenz ist gleich.
Fazit: Du darfst nur dwTime1 verschieben. BTW: Das Trunc bitte nach der Berechnung. Sonst kannst du nie die Zeit langsamer machen...
Avanel - Sa 29.01.11 21:54
----------
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!