Commit in reactos on KJKHyperion-RtlUnwind
ntoskrnl/Makefile+2-11.125.4.1 -> 1.125.4.2
        /Makefile.i386+4-11.16.24.1 -> 1.16.24.2
ntoskrnl/ke/i386/sysret.inc.S+63added 1.1.2.1
                /syscall.S+7-631.14.10.1 -> 1.14.10.2
ntoskrnl/ps/thread.c+6-21.124 -> 1.124.14.1
ntoskrnl/ps/i386/thread.asm+27added 1.1.2.1
lib/ntdll/rtl/i386/except.s-2911.3 removed
                  /exception.c-4461.7 removed
ntoskrnl/rtl/i386/except.s-2911.2 removed
+109-1095
2 added + 3 removed + 4 modified, total 9 files
 - finally removed the darn files from the right branch
 - implemented an alternate return path for certain system calls that absolutely, positively want the restored context to be copied verbatim from the trap frame
 - NtContinue is such a system call - coded a wrapper to follow the correct return path in case of success (more to come)

reactos/ntoskrnl
Makefile 1.125.4.1 -> 1.125.4.2
diff -u -r1.125.4.1 -r1.125.4.2
--- Makefile	27 Jun 2004 01:13:13 -0000	1.125.4.1
+++ Makefile	27 Jun 2004 22:11:20 -0000	1.125.4.2
@@ -1,4 +1,4 @@
-# $Id: Makefile,v 1.125.4.1 2004/06/27 01:13:13 hyperion Exp $
+# $Id: Makefile,v 1.125.4.2 2004/06/27 22:11:20 hyperion Exp $
 #
 # ReactOS Operating System
 #
@@ -58,6 +58,7 @@
 CFLAGS += $(STD_CFLAGS)
 ASFLAGS += $(STD_ASFLAGS)
 RCFLAGS += $(STD_RCFLAGS)
+NFLAGS += $(STD_NFLAGS)
 
 #
 # Build configuration

reactos/ntoskrnl
Makefile.i386 1.16.24.1 -> 1.16.24.2
diff -u -r1.16.24.1 -r1.16.24.2
--- Makefile.i386	25 Jun 2004 03:38:50 -0000	1.16.24.1
+++ Makefile.i386	27 Jun 2004 22:11:21 -0000	1.16.24.2
@@ -39,6 +39,9 @@
 	mm/i386/page.o \
 	mm/i386/pfault.o
 
+OBJECTS_PS_I386 := \
+	ps/i386/thread.o
+
 OBJECTS_RTL_I386 := \
 	rtl/i386/alldiv.o \
 	rtl/i386/allmul.o \
@@ -53,5 +56,5 @@
 
 RTL_EXCLUDE_FILTER := 
 
-OBJECTS_ARCH = $(OBJECTS_BOOT) $(OBJECTS_EX_I386) $(OBJECTS_KE_I386) $(OBJECTS_MM_I386) \
+OBJECTS_ARCH = $(OBJECTS_BOOT) $(OBJECTS_EX_I386) $(OBJECTS_KE_I386) $(OBJECTS_MM_I386) $(OBJECTS_PS_I386) \
   $(OBJECTS_RTL_I386)

reactos/ntoskrnl/ke/i386
sysret.inc.S added at 1.1.2.1
diff -N sysret.inc.S
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sysret.inc.S	27 Jun 2004 22:11:22 -0000	1.1.2.1
@@ -0,0 +1,63 @@
+#ifndef _KeSystemCallReturn2
+KeSystemCallReturn:
+#else
+KeSystemCallReturn2:
+#endif
+
+#if CHECKED
+           /*  Bump Service Counter  */
+#endif
+
+           /*  Deallocate the kernel stack frame  */
+           movl %ebp,%esp
+
+#ifndef _KeSystemCallReturn2
+KeReturnFromSystemCallWithHook:	
+#endif
+	   /* Call the post system call hook and deliver any pending APCs */
+	   pushl %esp
+	   pushl %eax
+	   call _KiAfterSystemCallHook
+	   addl $8,%esp
+
+#ifndef _KeSystemCallReturn2
+KeReturnFromSystemCall:
+#endif
+	
+           /* Restore the user context */
+	   /* Get a pointer to the current thread */
+           movl %fs:0x124, %esi
+	
+           /* Restore the old trap frame pointer */
+           movl 0x3c(%esp), %ebx
+	   movl %ebx, KTHREAD_TRAP_FRAME(%esi)
+	
+	   /* Skip debug information and unsaved registers */
+	   addl	$0x30, %esp
+	   popl %gs
+	   popl %es
+	   popl %ds
+	   popl %edx
+	   popl %ecx
+#ifndef _KeSystemCallReturn2
+	   addl $0x4, %esp   /* Don't restore eax */
+#else
+           popl %eax
+#endif
+
+	   /* Restore the old previous mode */
+	   popl %ebx
+	   movb %bl, %ss:KTHREAD_PREVIOUS_MODE(%esi)
+
+	   /* Restore the old exception handler list */
+	   popl %ebx
+	   movl %ebx, %fs:KPCR_EXCEPTION_LIST
+	
+	   popl %fs 
+	   popl %edi
+	   popl %esi
+	   popl %ebx
+	   popl %ebp
+	   addl $0x4, %esp  /* Ignore error code */
+		
+           iret

reactos/ntoskrnl/ke/i386
syscall.S 1.14.10.1 -> 1.14.10.2
diff -u -r1.14.10.1 -r1.14.10.2
--- syscall.S	25 Jun 2004 03:41:55 -0000	1.14.10.1
+++ syscall.S	27 Jun 2004 22:11:21 -0000	1.14.10.2
@@ -16,7 +16,7 @@
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
-/* $Id: syscall.S,v 1.14.10.1 2004/06/25 03:41:55 hyperion Exp $
+/* $Id: syscall.S,v 1.14.10.2 2004/06/27 22:11:21 hyperion Exp $
  *
  * FILE:            ntoskrnl/hal/x86/syscall.s
  * PURPOSE:         2E trap handler
@@ -38,6 +38,8 @@
  */
 .globl KeReturnFromSystemCall
 .globl KeReturnFromSystemCallWithHook
+.globl KeSystemCallReturn
+.globl KeSystemCallReturn2
 .globl _interrupt_handler2e
 _interrupt_handler2e:
 
@@ -173,20 +175,7 @@
            movl  %es:(%ecx, %eax, 4), %eax
            call  *%eax
 
-#if CHECKED
-           /*  Bump Service Counter  */
-#endif
-
-           /*  Deallocate the kernel stack frame  */
-           movl %ebp,%esp
-
-	   /* Call the post system call hook and deliver any pending APCs */
-	   pushl %ebp
-	   pushl %eax
-	   call _KiAfterSystemCallHook
-	   addl $8,%esp
-
-           jmp  KeReturnFromSystemCall
+           jmp   KeSystemCallReturn
 
 new_useShadowTable:
 
@@ -237,52 +226,7 @@
            movl  %es:(%ecx, %eax, 4), %eax
            call  *%eax
 
-#if CHECKED
-           /*  Bump Service Counter  */
-#endif
-
-           /*  Deallocate the kernel stack frame  */
-           movl %ebp,%esp
+#include "sysret.inc.S"
 
-KeReturnFromSystemCallWithHook:	
-	   /* Call the post system call hook and deliver any pending APCs */
-	   pushl %esp
-	   pushl %eax
-	   call _KiAfterSystemCallHook
-	   addl $8,%esp
-
-KeReturnFromSystemCall:
-	
-           /* Restore the user context */
-	   /* Get a pointer to the current thread */
-           movl %fs:0x124, %esi
-	
-           /* Restore the old trap frame pointer */
-           movl 0x3c(%esp), %ebx
-	   movl %ebx, KTHREAD_TRAP_FRAME(%esi)
-	
-	   /* Skip debug information and unsaved registers */
-	   addl	$0x30, %esp
-	   popl %gs
-	   popl %es
-	   popl %ds
-	   popl %edx
-	   popl %ecx
-	   addl $0x4, %esp   /* Don't restore eax */
-
-	   /* Restore the old previous mode */
-	   popl %ebx
-	   movb %bl, %ss:KTHREAD_PREVIOUS_MODE(%esi)
-
-	   /* Restore the old exception handler list */
-	   popl %ebx
-	   movl %ebx, %fs:KPCR_EXCEPTION_LIST
-	
-	   popl %fs 
-	   popl %edi
-	   popl %esi
-	   popl %ebx
-	   popl %ebp
-	   addl $0x4, %esp  /* Ignore error code */
-		
-           iret
+#define _KeSystemCallReturn2
+#include "sysret.inc.S"

reactos/ntoskrnl/ps
thread.c 1.124 -> 1.124.14.1
diff -u -r1.124 -r1.124.14.1
--- thread.c	5 Jan 2004 14:28:21 -0000	1.124
+++ thread.c	27 Jun 2004 22:11:22 -0000	1.124.14.1
@@ -1,4 +1,4 @@
-/* $Id: thread.c,v 1.124 2004/01/05 14:28:21 weiden Exp $
+/* $Id: thread.c,v 1.124.14.1 2004/06/27 22:11:22 hyperion Exp $
  *
  * COPYRIGHT:              See COPYING in the top level directory
  * PROJECT:                ReactOS kernel
@@ -722,7 +722,7 @@
 }
 
 NTSTATUS STDCALL
-NtContinue(IN PCONTEXT	Context,
+KeRosContinue(IN PCONTEXT	Context,
 	   IN BOOLEAN TestAlert)
 {
    PKTRAP_FRAME TrapFrame;
@@ -739,6 +739,10 @@
 	KEBUGCHECK(0);
      }
    KeContextToTrapFrame(Context, TrapFrame);
+
+   if(TestAlert)
+    KiTestAlert();
+
    return(STATUS_SUCCESS);
 }
 

reactos/ntoskrnl/ps/i386
thread.asm added at 1.1.2.1
diff -N thread.asm
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ thread.asm	27 Jun 2004 22:11:22 -0000	1.1.2.1
@@ -0,0 +1,27 @@
+cpu 486
+segment .text use32
+
+extern _KeRosContinue@8
+extern KeSystemCallReturn
+extern KeSystemCallReturn2
+
+global _NtContinue@8
+_NtContinue@8:
+ ; Make KeRosContinue "return forwards" to our .ret label. This will take care
+ ; of resetting the stack to the address KeSystemCallReturn[2] expects
+ mov [esp], dword .ret
+
+ ; Call the real function (see ps\thread.c)
+ jmp _KeRosContinue@8
+
+.ret
+ ; Test the return value
+ cmp eax, 0
+
+ ; Success: return without overwriting EAX with the return value
+ jge KeSystemCallReturn2
+
+ ; Failure: normal return
+ jmp KeSystemCallReturn
+
+; EOF

reactos/lib/ntdll/rtl/i386
except.s removed after 1.3
diff -N except.s
--- except.s	7 May 2003 18:45:56 -0000	1.3
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,291 +0,0 @@
-/* $Id: except.s,v 1.3 2003/05/07 18:45:56 ekohl Exp $
- *
- * COPYRIGHT:         See COPYING in the top level directory
- * PROJECT:           ReactOS kernel
- * PURPOSE:           User-mode exception support for IA-32
- * FILE:              lib/ntdll/rtl/i386/except.s
- * PROGRAMER:         Casper S. Hornstrup (chorns@users.sourceforge.net)
- * NOTES:             This file is shared with ntoskrnl/rtl/i386/except.s.
- *                    Please keep them in sync.
- */
-
-#define EXCEPTION_UNWINDING		0x02
-
-#define EREC_FLAGS				0x04
-
-#define ExceptionContinueExecution 0
-#define ExceptionContinueSearch    1
-#define ExceptionNestedException   2
-#define ExceptionCollidedUnwind    3
-
-.globl _RtlpExecuteHandlerForException
-.globl _RtlpExecuteHandlerForUnwind
-
-#define CONTEXT_FLAGS	0x00
-#define CONTEXT_SEGGS	0x8C
-#define CONTEXT_SEGFS	0x90
-#define CONTEXT_SEGES	0x94
-#define CONTEXT_SEGDS	0x98
-#define CONTEXT_EDI		0x9C
-#define CONTEXT_ESI		0xA0
-#define CONTEXT_EBX		0xA4
-#define CONTEXT_EDX		0xA8
-#define CONTEXT_ECX		0xAC
-#define CONTEXT_EAX		0xB0
-#define CONTEXT_EBP		0xB4
-#define CONTEXT_EIP		0xB8
-#define CONTEXT_SEGCS	0xBC
-#define CONTEXT_EFLAGS	0xC0
-#define CONTEXT_ESP		0xC4
-#define CONTEXT_SEGSS	0xC8
-
-
-#define RCC_CONTEXT		0x08
-
-// EAX = value to print
-_do_debug:
-	pushal
-	pushl	%eax
-	call	_AsmDebug@4
-	popal
-	ret
-
-#ifndef __NTOSKRNL__
-
-//
-// VOID
-// RtlpCaptureContext(PCONTEXT pContext);
-//
-// Parameters:
-//   [ESP+08h] - PCONTEXT_X86 pContext
-// Registers:
-//   None
-// Returns:
-//   Nothing
-// Notes:
-//   Grabs the current CPU context.
-.globl _RtlpCaptureContext
-_RtlpCaptureContext:
-	pushl   %ebp
-    movl	%esp, %ebp
-	movl	RCC_CONTEXT(%ebp), %edx		// EDX = Address of context structure
-
-	cld
-	pushf
-	pop		%eax
-	movl	%eax, CONTEXT_EFLAGS(%edx)
-	xorl	%eax, %eax
-	movl	%eax, CONTEXT_EAX(%edx)
-	movl	%eax, CONTEXT_EBX(%edx)
-	movl	%eax, CONTEXT_ECX(%edx)
-	movl	%eax, CONTEXT_EDX(%edx)
-	movl	%eax, CONTEXT_ESI(%edx)
-	movl	%eax, CONTEXT_EDI(%edx)
-	movl	%cs, %eax
-	movl	%eax, CONTEXT_SEGCS(%edx)
-	movl	%ds, %eax
-	movl	%eax, CONTEXT_SEGDS(%edx)
-	movl	%es, %eax
-	movl	%eax, CONTEXT_SEGES(%edx)
-	movl	%fs, %eax
-	movl	%eax, CONTEXT_SEGFS(%edx)
-	movl	%gs, %eax
-	movl	%eax, CONTEXT_SEGGS(%edx)
-	movl	%ss, %eax
-	movl	%eax, CONTEXT_SEGSS(%edx)
-
-	//
-	// STACK LAYOUT: - (ESP to put in context structure)
-	//               - RETURN ADDRESS OF CALLER OF CALLER
-	//               - EBP OF CALLER OF CALLER
-	//                 ...
-	//               - RETURN ADDRESS OF CALLER
-	//               - EBP OF CALLER
-	//                 ...
-	//
-
-	// Get return address of the caller of the caller of this function
-	movl	%ebp, %ebx
-	//movl	4(%ebx), %eax			// EAX = return address of caller
-	movl	(%ebx), %ebx			// EBX = EBP of caller
-
-	movl	4(%ebx), %eax			// EAX = return address of caller of caller
-	movl	(%ebx), %ebx			// EBX = EBP of caller of caller
-
-	movl	%eax, CONTEXT_EIP(%edx)	// EIP = return address of caller of caller
-	movl	%ebx, CONTEXT_EBP(%edx)	// EBP = EBP of caller of caller
-	addl	$8, %ebx
-	movl	%ebx, CONTEXT_ESP(%edx)	// ESP = EBP of caller of caller + 8
-
-    movl	%ebp, %esp
-    popl	%ebp
-    ret
-
-#endif /* !__NTOSKRNL__ */
-
-#define REH_ERECORD		0x08
-#define REH_RFRAME		0x0C
-#define REH_CONTEXT		0x10
-#define REH_DCONTEXT	0x14
-#define REH_EROUTINE	0x18
-
-// Parameters:
-//   None
-// Registers:
-//   [EBP+08h] - PEXCEPTION_RECORD ExceptionRecord
-//   [EBP+0Ch] - PEXCEPTION_REGISTRATION RegistrationFrame
-//   [EBP+10h] - PVOID Context
-//   [EBP+14h] - PVOID DispatcherContext
-//   [EBP+18h] - PEXCEPTION_HANDLER ExceptionRoutine
-//   EDX       - Address of protecting exception handler
-// Returns:
-//   EXCEPTION_DISPOSITION
-// Notes:
-//   Setup the protecting exception handler and call the exception
-//   handler in the right context.
-_RtlpExecuteHandler:
-	pushl    %ebp
-    movl     %esp, %ebp
-    pushl    REH_RFRAME(%ebp)
-
-    pushl    %edx
-    pushl    %fs:0x0
-    movl     %esp, %fs:0x0
-
-    // Prepare to call the exception handler
-    pushl    REH_DCONTEXT(%ebp)
-    pushl    REH_CONTEXT(%ebp)
-    pushl    REH_RFRAME(%ebp)
-    pushl    REH_ERECORD(%ebp)
-
-    // Now call the exception handler
-    movl     REH_EROUTINE(%ebp), %eax
-    call    *%eax
-
-	cmpl	$-1, %fs:0x0
-	jne		.reh_stack_looks_ok
-
-	// This should not happen
-	pushl	0
-	pushl	0
-	pushl	0
-	pushl	0
-	call	_RtlAssert@16
-
-.reh_loop:
-	jmp	.reh_loop
-
-.reh_stack_looks_ok:
-    movl     %fs:0x0, %esp
-
-    // Return to the 'front-end' for this function
-    popl     %fs:0x0
-    movl     %ebp, %esp
-    popl     %ebp
-    ret
-
-
-#define REP_ERECORD     0x04
-#define REP_RFRAME      0x08
-#define REP_CONTEXT     0x0C
-#define REP_DCONTEXT    0x10
-
-// Parameters:
-//   [ESP+04h] - PEXCEPTION_RECORD ExceptionRecord
-//   [ESP+08h] - PEXCEPTION_REGISTRATION RegistrationFrame
-//   [ESP+0Ch] - PCONTEXT Context
-//   [ESP+10h] - PVOID DispatcherContext
-// Registers:
-//   None
-// Returns:
-//   EXCEPTION_DISPOSITION
-// Notes:
-//    This exception handler protects the exception handling
-//    mechanism by detecting nested exceptions.
-_RtlpExceptionProtector:
-    movl     $ExceptionContinueSearch, %eax
-    movl     REP_ERECORD(%esp), %ecx
-    testl    $EXCEPTION_UNWINDING, EREC_FLAGS(%ecx)
-    jnz      .rep_end
-
-    // Unwinding is not taking place, so return ExceptionNestedException
-
-    // Set DispatcherContext field to the exception registration for the
-    // exception handler that executed when a nested exception occurred
-    movl     REP_DCONTEXT(%esp), %ecx
-    movl     REP_RFRAME(%esp), %eax
-    movl     %eax, (%ecx)
-    movl     $ExceptionNestedException, %eax
-
-.rep_end:
-    ret
-
-
-// Parameters:
-//   [ESP+04h] - PEXCEPTION_RECORD ExceptionRecord
-//   [ESP+08h] - PEXCEPTION_REGISTRATION RegistrationFrame
-//   [ESP+0Ch] - PCONTEXT Context
-//   [ESP+10h] - PVOID DispatcherContext
-//   [ESP+14h] - PEXCEPTION_HANDLER ExceptionHandler
-// Registers:
-//   None
-// Returns:
-//   EXCEPTION_DISPOSITION
-// Notes:
-//   Front-end
-_RtlpExecuteHandlerForException:
-    movl     $_RtlpExceptionProtector, %edx
-    jmp      _RtlpExecuteHandler
-
-
-#define RUP_ERECORD     0x04
-#define RUP_RFRAME      0x08
-#define RUP_CONTEXT     0x0C
-#define RUP_DCONTEXT    0x10
-
-// Parameters:
-//   [ESP+04h] - PEXCEPTION_RECORD ExceptionRecord
-//   [ESP+08h] - PEXCEPTION_REGISTRATION RegistrationFrame
-//   [ESP+0Ch] - PCONTEXT Context
-//   [ESP+10h] - PVOID DispatcherContext
-// Registers:
-//   None
-// Returns:
-//   EXCEPTION_DISPOSITION
-// Notes:
-//    This exception handler protects the exception handling
-//    mechanism by detecting collided unwinds.
-_RtlpUnwindProtector:
-    movl     $ExceptionContinueSearch, %eax
-    movl     %ecx, RUP_ERECORD(%esp)
-    testl    $EXCEPTION_UNWINDING, EREC_FLAGS(%ecx)
-    jz       .rup_end
-
-    // Unwinding is taking place, so return ExceptionCollidedUnwind
-
-    movl     RUP_RFRAME(%esp), %ecx
-    movl     RUP_DCONTEXT(%esp), %edx
-
-    // Set DispatcherContext field to the exception registration for the
-    // exception handler that executed when a collision occurred
-    movl     RUP_RFRAME(%ecx), %eax
-    movl     %eax, (%edx)
-    movl     $ExceptionCollidedUnwind, %eax
-
-.rup_end:
-    ret
-
-
-// Parameters:
-//   [ESP+04h] - PEXCEPTION_RECORD ExceptionRecord
-//   [ESP+08h] - PEXCEPTION_REGISTRATION RegistrationFrame
-//   [ESP+0Ch] - PCONTEXT Context
-//   [ESP+10h] - PVOID DispatcherContext
-//   [ESP+14h] - PEXCEPTION_HANDLER ExceptionHandler
-// Registers:
-//   None
-// Returns:
-//   EXCEPTION_DISPOSITION
-_RtlpExecuteHandlerForUnwind:
-    movl     $_RtlpUnwindProtector, %edx
-    jmp      _RtlpExecuteHandler

reactos/lib/ntdll/rtl/i386
exception.c removed after 1.7
diff -N exception.c
--- exception.c	9 Apr 2004 20:03:13 -0000	1.7
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,446 +0,0 @@
-/* $Id: exception.c,v 1.7 2004/04/09 20:03:13 navaraf Exp $
- *
- * COPYRIGHT:         See COPYING in the top level directory
- * PROJECT:           ReactOS kernel
- * PURPOSE:           User-mode exception support for IA-32
- * FILE:              lib/ntdll/rtl/i386/exception.c
- * PROGRAMER:         Casper S. Hornstrup (chorns@users.sourceforge.net)
- */
-
-/* INCLUDES *****************************************************************/
-
-#include <ddk/ntddk.h>
-#include <windows.h>
-#include <string.h>
-
-#define NDEBUG
-#include <debug.h>
-
-/* FUNCTIONS ***************************************************************/
-
-/* Implemented in except.s */
-
-VOID
-RtlpCaptureContext(PCONTEXT pContext);
-
-/* Macros that will help streamline the SEH implementations for
-   kernel mode and user mode */
-
-#define SehpGetStackLimits(StackBase, StackLimit) \
-{ \
-	(*(StackBase)) = NtCurrentTeb()->Tib->StackBase; \
-	(*(StackLimit)) = NtCurrentTeb()->Tib->StackLimit; \
-}
-
-#define SehpGetExceptionList() \
-	(PEXCEPTION_REGISTRATION)(NtCurrentTeb()->Tib.ExceptionList)
-
-#define SehpSetExceptionList(NewExceptionList) \
-	NtCurrentTeb()->Tib.ExceptionList = (PVOID)(NewExceptionList)
-
-#define SehpCaptureContext(Context) \
-{ \
-	RtlpCaptureContext(Context); \
-}
-
-#define SehpContinue(Context, TestAlert) \
-	NtContinue(Context, TestAlert)
-
-/*** Code below this line is shared with ntoskrnl/rtl/i386/exception.c - please keep in sync ***/
-
-VOID STDCALL
-AsmDebug(ULONG Value)
-{
-  DbgPrint("Value 0x%.08x\n", Value);
-}
-
-
-/* Declare a few prototypes for the functions in except.s */
-
-EXCEPTION_DISPOSITION
-RtlpExecuteHandlerForException(
-  PEXCEPTION_RECORD ExceptionRecord,
-  PEXCEPTION_REGISTRATION RegistrationFrame,
-  PCONTEXT Context,
-  PVOID DispatcherContext,
-  PEXCEPTION_HANDLER ExceptionHandler);
-
-EXCEPTION_DISPOSITION
-RtlpExecuteHandlerForUnwind(
-  PEXCEPTION_RECORD ExceptionRecord,
-  PEXCEPTION_REGISTRATION RegistrationFrame,
-  PCONTEXT Context,
-  PVOID DispatcherContext,
-  PEXCEPTION_HANDLER ExceptionHandler);
-
-
-#ifndef NDEBUG
-
-VOID RtlpDumpExceptionRegistrations(VOID)
-{
-  PEXCEPTION_REGISTRATION Current;
-
-  DbgPrint("Dumping exception registrations:\n");
-
-  Current = SehpGetExceptionList();
-
-  if ((ULONG_PTR)Current != -1)
-  {
-    while ((ULONG_PTR)Current != -1)
-    {
-      DbgPrint("   (0x%08X)   HANDLER (0x%08X)\n", Current, Current->handler);
-      Current = Current->prev;
-    }
-    DbgPrint("   End-Of-List\n");
-  } else {
-    DbgPrint("   No exception registrations exists.\n");
-  }
-}
-
-#endif /* NDEBUG */
-
-ULONG
-RtlpDispatchException(IN PEXCEPTION_RECORD  ExceptionRecord,
-	IN PCONTEXT  Context)
-{
-  PEXCEPTION_REGISTRATION RegistrationFrame;
-  DWORD DispatcherContext;
-  DWORD ReturnValue;
-
-  DPRINT("RtlpDispatchException()\n");
-
-#ifndef NDEBUG
-  RtlpDumpExceptionRegistrations();
-#endif /* NDEBUG */
-
-  RegistrationFrame = SehpGetExceptionList();
- 
-  DPRINT("RegistrationFrame is 0x%X\n", RegistrationFrame);
-
-  while ((ULONG_PTR)RegistrationFrame != -1)
-  {
-    EXCEPTION_RECORD ExceptionRecord2;
-    DWORD Temp = 0;
-    //PVOID RegistrationFrameEnd = (PVOID)RegistrationFrame + 8;
-
-    // Make sure the registration frame is located within the stack
-
-    DPRINT("Error checking\n");
-#if 0
-    if (Teb->Tib.StackBase > RegistrationFrameEnd)
-    {
-      DPRINT("Teb->Tib.StackBase (0x%.08x) > RegistrationFrameEnd (0x%.08x)\n",
-        Teb->Tib.StackBase, RegistrationFrameEnd);
-      ExceptionRecord->ExceptionFlags |= EXCEPTION_STACK_INVALID;
-      return ExceptionContinueExecution;
-    }
-    // FIXME: Stack top, correct?
-    if (Teb->Tib.StackLimit < RegistrationFrameEnd)
-    {
-      DPRINT("Teb->Tib.StackLimit (0x%.08x) > RegistrationFrameEnd (0x%.08x)\n",
-        Teb->Tib.StackLimit, RegistrationFrameEnd);
-      ExceptionRecord->ExceptionFlags |= EXCEPTION_STACK_INVALID;
-      return ExceptionContinueExecution;
-    }
- 
-    // Make sure stack is DWORD aligned
-    if ((ULONG_PTR)RegistrationFrame & 3)
-    {
-      DPRINT("RegistrationFrameEnd (0x%.08x) is not DWORD aligned.\n",
-        RegistrationFrameEnd);
-      ExceptionRecord->ExceptionFlags |= EXCEPTION_STACK_INVALID;
-      return ExceptionContinueExecution;
-    }
-#endif
-
-#if 0
-    /* FIXME: */
-    if (someFlag)
-      RtlpLogLastExceptionDisposition( hLog, retValue );
-#endif
-
-    DPRINT("Calling handler at 0x%X\n", RegistrationFrame->handler);
-    DPRINT("ExceptionRecord 0x%X\n", ExceptionRecord);
-    DPRINT("RegistrationFrame 0x%X\n", RegistrationFrame);
-    DPRINT("Context 0x%X\n", Context);
-    DPRINT("&DispatcherContext 0x%X\n", &DispatcherContext);
-
-    ReturnValue = RtlpExecuteHandlerForException(
-      ExceptionRecord,
-      RegistrationFrame,
-      Context,
-      &DispatcherContext,
-      RegistrationFrame->handler);
-#ifdef DEBUG
-    DPRINT("Exception handler said 0x%X\n", ReturnValue);
-	DPRINT("RegistrationFrame == 0x%.08x\n", RegistrationFrame);
-	{
-		PULONG sp = (PULONG)((PVOID)RegistrationFrame - 0x08);
-		DPRINT("StandardESP == 0x%.08x\n", sp[0]);
-		DPRINT("Exception Pointers == 0x%.08x\n", sp[1]);
-		DPRINT("PrevFrame == 0x%.08x\n", sp[2]);
-		DPRINT("Handler == 0x%.08x\n", sp[3]);
-		DPRINT("ScopeTable == 0x%.08x\n", sp[4]);
-		DPRINT("TryLevel == 0x%.08x\n", sp[5]);
-		DPRINT("EBP == 0x%.08x\n", sp[6]);
-	}
-#endif
-    if (RegistrationFrame == NULL)
-    {
-      ExceptionRecord->ExceptionFlags &= ~EXCEPTION_NESTED_CALL;  // Turn off flag
-    }
-
-    if (ReturnValue == ExceptionContinueExecution)
-    {
-      DPRINT("ReturnValue == ExceptionContinueExecution\n");
-      if (ExceptionRecord->ExceptionFlags & EXCEPTION_NONCONTINUABLE)
-      {
-        DPRINT("(ExceptionRecord->ExceptionFlags & EXCEPTION_NONCONTINUABLE) == TRUE\n");
-
-        ExceptionRecord2.ExceptionRecord = ExceptionRecord;
-        ExceptionRecord2.ExceptionCode = STATUS_NONCONTINUABLE_EXCEPTION;
-        ExceptionRecord2.ExceptionFlags = EXCEPTION_NONCONTINUABLE;
-        ExceptionRecord2.NumberParameters = 0;
-        RtlRaiseException(&ExceptionRecord2);
-      }
-      else
-      {
-        /* Copy the (possibly changed) context back to the trap frame and return */
-        SehpContinue(Context, FALSE);
-        return ExceptionContinueExecution;
-      }
-    }
-    else if (ReturnValue == ExceptionContinueSearch)
-    {
-      DPRINT("ReturnValue == ExceptionContinueSearch\n");
-
-      /* Nothing to do here */
-    }
-    else if (ReturnValue == ExceptionNestedException)
-    {
-      DPRINT("ReturnValue == ExceptionNestedException\n");
-
-      ExceptionRecord->ExceptionFlags |= EXCEPTION_EXIT_UNWIND;
-      if (DispatcherContext > Temp)
-	  {
-          Temp = DispatcherContext;
-	  }
-    }
-    else /* if (ReturnValue == ExceptionCollidedUnwind) */
-    {
-      DPRINT("ReturnValue == ExceptionCollidedUnwind or unknown\n");
-
-      ExceptionRecord2.ExceptionRecord = ExceptionRecord;
-      ExceptionRecord2.ExceptionCode = STATUS_INVALID_DISPOSITION;
-      ExceptionRecord2.ExceptionFlags = EXCEPTION_NONCONTINUABLE;
-      ExceptionRecord2.NumberParameters = 0;
-      RtlRaiseException(&ExceptionRecord2);
-    }
-
-    RegistrationFrame = RegistrationFrame->prev;  // Go to previous frame
-  }
- 
-  /* No exception handler will handle this exception */
-
-  DPRINT("RtlpDispatchException(): Return ExceptionContinueExecution\n");
-
-  return ExceptionContinueExecution;  
-}
-
-/*
- * @implemented
- */
-VOID STDCALL
-RtlRaiseStatus(NTSTATUS Status)
-{
-  EXCEPTION_RECORD ExceptionRecord;
-
-  DPRINT("RtlRaiseStatus(Status 0x%.08x)\n", Status);
-
-  ExceptionRecord.ExceptionCode    = Status;
-  ExceptionRecord.ExceptionRecord  = NULL;
-  ExceptionRecord.NumberParameters = 0;
-  ExceptionRecord.ExceptionFlags   = EXCEPTION_NONCONTINUABLE;
-  RtlRaiseException (& ExceptionRecord);
-}
-
-/*
- * @implemented
- */
-VOID STDCALL
-RtlUnwind(PEXCEPTION_REGISTRATION RegistrationFrame,
-  PVOID ReturnAddress,
-  PEXCEPTION_RECORD ExceptionRecord,
-  DWORD EaxValue)
-{
-  PEXCEPTION_REGISTRATION ERHead;
-  PEXCEPTION_RECORD pExceptRec;
-  EXCEPTION_RECORD TempER;    
-  CONTEXT Context;
-
-  DPRINT("RtlUnwind(). RegistrationFrame 0x%X\n", RegistrationFrame);
-
-#ifndef NDEBUG
-  RtlpDumpExceptionRegistrations();
-#endif /* NDEBUG */
-
-  ERHead = SehpGetExceptionList();
- 
-  DPRINT("ERHead is 0x%X\n", ERHead);
-
-  if (ExceptionRecord == NULL) // The normal case
-  {
-	DPRINT("ExceptionRecord == NULL (normal)\n");
-
-    pExceptRec = &TempER;
-    pExceptRec->ExceptionFlags = 0;
-    pExceptRec->ExceptionCode = STATUS_UNWIND;
-    pExceptRec->ExceptionRecord = NULL;
-    pExceptRec->ExceptionAddress = ReturnAddress;
-    pExceptRec->ExceptionInformation[0] = 0;
-  }
-  else
-  {
-    pExceptRec = ExceptionRecord;
-  }
-
-  if (RegistrationFrame)
-    pExceptRec->ExceptionFlags |= EXCEPTION_UNWINDING;
-  else
-    pExceptRec->ExceptionFlags |= (EXCEPTION_UNWINDING|EXCEPTION_EXIT_UNWIND);
-
-#ifndef NDEBUG
-  DPRINT("ExceptionFlags == 0x%x:\n", pExceptRec->ExceptionFlags);
-  if (pExceptRec->ExceptionFlags & EXCEPTION_UNWINDING)
-  {
-	  DPRINT("  * EXCEPTION_UNWINDING (0x%x)\n", EXCEPTION_UNWINDING);
-  }
-  if (pExceptRec->ExceptionFlags & EXCEPTION_EXIT_UNWIND)
-  {
-	  DPRINT("  * EXCEPTION_EXIT_UNWIND (0x%x)\n", EXCEPTION_EXIT_UNWIND);
-  }
-#endif /* NDEBUG */
-
-  Context.ContextFlags =
-    (CONTEXT_i386 | CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS);
-
-  SehpCaptureContext(&Context);
-
-  DPRINT("Context.Eip = 0x%.08x\n", Context.Eip);
-  DPRINT("Context.Ebp = 0x%.08x\n", Context.Ebp);
-  DPRINT("Context.Esp = 0x%.08x\n", Context.Esp);
-
-  Context.Esp += 0x10;
-  Context.Eax = EaxValue;
- 
-  // Begin traversing the list of EXCEPTION_REGISTRATION
-  while ((ULONG_PTR)ERHead != -1)
-  {
-    EXCEPTION_RECORD er2;
- 
-    DPRINT("ERHead 0x%X\n", ERHead);
-
-    if (ERHead == RegistrationFrame)
-    {
-      DPRINT("Continueing execution\n");
-      SehpContinue(&Context, FALSE);
-      return;
-    }
-    else
-    {
-      // If there's an exception frame, but it's lower on the stack
-      // than the head of the exception list, something's wrong!
-      if (RegistrationFrame && (RegistrationFrame <= ERHead))
-      {
-        DPRINT("The exception frame is bad\n");
-
-        // Generate an exception to bail out
-        er2.ExceptionRecord = pExceptRec;
-        er2.NumberParameters = 0;
-        er2.ExceptionCode = STATUS_INVALID_UNWIND_TARGET;
-        er2.ExceptionFlags = EXCEPTION_NONCONTINUABLE;    
- 
-        RtlRaiseException(&er2);
-      }
-    }
- 
-#if 0
-    Stack = ERHead + sizeof(EXCEPTION_REGISTRATION);
-    if ( (Teb->Tib.StackBase <= (PVOID)ERHead )      // Make sure that ERHead
-      && (Teb->Tib.->StackLimit >= (PVOID)Stack )      // is in range, and a multiple
-      && (0 == ((ULONG_PTR)ERHead & 3)) )         // of 4 (i.e., sane)
-    {
-#else
-    if (1) {
-#endif
-      PEXCEPTION_REGISTRATION NewERHead;
-      PEXCEPTION_REGISTRATION pCurrExceptReg;
-      EXCEPTION_DISPOSITION ReturnValue;
-  
-      DPRINT("Executing handler at 0x%X for unwind\n", ERHead->handler);
-
-      ReturnValue = RtlpExecuteHandlerForUnwind(
-        pExceptRec,
-        ERHead,
-        &Context,
-        &NewERHead,
-        ERHead->handler);
- 
-      DPRINT("Handler at 0x%X returned 0x%X\n", ERHead->handler, ReturnValue);
-
-      if (ReturnValue != ExceptionContinueSearch)
-      {
-        if (ReturnValue != ExceptionCollidedUnwind)
-        {
-          DPRINT("Bad return value\n");
-
-          er2.ExceptionRecord = pExceptRec;
-          er2.NumberParameters = 0;
-          er2.ExceptionCode = STATUS_INVALID_DISPOSITION;
-          er2.ExceptionFlags = EXCEPTION_NONCONTINUABLE;    
- 
-          RtlRaiseException(&er2);
-        }
-        else
-        {
-          ERHead = NewERHead;
-        }
-      }
- 
-      pCurrExceptReg = ERHead;
-      ERHead = ERHead->prev;
-
-      DPRINT("New ERHead is 0x%X\n", ERHead);
-
-      DPRINT("Setting exception registration at 0x%X as current\n",
-        RegistrationFrame->prev);
-
-      // Unlink the exception handler
-      SehpSetExceptionList(RegistrationFrame->prev);
-    }
-    else // The stack looks goofy! Raise an exception to bail out
-    {
-      DPRINT("Bad stack\n");
-
-      er2.ExceptionRecord = pExceptRec;
-      er2.NumberParameters = 0;
-      er2.ExceptionCode = STATUS_BAD_STACK;
-      er2.ExceptionFlags = EXCEPTION_NONCONTINUABLE;    
- 
-      RtlRaiseException(&er2);
-    }
-  }
- 
-  // If we get here, we reached the end of the EXCEPTION_REGISTRATION list.
-  // This shouldn't happen normally.
-
-  DPRINT("Ran out of exception registrations. RegistrationFrame is (0x%X)\n",
-    RegistrationFrame);
-
-  if ((ULONG_PTR)RegistrationFrame == -1)
-    SehpContinue(&Context, FALSE);
-  else
-    NtRaiseException(pExceptRec, &Context, 0);
-}
-
-/* EOF */

reactos/ntoskrnl/rtl/i386
except.s removed after 1.2
diff -N except.s
--- except.s	26 Oct 2002 07:32:08 -0000	1.2
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,291 +0,0 @@
-/* $Id: except.s,v 1.2 2002/10/26 07:32:08 chorns Exp $
- *
- * COPYRIGHT:         See COPYING in the top level directory
- * PROJECT:           ReactOS kernel
- * PURPOSE:           Kernel-mode exception support for IA-32
- * FILE:              ntoskrnl/rtl/i386/except.s
- * PROGRAMER:         Casper S. Hornstrup (chorns@users.sourceforge.net)
- * NOTES:             This file is shared with lib/ntdll/rtl/i386/except.s.
- *                    Please keep them in sync.
- */
-
-#define EXCEPTION_UNWINDING		0x02
-
-#define EREC_FLAGS				0x04
-
-#define ExceptionContinueExecution 0
-#define ExceptionContinueSearch    1
-#define ExceptionNestedException   2
-#define ExceptionCollidedUnwind    3
-
-.globl _RtlpExecuteHandlerForException
-.globl _RtlpExecuteHandlerForUnwind
-
-#define CONTEXT_FLAGS	0x00
-#define CONTEXT_SEGGS	0x8C
-#define CONTEXT_SEGFS	0x90
-#define CONTEXT_SEGES	0x94
-#define CONTEXT_SEGDS	0x98
-#define CONTEXT_EDI		0x9C
-#define CONTEXT_ESI		0xA0
-#define CONTEXT_EBX		0xA4
-#define CONTEXT_EDX		0xA8
-#define CONTEXT_ECX		0xAC
-#define CONTEXT_EAX		0xB0
-#define CONTEXT_EBP		0xB4
-#define CONTEXT_EIP		0xB8
-#define CONTEXT_SEGCS	0xBC
-#define CONTEXT_EFLAGS	0xC0
-#define CONTEXT_ESP		0xC4
-#define CONTEXT_SEGSS	0xC8
-
-
-#define RCC_CONTEXT		0x08
-
-// EAX = value to print
-_do_debug:
-	pushal
-	pushl	%eax
-	call	_AsmDebug@4
-	popal
-	ret
-
-#ifndef __NTOSKRNL__
-
-//
-// VOID
-// RtlpCaptureContext(PCONTEXT pContext);
-//
-// Parameters:
-//   [ESP+08h] - PCONTEXT_X86 pContext
-// Registers:
-//   None
-// Returns:
-//   Nothing
-// Notes:
-//   Grabs the current CPU context.
-.globl _RtlpCaptureContext
-_RtlpCaptureContext:
-	pushl   %ebp
-    movl	%esp, %ebp
-	movl	RCC_CONTEXT(%ebp), %edx		// EDX = Address of context structure
-
-	cld
-	pushf
-	pop		%eax
-	movl	%eax, CONTEXT_EFLAGS(%edx)
-	xorl	%eax, %eax
-	movl	%eax, CONTEXT_EAX(%edx)
-	movl	%eax, CONTEXT_EBX(%edx)
-	movl	%eax, CONTEXT_ECX(%edx)
-	movl	%eax, CONTEXT_EDX(%edx)
-	movl	%eax, CONTEXT_ESI(%edx)
-	movl	%eax, CONTEXT_EDI(%edx)
-	movl	%cs, %eax
-	movl	%eax, CONTEXT_SEGCS(%edx)
-	movl	%ds, %eax
-	movl	%eax, CONTEXT_SEGDS(%edx)
-	movl	%es, %eax
-	movl	%eax, CONTEXT_SEGES(%edx)
-	movl	%fs, %eax
-	movl	%eax, CONTEXT_SEGFS(%edx)
-	movl	%gs, %eax
-	movl	%eax, CONTEXT_SEGGS(%edx)
-	movl	%ss, %eax
-	movl	%eax, CONTEXT_SEGSS(%edx)
-
-	//
-	// STACK LAYOUT: - (ESP to put in context structure)
-	//               - RETURN ADDRESS OF CALLER OF CALLER
-	//               - EBP OF CALLER OF CALLER
-	//                 ...
-	//               - RETURN ADDRESS OF CALLER
-	//               - EBP OF CALLER
-	//                 ...
-	//
-
-	// Get return address of the caller of the caller of this function
-	movl	%ebp, %ebx
-	//movl	4(%ebx), %eax			// EAX = return address of caller
-	movl	(%ebx), %ebx			// EBX = EBP of caller
-
-	movl	4(%ebx), %eax			// EAX = return address of caller of caller
-	movl	(%ebx), %ebx			// EBX = EBP of caller of caller
-
-	movl	%eax, CONTEXT_EIP(%edx)	// EIP = return address of caller of caller
-	movl	%ebx, CONTEXT_EBP(%edx)	// EBP = EBP of caller of caller
-	addl	$8, %ebx
-	movl	%ebx, CONTEXT_ESP(%edx)	// ESP = EBP of caller of caller + 8
-
-    movl	%ebp, %esp
-    popl	%ebp
-    ret
-
-#endif /* !__NTOSKRNL__ */
-
-#define REH_ERECORD		0x08
-#define REH_RFRAME		0x0C
-#define REH_CONTEXT		0x10
-#define REH_DCONTEXT	0x14
-#define REH_EROUTINE	0x18
-
-// Parameters:
-//   None
-// Registers:
-//   [EBP+08h] - PEXCEPTION_RECORD ExceptionRecord
-//   [EBP+0Ch] - PEXCEPTION_REGISTRATION RegistrationFrame
-//   [EBP+10h] - PVOID Context
-//   [EBP+14h] - PVOID DispatcherContext
-//   [EBP+18h] - PEXCEPTION_HANDLER ExceptionRoutine
-//   EDX       - Address of protecting exception handler
-// Returns:
-//   EXCEPTION_DISPOSITION
-// Notes:
-//   Setup the protecting exception handler and call the exception
-//   handler in the right context.
-_RtlpExecuteHandler:
-	pushl    %ebp
-    movl     %esp, %ebp
-    pushl    REH_RFRAME(%ebp)
-
-    pushl    %edx
-    pushl    %fs:0x0
-    movl     %esp, %fs:0x0
-
-    // Prepare to call the exception handler
-    pushl    REH_DCONTEXT(%ebp)
-    pushl    REH_CONTEXT(%ebp)
-    pushl    REH_RFRAME(%ebp)
-    pushl    REH_ERECORD(%ebp)
-
-    // Now call the exception handler
-    movl     REH_EROUTINE(%ebp), %eax
-    call    *%eax
-
-	cmpl	$-1, %fs:0x0
-	jne		.reh_stack_looks_ok
-
-	// This should not happen
-	pushl	0
-	pushl	0
-	pushl	0
-	pushl	0
-	call	_RtlAssert@16
-
-.reh_loop:
-	jmp	.reh_loop
-	
-.reh_stack_looks_ok:
-    movl     %fs:0x0, %esp
-
-    // Return to the 'front-end' for this function
-    popl     %fs:0x0
-    movl     %ebp, %esp
-    popl     %ebp
-    ret
-
-
-#define REP_ERECORD     0x04
-#define REP_RFRAME      0x08
-#define REP_CONTEXT     0x0C
-#define REP_DCONTEXT    0x10
-
-// Parameters:
-//   [ESP+04h] - PEXCEPTION_RECORD ExceptionRecord
-//   [ESP+08h] - PEXCEPTION_REGISTRATION RegistrationFrame
-//   [ESP+0Ch] - PCONTEXT Context
-//   [ESP+10h] - PVOID DispatcherContext
-// Registers:
-//   None
-// Returns:
-//   EXCEPTION_DISPOSITION
-// Notes:
-//    This exception handler protects the exception handling
-//    mechanism by detecting nested exceptions.
-_RtlpExceptionProtector:
-    movl     $ExceptionContinueSearch, %eax
-    movl     REP_ERECORD(%esp), %ecx
-    testl    $EXCEPTION_UNWINDING, EREC_FLAGS(%ecx)
-    jnz      .rep_end
-
-    // Unwinding is not taking place, so return ExceptionNestedException
-
-    // Set DispatcherContext field to the exception registration for the
-    // exception handler that executed when a nested exception occurred
-    movl     REP_DCONTEXT(%esp), %ecx
-    movl     REP_RFRAME(%esp), %eax
-    movl     %eax, (%ecx)
-    movl     $ExceptionNestedException, %eax
-
-.rep_end:
-    ret
-
-
-// Parameters:
-//   [ESP+04h] - PEXCEPTION_RECORD ExceptionRecord
-//   [ESP+08h] - PEXCEPTION_REGISTRATION RegistrationFrame
-//   [ESP+0Ch] - PCONTEXT Context
-//   [ESP+10h] - PVOID DispatcherContext
-//   [ESP+14h] - PEXCEPTION_HANDLER ExceptionHandler
-// Registers:
-//   None
-// Returns:
-//   EXCEPTION_DISPOSITION
-// Notes:
-//   Front-end
-_RtlpExecuteHandlerForException:
-    movl     $_RtlpExceptionProtector, %edx
-    jmp      _RtlpExecuteHandler
-
-
-#define RUP_ERECORD     0x04
-#define RUP_RFRAME      0x08
-#define RUP_CONTEXT     0x0C
-#define RUP_DCONTEXT    0x10
-
-// Parameters:
-//   [ESP+04h] - PEXCEPTION_RECORD ExceptionRecord
-//   [ESP+08h] - PEXCEPTION_REGISTRATION RegistrationFrame
-//   [ESP+0Ch] - PCONTEXT Context
-//   [ESP+10h] - PVOID DispatcherContext
-// Registers:
-//   None
-// Returns:
-//   EXCEPTION_DISPOSITION
-// Notes:
-//    This exception handler protects the exception handling
-//    mechanism by detecting collided unwinds.
-_RtlpUnwindProtector:
-    movl     $ExceptionContinueSearch, %eax
-    movl     %ecx, RUP_ERECORD(%esp)
-    testl    $EXCEPTION_UNWINDING, EREC_FLAGS(%ecx)
-    jz       .rup_end
-
-    // Unwinding is taking place, so return ExceptionCollidedUnwind
-
-    movl     RUP_RFRAME(%esp), %ecx
-    movl     RUP_DCONTEXT(%esp), %edx
-
-    // Set DispatcherContext field to the exception registration for the
-    // exception handler that executed when a collision occurred
-    movl     RUP_RFRAME(%ecx), %eax
-    movl     %eax, (%edx)
-    movl     $ExceptionCollidedUnwind, %eax
-
-.rup_end:
-    ret
-
-
-// Parameters:
-//   [ESP+04h] - PEXCEPTION_RECORD ExceptionRecord
-//   [ESP+08h] - PEXCEPTION_REGISTRATION RegistrationFrame
-//   [ESP+0Ch] - PCONTEXT Context
-//   [ESP+10h] - PVOID DispatcherContext
-//   [ESP+14h] - PEXCEPTION_HANDLER ExceptionHandler
-// Registers:
-//   None
-// Returns:
-//   EXCEPTION_DISPOSITION
-_RtlpExecuteHandlerForUnwind:
-    movl     $_RtlpUnwindProtector, %edx
-    jmp      _RtlpExecuteHandler
CVSspam 0.2.8