- re-add support for vectored exception handling which was removed by
the major refactoring patch (r17811)
- make vmwinst depend on vectored exception handling so this doesn't
happen again
Modified: trunk/reactos/lib/ntdll/main/dispatch.c
Modified: trunk/reactos/lib/ntdll/main/i386/dispatch.S
Modified: trunk/reactos/lib/rtl/vectoreh.c
Modified: trunk/reactos/subsys/system/vmwinst/vmwinst.c
_____
Modified: trunk/reactos/lib/ntdll/main/dispatch.c
--- trunk/reactos/lib/ntdll/main/dispatch.c 2005-10-22 13:37:48 UTC
(rev 18675)
+++ trunk/reactos/lib/ntdll/main/dispatch.c 2005-10-22 14:05:20 UTC
(rev 18676)
@@ -14,6 +14,10 @@
typedef NTSTATUS (NTAPI *USER_CALL)(PVOID Argument, ULONG
ArgumentLength);
+EXCEPTION_DISPOSITION NTAPI
+RtlpExecuteVectoredExceptionHandlers(IN PEXCEPTION_RECORD
ExceptionRecord,
+ IN PCONTEXT Context);
+
/* FUNCTIONS
****************************************************************/
/*
@@ -27,16 +31,26 @@
EXCEPTION_RECORD NestedExceptionRecord;
NTSTATUS Status;
- /* Dispatch the exception and check the result */
- if(RtlDispatchException(ExceptionRecord, Context))
+ /* call the vectored exception handlers */
+ if(RtlpExecuteVectoredExceptionHandlers(ExceptionRecord,
+ Context) !=
ExceptionContinueExecution)
{
- /* Continue executing */
- Status = NtContinue(Context, FALSE);
+ goto ContinueExecution;
}
else
{
- /* Raise an exception */
- Status = NtRaiseException(ExceptionRecord, Context, FALSE);
+ /* Dispatch the exception and check the result */
+ if(RtlDispatchException(ExceptionRecord, Context))
+ {
+ContinueExecution:
+ /* Continue executing */
+ Status = NtContinue(Context, FALSE);
+ }
+ else
+ {
+ /* Raise an exception */
+ Status = NtRaiseException(ExceptionRecord, Context, FALSE);
+ }
}
/* Setup the Exception record */
_____
Modified: trunk/reactos/lib/ntdll/main/i386/dispatch.S
--- trunk/reactos/lib/ntdll/main/i386/dispatch.S 2005-10-22
13:37:48 UTC (rev 18675)
+++ trunk/reactos/lib/ntdll/main/i386/dispatch.S 2005-10-22
14:05:20 UTC (rev 18676)
@@ -141,15 +141,24 @@
mov ecx, [esp+4]
mov ebx, [esp]
- /* Dispatch the exception */
push ecx
push ebx
+
+ /* Call the vectored exception handler */
+ call _RtlpExecuteVectoredExceptionHandlers@8
+
+ /* Check for success */
+ or al, al
+ jnz ContinueExecution
+
+ /* Dispatch the exception */
call _RtlDispatchException@8
/* Check for success */
or al, al
jz RaiseException
+ContinueExecution:
/* Pop off the records */
pop ebx
pop ecx
_____
Modified: trunk/reactos/lib/rtl/vectoreh.c
--- trunk/reactos/lib/rtl/vectoreh.c 2005-10-22 13:37:48 UTC (rev
18675)
+++ trunk/reactos/lib/rtl/vectoreh.c 2005-10-22 14:05:20 UTC (rev
18676)
@@ -28,7 +28,7 @@
/* FUNCTIONS
***************************************************************/
-EXCEPTION_DISPOSITION
+EXCEPTION_DISPOSITION NTAPI
RtlpExecuteVectoredExceptionHandlers(IN PEXCEPTION_RECORD
ExceptionRecord,
IN PCONTEXT Context)
{
_____
Modified: trunk/reactos/subsys/system/vmwinst/vmwinst.c
--- trunk/reactos/subsys/system/vmwinst/vmwinst.c 2005-10-22
13:37:48 UTC (rev 18675)
+++ trunk/reactos/subsys/system/vmwinst/vmwinst.c 2005-10-22
14:05:20 UTC (rev 18676)
@@ -60,10 +60,9 @@
/* Helper functions */
-LONG WINAPI ExceptionHandler(LPEXCEPTION_POINTERS ExceptionInfo)
+LONG CALLBACK VectoredExceptionHandler(PEXCEPTION_POINTERS
ExceptionInfo)
{
- /* This is rude, but i don't know how to continue execution properly,
that's why
- we just exit here when we're not running inside of VMware */
+ /* we're not running in VMware, just terminate the process */
ExitProcess(ExceptionInfo->ExceptionRecord->ExceptionCode ==
EXCEPTION_PRIV_INSTRUCTION);
return EXCEPTION_CONTINUE_EXECUTION;
}
@@ -1196,23 +1195,28 @@
int nCmdShow)
{
- LPTOP_LEVEL_EXCEPTION_FILTER OldHandler;
+ PVOID ExceptionHandler;
int Version;
WCHAR *lc;
hAppInstance = hInstance;
- /* Setup our exception "handler" ;-) */
- OldHandler = SetUnhandledExceptionFilter(ExceptionHandler);
+ /* Setup a vectored exception handler to protect the detection. Don't
use SEH
+ here so we notice the next time someone removes support for
vectored
+ exception handling from ros... */
+ if (!(ExceptionHandler = AddVectoredExceptionHandler(0,
+
VectoredExceptionHandler)))
+ {
+ return 1;
+ }
if(!DetectVMware(&Version))
{
- ExitProcess(1);
return 1;
}
- /* restore the exception handler */
- SetUnhandledExceptionFilter(OldHandler);
+ /* unregister the handler */
+ RemoveVectoredExceptionHandler(ExceptionHandler);
lc = DestinationPath;
lc += GetSystemDirectory(DestinationPath, MAX_PATH) - 1;