--- trunk/reactos/ntoskrnl/ke/catch.c 2005-09-23 09:23:14 UTC (rev 18008)
+++ trunk/reactos/ntoskrnl/ke/catch.c 2005-09-23 09:51:18 UTC (rev 18009)
@@ -1,234 +0,0 @@
-/*
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS kernel
- * FILE: ntoskrnl/ke/catch.c
- * PURPOSE: Exception handling
- *
- * PROGRAMMERS: Anich Gregor
- * David Welch (welch@mcmail.com)
- * Casper S. Hornstrup (chorns@users.sourceforge.net)
- */
-
-/* INCLUDES *****************************************************************/
-
-#include <ntoskrnl.h>
-#define NDEBUG
-#include <internal/debug.h>
-
-/* FUNCTIONS ****************************************************************/
-
-ULONG
-RtlpDispatchException(IN PEXCEPTION_RECORD ExceptionRecord,
- IN PCONTEXT Context);
-
-/*
- * @unimplemented
- */
-VOID
-STDCALL
-KiCoprocessorError(VOID)
-{
- UNIMPLEMENTED;
-}
-
-/*
- * @unimplemented
- */
-VOID
-STDCALL
-KiUnexpectedInterrupt(VOID)
-{
- UNIMPLEMENTED;
-}
-
-VOID
-KiDispatchException(PEXCEPTION_RECORD ExceptionRecord,
- PCONTEXT Context,
- PKTRAP_FRAME Tf,
- KPROCESSOR_MODE PreviousMode,
- BOOLEAN SearchFrames)
-{
- EXCEPTION_DISPOSITION Value;
- CONTEXT TContext;
- KD_CONTINUE_TYPE Action = kdHandleException;
-
- DPRINT("KiDispatchException() called\n");
-
- /* Increase number of Exception Dispatches */
- KeGetCurrentPrcb()->KeExceptionDispatchCount++;
-
- if (!Context)
- {
- /* Assume Full context */
- TContext.ContextFlags = CONTEXT_FULL;
-
- /* Check the mode */
- if (PreviousMode != KernelMode)
- {
- /* Add Debugger Registers if this is User Mode */
- TContext.ContextFlags = TContext.ContextFlags | CONTEXT_DEBUGGER;
- }
-
- /* Convert the Trapframe into a Context */
- KeTrapFrameToContext(Tf, &TContext);
-
- /* Use local stack context */
- Context = &TContext;
- }
-
- /* Break into Debugger */
- Action = KdpEnterDebuggerException(ExceptionRecord,
- PreviousMode,
- Context,
- Tf,
- TRUE,
- TRUE);
-
- /* If the debugger said continue, then continue */
- if (Action == kdContinue) return;
-
- /* If the Debugger couldn't handle it... */
- if (Action != kdDoNotHandleException)
- {
- /* See what kind of Exception this is */
- if (PreviousMode != KernelMode)
- {
- /* User mode exception, search the frames if we have to */
- if (SearchFrames)
- {
- PULONG Stack;
- ULONG CDest;
- char temp_space[12 + sizeof(EXCEPTION_RECORD) + sizeof(CONTEXT)]; /* FIXME: HACKHACK */
- PULONG pNewUserStack = (PULONG)(Tf->Esp - (12 + sizeof(EXCEPTION_RECORD) + sizeof(CONTEXT)));
- NTSTATUS Status = STATUS_SUCCESS;
-
- /* Enter Debugger if available */
- Action = KdpEnterDebuggerException(ExceptionRecord,
- PreviousMode,
- Context,
- Tf,
- TRUE,
- FALSE);
-
- /* Exit if we're continuing */
- if (Action == kdContinue) return;
-
- /* FIXME: Forward exception to user mode debugger */
-
- /* FIXME: Check user mode stack for enough space */
-
- /* Let usermode try and handle the exception. Setup Stack */
- Stack = (PULONG)temp_space;
- CDest = 3 + (ROUND_UP(sizeof(EXCEPTION_RECORD), 4) / 4);
- /* Return Address */
- Stack[0] = 0;
- /* Pointer to EXCEPTION_RECORD structure */
- Stack[1] = (ULONG)&pNewUserStack[3];
- /* Pointer to CONTEXT structure */
- Stack[2] = (ULONG)&pNewUserStack[CDest];
- memcpy(&Stack[3], ExceptionRecord, sizeof(EXCEPTION_RECORD));
- memcpy(&Stack[CDest], Context, sizeof(CONTEXT));
-
- /* Copy Stack */
- _SEH_TRY
- {
- ProbeForWrite(pNewUserStack,
- 12 + sizeof(EXCEPTION_RECORD) + sizeof(CONTEXT),
- 1);
- RtlCopyMemory(pNewUserStack,
- temp_space,
- 12 + sizeof(EXCEPTION_RECORD) + sizeof(CONTEXT));
- }
- _SEH_HANDLE
- {
- Status = _SEH_GetExceptionCode();
- }
- _SEH_END;
-
- /* Check for success */
- if (NT_SUCCESS(Status))
- {
- /* Set new Stack Pointer */
- Tf->Esp = (ULONG)pNewUserStack;
- }
- else
- {
- /*
- * Now it really hit the ventilation device. Sorry,
- * can do nothing but kill the sucker.
- */
- ZwTerminateThread(NtCurrentThread(), ExceptionRecord->ExceptionCode);
- DPRINT1("User-mode stack was invalid. Terminating target thread\n");
- }
- /* Set EIP to the User-mode Dispathcer */
- Tf->Eip = (ULONG)KeUserExceptionDispatcher;
- return;
- }
-
- /* FIXME: Forward the exception to the debugger */
-
- /* FIXME: Forward the exception to the process exception port */
-
- /* Enter KDB if available */
- Action = KdpEnterDebuggerException(ExceptionRecord,
- PreviousMode,
- Context,
- Tf,
- FALSE,
- FALSE);
-
- /* Exit if we're continuing */
- if (Action == kdContinue) return;
-
- /* Terminate the offending thread */
- DPRINT1("Unhandled UserMode exception, terminating thread\n");
- ZwTerminateThread(NtCurrentThread(), ExceptionRecord->ExceptionCode);
- }
- else
- {
- /* This is Kernel Mode */
-
- /* Enter KDB if available */
- Action = KdpEnterDebuggerException(ExceptionRecord,
- PreviousMode,
- Context,
- Tf,
- TRUE,
- FALSE);
-
- /* Exit if we're continuing */
- if (Action == kdContinue) return;
-
- /* Dispatch the Exception */
- Value = RtlpDispatchException (ExceptionRecord, Context);
- DPRINT("RtlpDispatchException() returned with 0x%X\n", Value);
-
- /* If RtlpDispatchException() did not handle the exception then bugcheck */
- if (Value != ExceptionContinueExecution ||
- 0 != (ExceptionRecord->ExceptionFlags & EXCEPTION_NONCONTINUABLE))
- {
- DPRINT("ExceptionRecord->ExceptionAddress = 0x%p\n", ExceptionRecord->ExceptionAddress);
-
- /* Enter KDB if available */
- Action = KdpEnterDebuggerException(ExceptionRecord,
- PreviousMode,
- Context,
- Tf,
- FALSE,
- FALSE);
-
- /* Exit if we're continuing */
- if (Action == kdContinue) return;
-
- KEBUGCHECKWITHTF(KMODE_EXCEPTION_NOT_HANDLED,
- ExceptionRecord->ExceptionCode,
- (ULONG)ExceptionRecord->ExceptionAddress,
- ExceptionRecord->ExceptionInformation[0],
- ExceptionRecord->ExceptionInformation[1],
- Tf);
- }
- }
- }
-}
-
-/* EOF */