- Use _SEH2_YIELD when returning from an exception instead of returning outside the...
[reactos.git] / reactos / ntoskrnl / ke / i386 / usercall.c
index 71221e4..a07a055 100644 (file)
 
 #include <ntoskrnl.h>
 #define NDEBUG
-#include <internal/debug.h>
+#include <debug.h>
 
 extern PGDI_BATCHFLUSH_ROUTINE KeGdiFlushUserBatch;
 
 /* PRIVATE FUNCTIONS *********************************************************/
 
-_SEH_DEFINE_LOCALS(KiCopyInfo)
-{
-    volatile EXCEPTION_RECORD SehExceptRecord;
-};
-
-_SEH_FILTER(KiCopyInformation2)
-{
-    _SEH_ACCESS_LOCALS(KiCopyInfo);
-
-    /* Copy the exception records and return to the handler */
-    RtlCopyMemory((PVOID)&_SEH_VAR(SehExceptRecord),
-                  _SEH_GetExceptionPointers()->ExceptionRecord,
-                  sizeof(EXCEPTION_RECORD));
-    return EXCEPTION_EXECUTE_HANDLER;
-}
-
 /*++
  * @name KiInitializeUserApc
  *
@@ -70,7 +54,6 @@ KiInitializeUserApc(IN PKEXCEPTION_FRAME ExceptionFrame,
     ULONG_PTR Stack, AlignedEsp;
     ULONG ContextLength;
     EXCEPTION_RECORD SehExceptRecord;
-    _SEH_DECLARE_LOCALS(KiCopyInfo);
 
     /* Don't deliver APCs in V86 mode */
     if (TrapFrame->EFlags & EFLAGS_V86_MASK) return;
@@ -80,7 +63,7 @@ KiInitializeUserApc(IN PKEXCEPTION_FRAME ExceptionFrame,
     KeTrapFrameToContext(TrapFrame, ExceptionFrame, &Context);
 
     /* Protect with SEH */
-    _SEH_TRY
+    _SEH2_TRY
     {
         /* Sanity check */
         ASSERT((TrapFrame->SegCs & MODE_MASK) != KernelMode);
@@ -116,7 +99,7 @@ KiInitializeUserApc(IN PKEXCEPTION_FRAME ExceptionFrame,
         TrapFrame->EFlags = Ke386SanitizeFlags(Context.EFlags, UserMode);
 
         /* Check if thread has IOPL and force it enabled if so */
-        if (KeGetCurrentThread()->Iopl) TrapFrame->EFlags |= 0x3000;
+        if (KeGetCurrentThread()->Iopl) TrapFrame->EFlags |= EFLAGS_IOPL;
 
         /* Setup the stack */
         *(PULONG_PTR)(Stack + 0 * sizeof(ULONG_PTR)) = (ULONG_PTR)NormalRoutine;
@@ -124,17 +107,17 @@ KiInitializeUserApc(IN PKEXCEPTION_FRAME ExceptionFrame,
         *(PULONG_PTR)(Stack + 2 * sizeof(ULONG_PTR)) = (ULONG_PTR)SystemArgument1;
         *(PULONG_PTR)(Stack + 3 * sizeof(ULONG_PTR)) = (ULONG_PTR)SystemArgument2;
     }
-    _SEH_EXCEPT(KiCopyInformation2)
+    _SEH2_EXCEPT((RtlCopyMemory(&SehExceptRecord, _SEH2_GetExceptionInformation()->ExceptionRecord, sizeof(EXCEPTION_RECORD)), EXCEPTION_EXECUTE_HANDLER))
     {
         /* Dispatch the exception */
-        _SEH_VAR(SehExceptRecord).ExceptionAddress = (PVOID)TrapFrame->Eip;
+        SehExceptRecord.ExceptionAddress = (PVOID)TrapFrame->Eip;
         KiDispatchException(&SehExceptRecord,
                             ExceptionFrame,
                             TrapFrame,
                             UserMode,
                             TRUE);
     }
-    _SEH_END;
+    _SEH2_END;
 }
 
 /* PUBLIC FUNCTIONS **********************************************************/
@@ -152,7 +135,7 @@ KeUserModeCallback(IN ULONG RoutineIndex,
 {
     ULONG_PTR NewStack, OldStack;
     PULONG UserEsp;
-    NTSTATUS CallbackStatus = STATUS_SUCCESS;
+    NTSTATUS CallbackStatus;
     PEXCEPTION_REGISTRATION_RECORD ExceptionList;
     PTEB Teb;
     ULONG GdiBatchCount = 0;
@@ -164,7 +147,7 @@ KeUserModeCallback(IN ULONG RoutineIndex,
     OldStack = *UserEsp;
 
     /* Enter a SEH Block */
-    _SEH_TRY
+    _SEH2_TRY
     {
         /* Calculate and align the stack size */
         NewStack = (OldStack - ArgumentLength) & ~3;
@@ -206,13 +189,12 @@ KeUserModeCallback(IN ULONG RoutineIndex,
         /* Read the GDI Batch count */
         GdiBatchCount = Teb->GdiBatchCount;
     }
-    _SEH_HANDLE
+    _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
     {
         /* Get the SEH exception */
-        CallbackStatus = _SEH_GetExceptionCode();
+        _SEH2_YIELD(return _SEH2_GetExceptionCode());
     }
-    _SEH_END;
-    if (!NT_SUCCESS(CallbackStatus)) return CallbackStatus;
+    _SEH2_END;
 
     /* Check if we have GDI Batch operations */
     if (GdiBatchCount)