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.
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.