#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
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;
}
return EXCEPTION_CONTINUE_SEARCH;
}
- if ((GlobalErrorMode & SEM_NOGPFAULTERRORBOX) == 0)
+ if ((GetErrorMode() & SEM_NOGPFAULTERRORBOX) == 0)
{
#ifdef _X86_
PULONG Frame;
#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
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
#include <napi/teb.h>
#include <napi/win32.h>
+#include <pseh.h>
+
#endif /* INCLUDE_NTOSKRNL_H */
/* INCLUDES *****************************************************************/
#include <ntoskrnl.h>
-#include <pseh.h>
+
#define NDEBUG
#include <internal/debug.h>
/* INCLUDES ****************************************************************/
#include <ntoskrnl.h>
-#include <pseh.h>
#define NDEBUG
#include <internal/debug.h>
/* INCLUDE *****************************************************************/
#include <ntoskrnl.h>
-#include <pseh.h>
#define NDEBUG
#include <internal/debug.h>
*/
Status = ObReferenceObjectByHandle(ProcessHandle,
- PROCESS_SET_INFORMATION,
+ PROCESS_QUERY_INFORMATION,
PsProcessType,
UserMode,
(PVOID*)&Process,
else
{
PULONG HardErrMode = (PULONG)ProcessInformation;
- *HardErrMode = Process->DefaultHardErrorProcessing;
+ _SEH_TRY
+ {
+ *HardErrMode = Process->DefaultHardErrorProcessing;
+ if (ReturnLength)
+ {
+ *ReturnLength = sizeof(ULONG);
+ }
- if (ReturnLength)
+ Status = STATUS_SUCCESS;
+ }
+ _SEH_HANDLE
{
- *ReturnLength = sizeof(ULONG);
+ Status = _SEH_GetExceptionCode();
}
+ _SEH_END;
}
break;
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:
#include <internal/debug.h>
#if defined(__GNUC__)
-void * alloca(size_t size);
+/* void * alloca(size_t size); */
#elif defined(_MSC_VER)
void* _alloca(size_t size);
#else