Hier ist ein einfacher Asm-Code, den ich in VC++ - Projekt eingefügt habe. return_addr ist die Rücksprungadresse des Stack-Frames. Ich habe eine StackWalk-Funktion (nicht von mir geschrieben codeproject.com/KB/threads/StackWalker.aspx), die StackWalk64() verwendet, um die Frames zu extrahieren. Details dazu sind nicht relevant. Unter Verwendung der Rücksprungadresse extrahiere ich ein einzelnes Byte aus dem Code der Funktion in dem Stapel, der gerade untersucht wird.Lesezugriffsverletzung in Assemblercode
__asm{
push eax
push ecx
mov eax, return_addr
mov cl, BYTE PTR [eax - 5] //Problem Statement
mov ret_5, cl
pop ecx
pop eax
}
Ich betreibe meinen Code zusammen mit anderen Anwendungen wie gtalk, vlc usw. Die Anwendung immer stürzt ab, wenn ich das Problem Statement enthalten. Wenn ich diese Anweisungen entferne, funktioniert alles gut. Ich habe einen Debugger ausgeführt und es bricht bei der Problem-Anweisung, die einen 0xzzzzzz-Fehler beim Lesen der Zugriffsverletzung anzeigt. Ich nehme an, dass die Anwendung versucht, den Code einiger eingeschränkter DLL- oder Codeabschnitte zu lesen, und das einen Fehler verursacht. Ich habe einen Versuch Catch Block, aber das hat nicht geholfen. Irgendwelche Vorschläge, was ich tun kann?
Können Sie klären, was mit "Rücksprungadresse des Stapelrahmens" gemeint ist? Es scheint wahrscheinlich, dass dies das Kernproblem ist, das Sie haben. –
0xzzzzzz? Wie wäre es mit der Buchung der IST-Adresse? –
@ Jonathan: Jeder Stapelrahmen hat eine Rücksprungadresse, an der das Steuerelement übertragen wird, sobald die Funktion beendet ist. Es befindet sich in der Anruferfunktion. – Bruce