diff --git a/reactos/lib/rtl/exception.c b/reactos/lib/rtl/exception.c new file mode 100644 index 00000000000..cffc56a92e7 --- /dev/null +++ b/reactos/lib/rtl/exception.c @@ -0,0 +1,68 @@ +/* $Id: exception.c,v 1.1 2004/06/24 19:30:21 hyperion Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * PURPOSE: User-mode exception support + * FILE: lib/ntdll/rtl/exception.c + * PROGRAMERS: David Welch + * Skywing + * KJK::Hyperion + * UPDATES: Skywing, 09/11/2003: Implemented RtlRaiseException and + * KiUserRaiseExceptionDispatcher. + * KJK::Hyperion, 22/06/2004: Moved the common parts here, + * left the user-mode code in ntdll + */ + +/* INCLUDES *****************************************************************/ + +#include +#include +#include +#include + +#define NDEBUG +#include + +/* FUNCTIONS ***************************************************************/ + +/* implemented in except.s */ +VOID +RtlpCaptureContext(PCONTEXT Context); + +/* + * @implemented + */ +VOID STDCALL +RtlRaiseException(PEXCEPTION_RECORD ExceptionRecord) +{ + CONTEXT Context; + NTSTATUS Status; + + RtlpCaptureContext(&Context); + + ExceptionRecord->ExceptionAddress = (PVOID)(*(((PULONG)Context.Ebp)+1)); + Context.ContextFlags = CONTEXT_FULL; + + Status = ZwRaiseException(ExceptionRecord, &Context, TRUE); + RtlRaiseException(ExceptionRecord); + RtlRaiseStatus(Status); /* If we get to this point, something is seriously wrong... */ +} + +/* + * @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); +} + +/* EOF */