From 837f31e111d916fd178f9b7f342263246ccfcec3 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Wed, 19 Jan 2005 20:16:26 +0000 Subject: [PATCH] fixed implementation of SetErrorMode() which should rather store the mode in the EPROCESS structure svn path=/trunk/; revision=13136 --- reactos/lib/kernel32/except/except.c | 40 ++++++++++++++++++++++++-- reactos/ntoskrnl/cc/copy.c | 2 +- reactos/ntoskrnl/cc/view.c | 2 +- reactos/ntoskrnl/include/ntoskrnl.h | 2 ++ reactos/ntoskrnl/ke/i386/exp.c | 2 +- reactos/ntoskrnl/mm/pool.c | 1 - reactos/ntoskrnl/mm/virtual.c | 1 - reactos/ntoskrnl/ps/process.c | 43 ++++++++++++++++++++++++---- reactos/ntoskrnl/ps/w32call.c | 2 +- 9 files changed, 80 insertions(+), 15 deletions(-) diff --git a/reactos/lib/kernel32/except/except.c b/reactos/lib/kernel32/except/except.c index 5350e830c3b..a02b159ab40 100644 --- a/reactos/lib/kernel32/except/except.c +++ b/reactos/lib/kernel32/except/except.c @@ -15,9 +15,28 @@ #define NDEBUG #include "../include/debug.h" -UINT GlobalErrorMode = 0; LPTOP_LEVEL_EXCEPTION_FILTER GlobalTopLevelExceptionFilter = UnhandledExceptionFilter; +UINT +STDCALL +GetErrorMode(VOID) +{ + NTSTATUS Status; + UINT ErrMode; + + Status = NtQueryInformationProcess(NtCurrentProcess(), + ProcessDefaultHardErrorMode, + (PVOID)&ErrMode, + sizeof(ErrMode), + NULL); + if(!NT_SUCCESS(Status)) + { + SetLastErrorByStatus(Status); + return 0; + } + + return ErrMode; +} /* * @implemented @@ -26,7 +45,22 @@ UINT STDCALL SetErrorMode(UINT uMode) { - return (UINT)InterlockedExchange((LONG*)&GlobalErrorMode, (LONG)uMode); + UINT PrevErrMode; + NTSTATUS Status; + + PrevErrMode = GetErrorMode(); + + Status = NtSetInformationProcess(NtCurrentProcess(), + ProcessDefaultHardErrorMode, + (PVOID)&uMode, + sizeof(uMode)); + if(!NT_SUCCESS(Status)) + { + SetLastErrorByStatus(Status); + return 0; + } + + return PrevErrMode; } @@ -114,7 +148,7 @@ UnhandledExceptionFilter(struct _EXCEPTION_POINTERS *ExceptionInfo) return EXCEPTION_CONTINUE_SEARCH; } - if ((GlobalErrorMode & SEM_NOGPFAULTERRORBOX) == 0) + if ((GetErrorMode() & SEM_NOGPFAULTERRORBOX) == 0) { #ifdef _X86_ PULONG Frame; diff --git a/reactos/ntoskrnl/cc/copy.c b/reactos/ntoskrnl/cc/copy.c index 0d34be9d140..ab59de0eb2b 100644 --- a/reactos/ntoskrnl/cc/copy.c +++ b/reactos/ntoskrnl/cc/copy.c @@ -25,7 +25,7 @@ static PFN_TYPE CcZeroPage = 0; #define MAX_RW_LENGTH (256 * 1024) #if defined(__GNUC__) -void * alloca(size_t size); +/* void * alloca(size_t size); */ #elif defined(_MSC_VER) void* _alloca(size_t size); #else diff --git a/reactos/ntoskrnl/cc/view.c b/reactos/ntoskrnl/cc/view.c index 86fb01b2532..4cd85bcb911 100644 --- a/reactos/ntoskrnl/cc/view.c +++ b/reactos/ntoskrnl/cc/view.c @@ -100,7 +100,7 @@ static CLIENT_ID LazyCloseThreadId; static volatile BOOLEAN LazyCloseThreadShouldTerminate; #if defined(__GNUC__) -void * alloca(size_t size); +/* void * alloca(size_t size); */ #elif defined(_MSC_VER) void* _alloca(size_t size); #else diff --git a/reactos/ntoskrnl/include/ntoskrnl.h b/reactos/ntoskrnl/include/ntoskrnl.h index 5ee4af3f06f..a2c9144a57a 100755 --- a/reactos/ntoskrnl/include/ntoskrnl.h +++ b/reactos/ntoskrnl/include/ntoskrnl.h @@ -62,4 +62,6 @@ #include #include +#include + #endif /* INCLUDE_NTOSKRNL_H */ diff --git a/reactos/ntoskrnl/ke/i386/exp.c b/reactos/ntoskrnl/ke/i386/exp.c index 97c451ddd18..70c2f31fb6d 100644 --- a/reactos/ntoskrnl/ke/i386/exp.c +++ b/reactos/ntoskrnl/ke/i386/exp.c @@ -30,7 +30,7 @@ /* INCLUDES *****************************************************************/ #include -#include + #define NDEBUG #include diff --git a/reactos/ntoskrnl/mm/pool.c b/reactos/ntoskrnl/mm/pool.c index 7164e6a5d18..98a62bc0f9b 100644 --- a/reactos/ntoskrnl/mm/pool.c +++ b/reactos/ntoskrnl/mm/pool.c @@ -10,7 +10,6 @@ /* INCLUDES ****************************************************************/ #include -#include #define NDEBUG #include diff --git a/reactos/ntoskrnl/mm/virtual.c b/reactos/ntoskrnl/mm/virtual.c index b0a059fdaf3..dc464a5267f 100644 --- a/reactos/ntoskrnl/mm/virtual.c +++ b/reactos/ntoskrnl/mm/virtual.c @@ -27,7 +27,6 @@ /* INCLUDE *****************************************************************/ #include -#include #define NDEBUG #include diff --git a/reactos/ntoskrnl/ps/process.c b/reactos/ntoskrnl/ps/process.c index 1763e01a371..9268cdf73cf 100644 --- a/reactos/ntoskrnl/ps/process.c +++ b/reactos/ntoskrnl/ps/process.c @@ -1139,7 +1139,7 @@ NtQueryInformationProcess(IN HANDLE ProcessHandle, */ Status = ObReferenceObjectByHandle(ProcessHandle, - PROCESS_SET_INFORMATION, + PROCESS_QUERY_INFORMATION, PsProcessType, UserMode, (PVOID*)&Process, @@ -1272,12 +1272,21 @@ NtQueryInformationProcess(IN HANDLE ProcessHandle, else { PULONG HardErrMode = (PULONG)ProcessInformation; - *HardErrMode = Process->DefaultHardErrorProcessing; - - if (ReturnLength) + _SEH_TRY { - *ReturnLength = sizeof(ULONG); + *HardErrMode = Process->DefaultHardErrorProcessing; + if (ReturnLength) + { + *ReturnLength = sizeof(ULONG); + } + + Status = STATUS_SUCCESS; } + _SEH_HANDLE + { + Status = _SEH_GetExceptionCode(); + } + _SEH_END; } break; @@ -1445,10 +1454,32 @@ NtSetInformationProcess(IN HANDLE ProcessHandle, ProcessAccessTokenP = (PHANDLE)ProcessInformation; Status = PspAssignPrimaryToken(Process, *ProcessAccessTokenP); break; + + case ProcessDefaultHardErrorMode: + { + if(ProcessInformationLength != sizeof(UINT)) + { + Status = STATUS_INFO_LENGTH_MISMATCH; + } + else + { + _SEH_TRY + { + InterlockedExchange((LONG*)&Process->DefaultHardErrorProcessing, + *(PLONG)ProcessInformation); + Status = STATUS_SUCCESS; + } + _SEH_HANDLE + { + Status = _SEH_GetExceptionCode(); + } + _SEH_END; + } + break; + } case ProcessLdtInformation: case ProcessLdtSize: - case ProcessDefaultHardErrorMode: case ProcessIoPortHandlers: case ProcessWorkingSetWatch: case ProcessUserModeIOPL: diff --git a/reactos/ntoskrnl/ps/w32call.c b/reactos/ntoskrnl/ps/w32call.c index 2318a6af27b..37a634bedb3 100644 --- a/reactos/ntoskrnl/ps/w32call.c +++ b/reactos/ntoskrnl/ps/w32call.c @@ -25,7 +25,7 @@ #include #if defined(__GNUC__) -void * alloca(size_t size); +/* void * alloca(size_t size); */ #elif defined(_MSC_VER) void* _alloca(size_t size); #else