Rückgabe eines String durch ml64-asm

18/11/2009 - 17:47 von Dieter Bäumler | Report spam
Hi,

etwas scheint mit meinen Aufruf-/Rückgabekonventionen nicht zu stimmen, wenn
eine Routine in einer Unmanaged-DLL (x64-Assembler) eine Zeichenkette
zurückgeben soll, als UInt64 entgegen genommen klappz. Experimentell
übergebe ich an die Funktion einen String als Parameter, der 1:1
zurückkommen soll. Nach
mov rax,rcx
ret
stürzt aber vshost.exe ab, làsst man sich das Ergebnis der Funktion als
String geben. Irgendwo las ich, der Rückgabe-String sei ein "versteckter"
erster Parameter. In dem Fall wàre gar nichts erforderlich, weil der erste
Parameter (rcx) den Wert noch hat. Das verursacht eine GPF-Ausnahme, sowie
rax mit etwas anderem als 0 zurückkommt. Bei 0 ist der Rückgabestring NULL.
Sieht also schon danach aus, als sollte der Zeiger in rax stehen. Oder ein
Zeiger auf den Zeiger?

Grüße, dtr.
 

Lesen sie die antworten

#1 Immo Landwerth
18/11/2009 - 18:58 | Warnen spam
Dieter Bàumler wrote:

mov rax,rcx
ret
stürzt aber vshost.exe ab, làsst man sich das Ergebnis der Funktion als
String geben.



Ich habe nicht wirklich Ahnung von x64 Assembler, aber WinDbg zeigt mir,
dass diese Funktion

[MethodImpl(MethodImplOptions.NoInlining)]
private static string GetString(string str)
{
return str;
}

unter x64 so auschaut:

000007ff`00170170 488bc1 mov rax,rcx
000007ff`00170173 f3c3 rep ret

Vielleicht solltest Du dementsprechend Deinen Rücksprung àndern?

Andere Idee: Calling Convention falsch?

Kannst Du einfach mal den kompletten Code von Deiner Assembler
Deklaration posten?

Immo Landwerth

Ähnliche fragen