Discussion:
safeseh
(zu alt für eine Antwort)
Jens Kallup
2013-05-03 18:14:35 UTC
Permalink
Hallo Jungs,

erst Heute bemerke ich, das mein alter NewsServer den Betrieb
eingestellt hat und sicher daher nix mehr ankam.
Ok.
Ich habe eine Frage zu Structured Exception Handling (seh):
in C++ gibt es ja sowas wie

try
{
//code
} catch(...) { print error; }

ich arbeite unter windows mit den Yasm.exe und dort gibt es den Befehl:
"safeseh handler".

wie setze ich asm code ein, vielleicht auch noch verschachtelt, wie in
das Beispiel oben?

Gruß
Jens
Jan Seiffert
2013-05-04 15:43:01 UTC
Permalink
Post by Jens Kallup
Hallo Jungs,
erst Heute bemerke ich, das mein alter NewsServer den Betrieb eingestellt hat und sicher daher nix mehr ankam.
Ok.
in C++ gibt es ja sowas wie
try
{
//code
} catch(...) { print error; }
"safeseh handler".
wie setze ich asm code ein, vielleicht auch noch verschachtelt, wie in das Beispiel oben?
Keine ahnung wie das in ASM aussieht, aber nicht einfach....
http://msdn.microsoft.com/en-us/library/windows/desktop/ms680657%28v=vs.85%29.aspx

In Pseudocode könnte das so aussehen:

// catch devision by 0
LONG CALLBACK my_VectoredHandler(PEXCEPTION_POINTERS ei)
{
if(ei->ExceptionCode != EXCEPTION_INT_DEVIDE_BY_ZERO)
return EXCEPTION_CONTINUE_SEARCH;

ei->ExceptionAddress = handle_ex;
return EXCEPTION_CONTINUE_EXECUTION;
}

....
PVOID ex_handler = AddVectoredExceptionHandler(0, my_VectoredHandler);
// code
goto out;
handle_ex:
print error; // Problem ist jetzt wie man die Exception-info hier hin bekommt...
out:
RemoveVectoredExceptionHandler(ex_handler);
Post by Jens Kallup
Gruß
Jens
Gruss
Jan
Jens Kallup
2013-05-04 16:14:52 UTC
Permalink
Hallo Jan,

schön von dir zu hören!
ich habe ein wenig gespielt:

http://codepad.org/KuNMbi07

dort der _handler.
Allerdings weiss ich nicht wie exceptions
ausgelöst werden (überläufe zum beispiel)

oder throw foo(int);

Jens
Jan Seiffert
2013-05-04 16:55:25 UTC
Permalink
Post by Jens Kallup
Hallo Jan,
schön von dir zu hören!
http://codepad.org/KuNMbi07
Ähhhh, ne.
Du musst die Funktionen der Windows API aufrufen, so wie ich das in meinem Pseudo-Code
hatte, um deinen Exception-handler zu registrieren und wieder rauszunehmen.

Ausserdem darfst du aus dem aufgerufenen Calback nicht printf oder sowas aufrufen.
Du musst wie in meinem Pseudo-code die ausführung erstmal wieder in "normale"
gefilde umbiegen.
Post by Jens Kallup
dort der _handler.
Allerdings weiss ich nicht wie exceptions
ausgelöst werden (überläufe zum beispiel)
oder throw foo(int);
Also throw lässt sich warsch. so auslösen:
void WINAPI RaiseException(
_In_ DWORD dwExceptionCode,
_In_ DWORD dwExceptionFlags,
_In_ DWORD nNumberOfArguments,
_In_ const ULONG_PTR *lpArguments
);
http://msdn.microsoft.com/en-us/library/windows/desktop/ms680552%28v=vs.85%29.aspx

Ein paar andere sachen werden tippe ich mal einfach so vom OS ausgelöst
(sowas wie division durch 0, etc.). Oder man muss das noch von Hand anschalten...

Windows ist nicht so meine Welt..
Post by Jens Kallup
Jens
Gruss
Jan

Loading...