Author: fireball Date: Wed Aug 8 00:46:24 2007 New Revision: 28223
URL: http://svn.reactos.org/svn/reactos?rev=28223&view=rev Log: - Rename exception.c to except.c to avoid conflict with another exception.c in rtl project. - Fix WDK compatibility.
Added: trunk/reactos/lib/rtl/i386/except.c - copied unchanged from r28215, trunk/reactos/lib/rtl/i386/exception.c Removed: trunk/reactos/lib/rtl/i386/exception.c Modified: trunk/reactos/lib/rtl/rtl.h trunk/reactos/lib/rtl/rtl.rbuild
Removed: trunk/reactos/lib/rtl/i386/exception.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/rtl/i386/exception.c?re... ============================================================================== --- trunk/reactos/lib/rtl/i386/exception.c (original) +++ trunk/reactos/lib/rtl/i386/exception.c (removed) @@ -1,336 +1,0 @@ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Run-Time Library - * PURPOSE: User-mode exception support for IA-32 - * FILE: lib/rtl/i386/exception.c - * PROGRAMERS: Alex Ionescu (alex@relsoft.net) - * Casper S. Hornstrup (chorns@users.sourceforge.net) - */ - -/* INCLUDES *****************************************************************/ - -#include <rtl.h> -#define NDEBUG -#include <debug.h> - -/* PUBLIC FUNCTIONS **********************************************************/ - -/* - * @unimplemented - */ -VOID -NTAPI -RtlGetCallersAddress(OUT PVOID *CallersAddress, - OUT PVOID *CallersCaller) -{ - UNIMPLEMENTED; -} - -/* - * @implemented - */ -BOOLEAN -NTAPI -RtlDispatchException(IN PEXCEPTION_RECORD ExceptionRecord, - IN PCONTEXT Context) -{ - PEXCEPTION_REGISTRATION_RECORD RegistrationFrame, NestedFrame = NULL; - DISPATCHER_CONTEXT DispatcherContext; - EXCEPTION_RECORD ExceptionRecord2; - EXCEPTION_DISPOSITION Disposition; - ULONG_PTR StackLow, StackHigh; - ULONG_PTR RegistrationFrameEnd; - - /* Get the current stack limits and registration frame */ - RtlpGetStackLimits(&StackLow, &StackHigh); - RegistrationFrame = RtlpGetExceptionList(); - - /* Now loop every frame */ - while (RegistrationFrame != EXCEPTION_CHAIN_END) - { - /* Find out where it ends */ - RegistrationFrameEnd = (ULONG_PTR)RegistrationFrame + - sizeof(EXCEPTION_REGISTRATION_RECORD); - - /* Make sure the registration frame is located within the stack */ - if ((RegistrationFrameEnd > StackHigh) || - ((ULONG_PTR)RegistrationFrame < StackLow) || - ((ULONG_PTR)RegistrationFrame & 0x3)) - { - /* Check if this happened in the DPC Stack */ - if (RtlpHandleDpcStackException(RegistrationFrame, - RegistrationFrameEnd, - &StackLow, - &StackHigh)) - { - /* Use DPC Stack Limits and restart */ - continue; - } - - /* Set invalid stack and return false */ - ExceptionRecord->ExceptionFlags |= EXCEPTION_STACK_INVALID; - return FALSE; - } - - /* Check if logging is enabled */ - RtlpCheckLogException(ExceptionRecord, - Context, - RegistrationFrame, - sizeof(*RegistrationFrame)); - - /* Call the handler */ - Disposition = RtlpExecuteHandlerForException(ExceptionRecord, - RegistrationFrame, - Context, - &DispatcherContext, - RegistrationFrame-> - Handler); - - /* Check if this is a nested frame */ - if (RegistrationFrame == NestedFrame) - { - /* Mask out the flag and the nested frame */ - ExceptionRecord->ExceptionFlags &= ~EXCEPTION_NESTED_CALL; - NestedFrame = NULL; - } - - /* Handle the dispositions */ - switch (Disposition) - { - /* Continue searching */ - case ExceptionContinueExecution: - - /* Check if it was non-continuable */ - if (ExceptionRecord->ExceptionFlags & EXCEPTION_NONCONTINUABLE) - { - /* Set up the exception record */ - ExceptionRecord2.ExceptionRecord = ExceptionRecord; - ExceptionRecord2.ExceptionCode = - STATUS_NONCONTINUABLE_EXCEPTION; - ExceptionRecord2.ExceptionFlags = EXCEPTION_NONCONTINUABLE; - ExceptionRecord2.NumberParameters = 0; - - /* Raise the exception */ - RtlRaiseException(&ExceptionRecord2); - } - else - { - /* Return to caller */ - return TRUE; - } - - /* Continue searching */ - case ExceptionContinueSearch: - break; - - /* Nested exception */ - case ExceptionNestedException: - - /* Turn the nested flag on */ - ExceptionRecord->ExceptionFlags |= EXCEPTION_NESTED_CALL; - - /* Update the current nested frame */ - if (DispatcherContext.RegistrationPointer > NestedFrame) - { - /* Get the frame from the dispatcher context */ - NestedFrame = DispatcherContext.RegistrationPointer; - } - break; - - /* Anything else */ - default: - - /* Set up the exception record */ - ExceptionRecord2.ExceptionRecord = ExceptionRecord; - ExceptionRecord2.ExceptionCode = STATUS_INVALID_DISPOSITION; - ExceptionRecord2.ExceptionFlags = EXCEPTION_NONCONTINUABLE; - ExceptionRecord2.NumberParameters = 0; - - /* Raise the exception */ - RtlRaiseException(&ExceptionRecord2); - break; - } - - /* Go to the next frame */ - RegistrationFrame = RegistrationFrame->Next; - } - - /* Unhandled, return false */ - return FALSE; -} - -/* - * @implemented - */ -VOID -NTAPI -RtlUnwind(IN PVOID TargetFrame OPTIONAL, - IN PVOID TargetIp OPTIONAL, - IN PEXCEPTION_RECORD ExceptionRecord OPTIONAL, - IN PVOID ReturnValue) -{ - PEXCEPTION_REGISTRATION_RECORD RegistrationFrame, OldFrame; - DISPATCHER_CONTEXT DispatcherContext; - EXCEPTION_RECORD ExceptionRecord2, ExceptionRecord3; - EXCEPTION_DISPOSITION Disposition; - ULONG_PTR StackLow, StackHigh; - ULONG_PTR RegistrationFrameEnd; - CONTEXT LocalContext; - PCONTEXT Context; - - /* Get the current stack limits */ - RtlpGetStackLimits(&StackLow, &StackHigh); - - /* Check if we don't have an exception record */ - if (!ExceptionRecord) - { - /* Overwrite the argument */ - ExceptionRecord = &ExceptionRecord3; - - /* Setup a local one */ - ExceptionRecord3.ExceptionFlags = 0; - ExceptionRecord3.ExceptionCode = STATUS_UNWIND; - ExceptionRecord3.ExceptionRecord = NULL; - ExceptionRecord3.ExceptionAddress = RtlpGetExceptionAddress(); - ExceptionRecord3.NumberParameters = 0; - } - - /* Check if we have a frame */ - if (TargetFrame) - { - /* Set it as unwinding */ - ExceptionRecord->ExceptionFlags |= EXCEPTION_UNWINDING; - } - else - { - /* Set the Exit Unwind flag as well */ - ExceptionRecord->ExceptionFlags |= (EXCEPTION_UNWINDING | - EXCEPTION_EXIT_UNWIND); - } - - /* Now capture the context */ - Context = &LocalContext; - LocalContext.ContextFlags = CONTEXT_INTEGER | - CONTEXT_CONTROL | - CONTEXT_SEGMENTS; - RtlpCaptureContext(Context); - - /* Pop the current arguments off */ - Context->Esp += sizeof(TargetFrame) + - sizeof(TargetIp) + - sizeof(ExceptionRecord) + - sizeof(ReturnValue); - - /* Set the new value for EAX */ - Context->Eax = (ULONG)ReturnValue; - - /* Get the current frame */ - RegistrationFrame = RtlpGetExceptionList(); - - /* Now loop every frame */ - while (RegistrationFrame != EXCEPTION_CHAIN_END) - { - /* If this is the target */ - if (RegistrationFrame == TargetFrame) ZwContinue(Context, FALSE); - - /* Check if the frame is too low */ - if ((TargetFrame) && - ((ULONG_PTR)TargetFrame < (ULONG_PTR)RegistrationFrame)) - { - /* Create an invalid unwind exception */ - ExceptionRecord2.ExceptionCode = STATUS_INVALID_UNWIND_TARGET; - ExceptionRecord2.ExceptionFlags = EXCEPTION_NONCONTINUABLE; - ExceptionRecord2.ExceptionRecord = ExceptionRecord; - ExceptionRecord2.NumberParameters = 0; - - /* Raise the exception */ - RtlRaiseException(&ExceptionRecord2); - } - - /* Find out where it ends */ - RegistrationFrameEnd = (ULONG_PTR)RegistrationFrame + - sizeof(EXCEPTION_REGISTRATION_RECORD); - - /* Make sure the registration frame is located within the stack */ - if ((RegistrationFrameEnd > StackHigh) || - ((ULONG_PTR)RegistrationFrame < StackLow) || - ((ULONG_PTR)RegistrationFrame & 0x3)) - { - /* Check if this happened in the DPC Stack */ - if (RtlpHandleDpcStackException(RegistrationFrame, - RegistrationFrameEnd, - &StackLow, - &StackHigh)) - { - /* Use DPC Stack Limits and restart */ - continue; - } - - /* Create an invalid stack exception */ - ExceptionRecord2.ExceptionCode = STATUS_BAD_STACK; - ExceptionRecord2.ExceptionFlags = EXCEPTION_NONCONTINUABLE; - ExceptionRecord2.ExceptionRecord = ExceptionRecord; - ExceptionRecord2.NumberParameters = 0; - - /* Raise the exception */ - RtlRaiseException(&ExceptionRecord2); - } - else - { - /* Call the handler */ - Disposition = RtlpExecuteHandlerForUnwind(ExceptionRecord, - RegistrationFrame, - Context, - &DispatcherContext, - RegistrationFrame-> - Handler); - switch(Disposition) - { - /* Continue searching */ - case ExceptionContinueSearch: - break; - - /* Collission */ - case ExceptionCollidedUnwind : - - /* Get the original frame */ - RegistrationFrame = DispatcherContext.RegistrationPointer; - break; - - /* Anything else */ - default: - - /* Set up the exception record */ - ExceptionRecord2.ExceptionRecord = ExceptionRecord; - ExceptionRecord2.ExceptionCode = STATUS_INVALID_DISPOSITION; - ExceptionRecord2.ExceptionFlags = EXCEPTION_NONCONTINUABLE; - ExceptionRecord2.NumberParameters = 0; - - /* Raise the exception */ - RtlRaiseException(&ExceptionRecord2); - break; - } - - /* Go to the next frame */ - OldFrame = RegistrationFrame; - RegistrationFrame = RegistrationFrame->Next; - - /* Remove this handler */ - RtlpSetExceptionList(OldFrame); - } - } - - /* Check if we reached the end */ - if (TargetFrame == EXCEPTION_CHAIN_END) - { - /* Unwind completed, so we don't exit */ - ZwContinue(Context, FALSE); - } - else - { - /* This is an exit_unwind or the frame wasn't present in the list */ - ZwRaiseException(ExceptionRecord, Context, FALSE); - } -} - -/* EOF */
Modified: trunk/reactos/lib/rtl/rtl.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/rtl/rtl.h?rev=28223&... ============================================================================== --- trunk/reactos/lib/rtl/rtl.h (original) +++ trunk/reactos/lib/rtl/rtl.h Wed Aug 8 00:46:24 2007 @@ -24,11 +24,15 @@ #include <ndk/ntndk.h>
/* Internal RTL header */ -#include <reactos/helper.h> #include "rtlp.h"
+/* PSEH Support */ +#include <reactos/helper.h> #include <pseh/pseh.h> + +#ifndef _MSC_VER #include <intrin.h> +#endif
#endif /* RTL_H */
Modified: trunk/reactos/lib/rtl/rtl.rbuild URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/rtl/rtl.rbuild?rev=2822... ============================================================================== --- trunk/reactos/lib/rtl/rtl.rbuild (original) +++ trunk/reactos/lib/rtl/rtl.rbuild Wed Aug 8 00:46:24 2007 @@ -10,7 +10,7 @@ <directory name="i386"> <file>debug_asm.S</file> <file>except_asm.s</file> - <file>exception.c</file> + <file>except.c</file> <file>random_asm.S</file> <file>rtlswap.S</file> <file>rtlmem.s</file>