Converted kernel32 process creation to use PSEH (untested change to help Alex) Modified: trunk/reactos/lib/kernel32/process/create.c _____
Modified: trunk/reactos/lib/kernel32/process/create.c --- trunk/reactos/lib/kernel32/process/create.c 2005-06-20 01:52:47 UTC (rev 16129) +++ trunk/reactos/lib/kernel32/process/create.c 2005-06-20 03:42:05 UTC (rev 16130) @@ -276,45 +276,25 @@
}
-static EXCEPTION_DISPOSITION __cdecl -_except_handler(EXCEPTION_RECORD *ExceptionRecord, - void * EstablisherFrame, - CONTEXT *ContextRecord, - void * DispatcherContext) +_SEH_FILTER(BaseExceptionFilter) { - EXCEPTION_POINTERS ExceptionInfo; - EXCEPTION_DISPOSITION ExceptionDisposition = EXCEPTION_EXECUTE_HANDLER; + EXCEPTION_POINTERS * ExceptionInfo = _SEH_GetExceptionPointers(); + LONG ExceptionDisposition = EXCEPTION_EXECUTE_HANDLER;
- ExceptionInfo.ExceptionRecord = ExceptionRecord; - ExceptionInfo.ContextRecord = ContextRecord; - if (GlobalTopLevelExceptionFilter != NULL) { _SEH_TRY { - ExceptionDisposition = GlobalTopLevelExceptionFilter(&ExceptionInfo); + ExceptionDisposition = GlobalTopLevelExceptionFilter(ExceptionInfo); } _SEH_HANDLE { - ExceptionDisposition = UnhandledExceptionFilter(&ExceptionInfo); + ExceptionDisposition = UnhandledExceptionFilter(ExceptionInfo); } _SEH_END; }
- if (ExceptionDisposition == EXCEPTION_EXECUTE_HANDLER) - ExitProcess(ExceptionRecord->ExceptionCode); - - /* translate EXCEPTION_XXX defines into EXCEPTION_DISPOSITION enum values */ - if (ExceptionDisposition == EXCEPTION_CONTINUE_EXECUTION) - { - return ExceptionContinueExecution; - } - else if (ExceptionDisposition == EXCEPTION_CONTINUE_SEARCH) - { - return ExceptionContinueSearch; - } - - return -1; /* unknown return from UnhandledExceptionFilter */ + return ExceptionDisposition; }
@@ -326,10 +306,15 @@
DPRINT("BaseProcessStart(..) - setting up exception frame.\n");
- __try1(_except_handler) + _SEH_TRY { uExitCode = (lpStartAddress)((PVOID)lpParameter); - } __except1 + } + _SEH_EXCEPT(BaseExceptionFilter) + { + uExitCode = _SEH_GetExceptionCode(); + } + _SEH_END;
ExitProcess(uExitCode); }