Hallo,
Ich muss eine Funktion hooken, dessen Parameter halb über register und halb normal über den Stack übergeben werden.
1. Parameter in EAX
2. Parameter in EDI
3. Parameter in [ESP]
4. Parameter in [ESP+04]
Pseudo-Typedef:
procedure sub_WalkList(a1<eax>, a2<edi>, a3, a4: DWORD);
Wie setze ich nun am besten meinen Callback auf, sodass keine Parameter zerstört werden?
Zum testen habe ich folgendes probiert:
Delphi-Quellcode:
procedure Callback_WalkList(a3, a4: DWORD);
begin
new_WalkList(a3,a4);
end;
Da nichts in der Funktion gemacht wird, dachte ich, dass EAX und EDI unberührt bleiben würden. Aber anscheind irrte ich mich da.
Denn Delphi benutzt EAX um die Parameter auf den Stack zu pushen. :/
Hier beim Aufruf von new_WalkList()
Delphi-Quellcode:
01731A64 55 PUSH EBP
01731A65 8BEC MOV EBP,ESP
01731A67 8B45 0C MOV EAX,DWORD PTR SS:[EBP+C] // Parameter in EAX wird zerstört
01731A6A 50 PUSH EAX
01731A6B 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]
01731A6E 50 PUSH EAX
01731A6F FF15 44477301 CALL DWORD PTR DS:[1734744]
Wie verhindere ich nun, dass Delphi EAX für den Funktionsaufruf nutzt? :/
Den sonstigen Erhalt beider Register kann ich ja problemlos mit InlineASM per PUSH und POP vom/auf den Stack regeln.