mirror of
https://github.com/reactos/reactos.git
synced 2024-10-15 21:56:40 +00:00
Remove dead file
svn path=/trunk/; revision=18009
This commit is contained in:
parent
7a74eefb29
commit
5cf68f2c19
|
@ -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 */
|
|
Loading…
Reference in a new issue