}
#endif
+/*
+ * @implemented
+ */
int
_abnormal_termination(void)
{
struct _CONTEXT;
+/*
+ * @implemented
+ */
EXCEPTION_DISPOSITION
_except_handler2(
struct _EXCEPTION_RECORD *ExceptionRecord,
return (EXCEPTION_DISPOSITION)0;
}
+/*
+ * @implemented
+ */
void __cdecl
_global_unwind2(PEXCEPTION_REGISTRATION RegistrationFrame)
{
KeTrapFrameToContext(KeGetCurrentThread()->TrapFrame, (Context)); \
}
-/*** Code below this line is shared with lib/ntdll/arch/ia32/exception.c - please keep in sync ***/
+#define SehpContinue(Context, TestAlert) \
+ ZwContinue(Context, TestAlert)
+
+/*** Code below this line is shared with lib/ntdll/rtl/i386/exception.c - please keep in sync ***/
VOID STDCALL
AsmDebug(ULONG Value)
DPRINT("RegistrationFrame is 0x%X\n", RegistrationFrame);
+ /* Check if there are any exception handlers at all. */
+ if ((ULONG_PTR)RegistrationFrame == (ULONG_PTR)-1)
+ {
+ ExceptionRecord->ExceptionFlags |= EXCEPTION_NONCONTINUABLE;
+ return ExceptionContinueExecution;
+ }
+
while ((ULONG_PTR)RegistrationFrame != (ULONG_PTR)-1)
{
EXCEPTION_RECORD ExceptionRecord2;
else
{
/* Copy the (possibly changed) context back to the trap frame and return */
- NtContinue(Context, FALSE);
+ SehpContinue(Context, FALSE);
return ExceptionContinueExecution;
}
}
ExceptionRecord->ExceptionFlags |= EXCEPTION_EXIT_UNWIND;
if (DispatcherContext > Temp)
- {
+ {
Temp = DispatcherContext;
- }
+ }
}
else /* if (ReturnValue == ExceptionCollidedUnwind) */
{
RtlRaiseException (& ExceptionRecord);
}
+/*
+ * @implemented
+ */
VOID STDCALL
RtlUnwind(PEXCEPTION_REGISTRATION RegistrationFrame,
PVOID ReturnAddress,
if (ERHead == RegistrationFrame)
{
DPRINT("Continueing execution\n");
- NtContinue(&Context, FALSE);
+ SehpContinue(&Context, FALSE);
return;
}
else
RegistrationFrame);
if ((ULONG_PTR)RegistrationFrame == (ULONG_PTR)-1)
- NtContinue(&Context, FALSE);
+ SehpContinue(&Context, FALSE);
else
NtRaiseException(pExceptRec, &Context, 0);
}