mirror of
https://github.com/reactos/reactos.git
synced 2025-07-28 04:11:50 +00:00
[RTL] Move exception handling code to except.c
This commit is contained in:
parent
65c3911ffc
commit
5075f7d746
4 changed files with 103 additions and 88 deletions
|
@ -622,71 +622,6 @@ RtlGetCallersAddress(
|
|||
return;
|
||||
}
|
||||
|
||||
// FIXME: move to different file
|
||||
VOID
|
||||
NTAPI
|
||||
RtlRaiseException(IN PEXCEPTION_RECORD ExceptionRecord)
|
||||
{
|
||||
CONTEXT Context;
|
||||
NTSTATUS Status = STATUS_INVALID_DISPOSITION;
|
||||
ULONG64 ImageBase;
|
||||
PRUNTIME_FUNCTION FunctionEntry;
|
||||
PVOID HandlerData;
|
||||
ULONG64 EstablisherFrame;
|
||||
|
||||
/* Capture the context */
|
||||
RtlCaptureContext(&Context);
|
||||
|
||||
/* Get the function entry for this function */
|
||||
FunctionEntry = RtlLookupFunctionEntry(Context.Rip,
|
||||
&ImageBase,
|
||||
NULL);
|
||||
|
||||
/* Check if we found it */
|
||||
if (FunctionEntry)
|
||||
{
|
||||
/* Unwind to the caller of this function */
|
||||
RtlVirtualUnwind(UNW_FLAG_NHANDLER,
|
||||
ImageBase,
|
||||
Context.Rip,
|
||||
FunctionEntry,
|
||||
&Context,
|
||||
&HandlerData,
|
||||
&EstablisherFrame,
|
||||
NULL);
|
||||
|
||||
/* Save the exception address */
|
||||
ExceptionRecord->ExceptionAddress = (PVOID)Context.Rip;
|
||||
|
||||
/* Write the context flag */
|
||||
Context.ContextFlags = CONTEXT_FULL;
|
||||
|
||||
/* Check if user mode debugger is active */
|
||||
if (RtlpCheckForActiveDebugger())
|
||||
{
|
||||
/* Raise an exception immediately */
|
||||
Status = ZwRaiseException(ExceptionRecord, &Context, TRUE);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Dispatch the exception and check if we should continue */
|
||||
if (!RtlDispatchException(ExceptionRecord, &Context))
|
||||
{
|
||||
/* Raise the exception */
|
||||
Status = ZwRaiseException(ExceptionRecord, &Context, FALSE);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Continue, go back to previous context */
|
||||
Status = ZwContinue(&Context, FALSE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* If we returned, raise a status */
|
||||
RtlRaiseStatus(Status);
|
||||
}
|
||||
|
||||
static
|
||||
VOID
|
||||
RtlpCaptureNonVolatileContextPointers(
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue