Entwickler-Ecke
Algorithmen, Optimierung und Assembler - MakeProcInstance - 64bit - Methodenzeiger in Funktionszeiger
taxidriver - Di 27.09.11 16:31
Titel: MakeProcInstance - 64bit - Methodenzeiger in Funktionszeiger
Hallo zusammen,
einige von euch kennen bestimmt die Funktion einen
Methodenzeiger in Funktionszeiger umzuwandeln.
http://www.swissdelphicenter.ch/de/showcode.php?id=1671
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:
| function MakeProcInstance(M: TMethod): Pointer; begin GetMem(Result, 15); asm MOV BYTE PTR [EAX], $B9 MOV ECX, M.Data MOV DWORD PTR [EAX+$1], ECX MOV BYTE PTR [EAX+$5], $5A MOV BYTE PTR [EAX+$6], $51 MOV BYTE PTR [EAX+$7], $52 MOV BYTE PTR [EAX+$8], $B9 MOV ECX, M.Code MOV DWORD PTR [EAX+$9], ECX MOV BYTE PTR [EAX+$D], $FF MOV BYTE PTR [EAX+$E], $E1 end; end; |
Allerdings funktioniert das unter 64bit leider gar nicht mehr. Habe einiges rumprobiert und gelesen, aber ich bekomme es einfach nicht hin.
Die "Calling Conventions" haben sich unter 64bit geändert so das der alte Weg nicht mehr funktioniert. Bin aber nicht der Experte um zu verstehen was genau und wie die kleine Funktion umzubauen ist.
Kann mir einer vielleicht helfen oder hat bereits einer eine neue Lösung.
Moderiert von
Narses: Topic aus Windows API verschoben am Di 27.09.2011 um 17:14
jaenicke - Di 27.09.11 17:09
Hallo und :welcome:
Das wird so einfach eventuell gar nicht mehr gehen. Denn da hat sich schon eine Menge geändert. Klar ist: Ein Assemblerblock muss jetzt über die ganze Methode gehen ohne begin davor. Mischen mit Delphicode geht nicht.
Ich hatte hier mal eine Delphi-only Variante gepostet:
http://www.delphipraxis.net/160650-hook-fuehrt-zu-system-exception.html#5
Die Assemblerbefehle, die in den Speicherbereich geschrieben werden, müssten auf jeden Fall noch angepasst werden und ob es dann geht, keine Ahnung. Vielleicht schaue ich da einmal drüber, aber ich weiß noch nicht wann.
taxidriver - Di 27.09.11 18:13
:lol: danke, aber leider war ich soweit auch schon selber ... wollte aber das "orignal" so stehen lassen und als Ausgangspunkt für eine Lösung nehmen.
Wäre schade dort keine neue Lösung zu bekommen. Sonst muss ich einiges an meinem Projekt umbauen und erstmal umdenken. Hab diese Funktion sehr oft benutzt und dachte mal schnell mit dem 64bit Compiler kompiliert und los gehts...
das war wohl nichts :(
jaenicke - Di 27.09.11 18:19
Eins muss dir klar sein:
Selbst wenn du jetzt eine Lösung dafür findest / bekommst wirst du dann wieder basteln müssen, wenn du für andere Plattformen kompilieren möchtest. Sei es iOS, Android, oder auch irgendwann Windows 8 mit ARM.
Deshalb ist das so oder so keine gute Lösung.
Ich schaue aber dennoch mal, ob ich es bei mir zum Laufen bekomme.
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!