- Fix a build issue.
- Added more DBG checks for trap exits:
  * Detect if exiting with incorrect IF state.
  * Detect if exiting with broken stack.
  * Detect if exiting with a broken trap frame (note: Disabled in Kei386EoiHelper beause this raises the assertion. The trap frame is valid, it's just that some old code is using DbgArgMark for other purposes. Will fix.)
  * Detect if exiting with invalid FS.
  * Detect if exiting with invalid Exception List.
  * Detect if exiting with incorrect exception list and/or incorrect previmous mode on the stack (to detect macro/calling type mismatch).
The trap exit code is now complete and shareable across all 3 trap exit types, except for one broken assertion left to fix.
Modified: trunk/reactos/include/ndk/asm.h
Modified: trunk/reactos/ntoskrnl/ke/i386/exp.c
Modified: trunk/reactos/ntoskrnl/ke/i386/syscall.S

Modified: trunk/reactos/include/ndk/asm.h
--- trunk/reactos/include/ndk/asm.h	2006-01-16 21:41:19 UTC (rev 20922)
+++ trunk/reactos/include/ndk/asm.h	2006-01-16 22:07:38 UTC (rev 20923)
@@ -356,7 +356,9 @@
 //
 // NTSTATUS Codes
 //
+#ifdef __ASM__
 #define STATUS_INVALID_SYSTEM_SERVICE           0xC000001C
+#endif
 
 //
 // Generic Definitions

Modified: trunk/reactos/ntoskrnl/ke/i386/exp.c
--- trunk/reactos/ntoskrnl/ke/i386/exp.c	2006-01-16 21:41:19 UTC (rev 20922)
+++ trunk/reactos/ntoskrnl/ke/i386/exp.c	2006-01-16 22:07:38 UTC (rev 20923)
@@ -495,9 +495,6 @@
 
    ASSERT(ExceptionNr != 14);
 
-   /* Store the exception number in an unused field in the trap frame. */
-   Tf->DbgArgMark = ExceptionNr;
-
    /* Use the address of the trap frame as approximation to the ring0 esp */
    Esp0 = (ULONG)&Tf->Eip;
 

Modified: trunk/reactos/ntoskrnl/ke/i386/syscall.S
--- trunk/reactos/ntoskrnl/ke/i386/syscall.S	2006-01-16 21:41:19 UTC (rev 20922)
+++ trunk/reactos/ntoskrnl/ke/i386/syscall.S	2006-01-16 22:07:38 UTC (rev 20923)
@@ -484,13 +484,74 @@
 
 KiRosTrapReturn:
 // ========================= COMMON TRAP EXIT CODE ===================//
-    /* Restore exception list */
+#ifdef DBG
+    /* Assert the flags */
+    pushfd
+    pop edx
+    test edx, EFLAGS_INTERRUPT_MASK
+    jnz InvalidExitState
+
+    /* Assert the stack */
+    cmp esp, ebp
+    jnz InvalidExitState
+
+    /* Assert the trap frame */
+StateCheckDone:
+    sub dword ptr [esp+KTRAP_FRAME_DEBUGARGMARK], 0xBADB0D00
+    jnz InvalidTrapFrame
+
+    /* Assert FS */
+    mov bx, fs
+    cmp bx, KGDT_R0_PCR
+    jnz InvalidFs
+
+    /* Assert exception list */
+    cmp dword ptr fs:[KPCR_EXCEPTION_LIST], 0
+    jnz ExceptionListOK
+
+InvalidFs:
+    push -1
+    call _KeBugCheck@4
+
+InvalidTrapFrame:
+    add dword ptr [esp+KTRAP_FRAME_DEBUGARGMARK], 0xBADB0D00
+
+InvalidExitState:
+    int 3
+    jmp StateCheckDone
+
+ExceptionListOK:
+#endif
+
+    /* Get exception list */
     mov edx, [esp+KTRAP_FRAME_EXCEPTION_LIST]
+
+#ifdef DBG
+    /* Assert the saved exception list */
+    or edx, edx
+    jnz ListOk
+    int 3
+
+ListOk:
+#endif
+
+    /* Restore it */
     mov [fs:KPCR_EXCEPTION_LIST], edx
 
 // ==================== ONLY IF PREVIOUS MODE NEEDED ==================//
-    /* Restore previous mode */
+    /* Get previous mode */
     mov ecx, [esp+KTRAP_FRAME_PREVIOUS_MODE]
+
+#ifdef DBG
+    /* Assert the saved previous mode */
+    cmp ecx, -1
+    jnz ModeOk
+    int 3
+
+ModeOk:
+#endif
+
+    /* Restore the previous mode */
     mov esi, [fs:KPCR_CURRENT_THREAD]
     mov byte ptr [esi+KTHREAD_PREVIOUS_MODE], cl
 // ==================== END IF PREVIOUS MODE NEEDED ===================//
@@ -766,13 +827,74 @@
     jmp ApcLoop2
 
 KiRosTrapReturn2:
+#ifdef DBG
+    /* Assert the flags */
+    pushfd
+    pop edx
+    test edx, EFLAGS_INTERRUPT_MASK
+    jnz InvalidExitState2
 
-    /* Restore exception list */
+    /* Assert the stack */
+    cmp esp, ebp
+    jnz InvalidExitState2
+
+    /* Assert the trap frame */
+StateCheckDone2:
+    sub dword ptr [esp+KTRAP_FRAME_DEBUGARGMARK], 0xBADB0D00
+    jnz InvalidTrapFrame2
+
+    /* Assert FS */
+    mov bx, fs
+    cmp bx, KGDT_R0_PCR
+    jnz InvalidFs2
+
+    /* Assert exception list */
+    cmp dword ptr fs:[KPCR_EXCEPTION_LIST], 0
+    jnz ExceptionListOK2
+
+InvalidFs2:
+    push -1
+    call _KeBugCheck@4
+
+InvalidTrapFrame2:
+    add dword ptr [esp+KTRAP_FRAME_DEBUGARGMARK], 0xBADB0D00
+
+InvalidExitState2:
+    int 3
+    jmp StateCheckDone2
+
+ExceptionListOK2:
+#endif
+
+    /* Get exception list */
     mov edx, [esp+KTRAP_FRAME_EXCEPTION_LIST]
+
+#ifdef DBG
+    /* Assert the saved exception list */
+    or edx, edx
+    jnz ListOk2
+    int 3
+
+ListOk2:
+#endif
+
+    /* Restore it */
     mov [fs:KPCR_EXCEPTION_LIST], edx
 
+// ==================== ONLY IF PREVIOUS MODE NEEDED ==================//
+    /* Get previous mode */
+    mov ecx, [esp+KTRAP_FRAME_PREVIOUS_MODE]
+
+#ifdef DBG
+    /* Assert the saved previous mode */
+    cmp ecx, -1
+    jnz ModeOk2
+    int 3
+
+ModeOk2:
+#endif
+
     /* Restore previous mode */
-    mov ecx, [esp+KTRAP_FRAME_PREVIOUS_MODE]
     mov esi, [fs:KPCR_CURRENT_THREAD]
     mov byte ptr [esi+KTHREAD_PREVIOUS_MODE], cl
 
@@ -957,9 +1079,58 @@
     jmp ApcLoop3
 
 KiRosTrapReturn3:
+#ifdef DBG
+    /* Assert the flags */
+    pushfd
+    pop edx
+    test edx, EFLAGS_INTERRUPT_MASK
+    jnz InvalidExitState3
 
+    /* Assert the stack */
+    cmp esp, ebp
+    jnz InvalidExitState3
+
+    /* Assert the trap frame */
+StateCheckDone3:
+    //sub dword ptr [esp+KTRAP_FRAME_DEBUGARGMARK], 0xBADB0D00
+    //jnz InvalidTrapFrame3
+
+    /* Assert FS */
+    mov bx, fs
+    cmp bx, KGDT_R0_PCR
+    jnz InvalidFs3
+
+    /* Assert exception list */
+    cmp dword ptr fs:[KPCR_EXCEPTION_LIST], 0
+    jnz ExceptionListOK3
+
+InvalidFs3:
+    push -1
+    call _KeBugCheck@4
+
+InvalidTrapFrame3:
+    add dword ptr [esp+KTRAP_FRAME_DEBUGARGMARK], 0xBADB0D00
+
+InvalidExitState3:
+    int 3
+    jmp StateCheckDone3
+
+ExceptionListOK3:
+#endif
+
+    /* Get exception list */
+    mov edx, [esp+KTRAP_FRAME_EXCEPTION_LIST]
+
+#ifdef DBG
+    /* Assert the saved exception list */
+    or edx, edx
+    jnz ListOk3
+    int 3
+
+ListOk3:
+#endif
+
     /* Restore exception list */
-    mov edx, [esp+KTRAP_FRAME_EXCEPTION_LIST]
     mov [fs:KPCR_EXCEPTION_LIST], edx
 
     /* Check for V86 */