MakeProcInstance - 64bit - Methodenzeiger in Funktionszeiger
spacer
Autor Nachricht
taxidriver
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Di 27.09.11 16:31 
Hallo zusammen,

einige von euch kennen bestimmt die Funktion einen Methodenzeiger in Funktionszeiger umzuwandeln.

www.swissdelphicente...showcode.php?id=1671

ausblenden Delphi-Quelltext markieren
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
// allocate memory
GetMem(Result, 15);
asm
// MOV ECX,
MOV BYTE PTR [EAX], $B9
MOV ECX, M.Data
MOV DWORD PTR [EAX+$1], ECX
// POP EDX
MOV BYTE PTR [EAX+$5], $5A
// PUSH ECX
MOV BYTE PTR [EAX+$6], $51
// PUSH EDX
MOV BYTE PTR [EAX+$7], $52
// MOV ECX,
MOV BYTE PTR [EAX+$8], $B9
MOV ECX, M.Code
MOV DWORD PTR [EAX+$9], ECX
// JMP 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 user profile iconNarses: Topic aus Windows API verschoben am Di 27.09.2011 um 17:14
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.


Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 15841
Erhaltene Danke: 741

XP, W7 x64 (Chrome, IE9, FF), Debian, (OSX 10.7)
RAD XE 2, Java (NB), C++, C# (VS 2010), JS/HTML, PHP, Lazarus
BeitragVerfasst: 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:
www.delphipraxis.net...tem-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.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
taxidriver Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Di 27.09.11 18:13 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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:
www.delphipraxis.net...tem-exception.html#5



: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 :(
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 15841
Erhaltene Danke: 741

XP, W7 x64 (Chrome, IE9, FF), Debian, (OSX 10.7)
RAD XE 2, Java (NB), C++, C# (VS 2010), JS/HTML, PHP, Lazarus
BeitragVerfasst: 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.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
home home