IN DWORD nNumberOfArguments,
IN CONST ULONG_PTR *lpArguments);
-#ifdef FEATURE_PAL_SXS
PALIMPORT
-PAL_NORETURN
VOID
PALAPI
-PAL_RaiseException(
- IN PEXCEPTION_POINTERS ExceptionPointers);
-#endif // FEATURE_PAL_SXS
+RaiseFailFastException(
+ IN PEXCEPTION_RECORD pExceptionRecord,
+ IN PCONTEXT pContextRecord,
+ IN DWORD dwFlags);
PALIMPORT
DWORD
/*++
Function:
+ RaiseFailFastException
+
+See MSDN doc.
+--*/
+VOID
+PALAPI
+RaiseFailFastException(
+ IN PEXCEPTION_RECORD pExceptionRecord,
+ IN PCONTEXT pContextRecord,
+ IN DWORD dwFlags)
+{
+ PERF_ENTRY(RaiseFailFastException);
+ ENTRY("RaiseFailFastException");
+
+ TerminateCurrentProcessNoExit(TRUE);
+ PROCAbort();
+
+ LOGEXIT("RaiseFailFastException");
+ PERF_EXIT(RaiseFailFastException);
+}
+
+/*++
+Function:
PROCEndProcess
Called from TerminateProcess and ExitProcess. This does the work of
STATIC_CONTRACT_DEBUG_ONLY;
ShutdownLogging();
- TerminateProcess(GetCurrentProcess(), 123456789);
+ RaiseFailFastException(NULL, NULL, 0);
}
// Whether this thread is already displaying an assert dialog.
return false; // don't stop debugger. No gui.
}
- if (NoGuiOnAssert())
+ if (IsDebuggerPresent() || DebugBreakOnAssert())
{
- TerminateOnAssert();
+ return true; // like a retry
}
- if (DebugBreakOnAssert())
+ if (NoGuiOnAssert())
{
- return true; // like a retry
+ TerminateOnAssert();
}
if (IsDisplayingAssertDlg())
_flushall();
- // TerminateOnAssert();
ShutdownLogging();
- // Failing here implies an error in the runtime - hence we use
- // COR_E_EXECUTIONENGINE
- TerminateProcess(GetCurrentProcess(), COR_E_EXECUTIONENGINE);
+ RaiseFailFastException(NULL, NULL, 0);
UNREACHABLE();
}
pThread->GetFrame()->Pop(pThread);
}
- LOG((LF_EH, LL_INFO10, "D::WLC: Call RaiseFailFastExceptionOnWin7\n"));
+ LOG((LF_EH, LL_INFO10, "D::WLC: Call RaiseFailFastException\n"));
// enable preemptive mode before call into OS to allow runtime suspend to finish
GCX_PREEMP();
HELPER_METHOD_FRAME_END();
return OBJECTREFToObject(pString);
- }
-FCIMPLEND
-
-// Check if the Win32 Error code is an IO error.
-BOOL IsWin32IOError(SCODE scode)
-{
- LIMITED_METHOD_CONTRACT;
-
- switch (scode)
- {
- case ERROR_FILE_NOT_FOUND:
- case ERROR_PATH_NOT_FOUND:
- case ERROR_TOO_MANY_OPEN_FILES:
- case ERROR_ACCESS_DENIED:
- case ERROR_INVALID_HANDLE:
- case ERROR_INVALID_DRIVE:
- case ERROR_WRITE_PROTECT:
- case ERROR_NOT_READY:
- case ERROR_WRITE_FAULT:
- case ERROR_SHARING_VIOLATION:
- case ERROR_LOCK_VIOLATION:
- case ERROR_SHARING_BUFFER_EXCEEDED:
- case ERROR_HANDLE_DISK_FULL:
- case ERROR_BAD_NETPATH:
- case ERROR_DEV_NOT_EXIST:
- case ERROR_FILE_EXISTS:
- case ERROR_CANNOT_MAKE:
- case ERROR_NET_WRITE_FAULT:
- case ERROR_DRIVE_LOCKED:
- case ERROR_OPEN_FAILED:
- case ERROR_BUFFER_OVERFLOW:
- case ERROR_DISK_FULL:
- case ERROR_INVALID_NAME:
- case ERROR_FILENAME_EXCED_RANGE:
- case ERROR_IO_DEVICE:
- case ERROR_DISK_OPERATION_FAILED:
- return TRUE;
-
- default:
- return FALSE;
- }
}
-
+FCIMPLEND
// Check if there is a pending exception or the thread is already aborting. Returns 0 if yes.
// Otherwise, sets the thread up for generating an abort and returns address of ThrowControlForThread
#endif // defined(_TARGET_AMD64_) && defined(FEATURE_HIJACK)
-void RaiseFailFastExceptionOnWin7(PEXCEPTION_RECORD pExceptionRecord, PT_CONTEXT pContext);
-
-// Check if the Win32 Error code is an IO error.
-BOOL IsWin32IOError(SCODE scode);
-
//******************************************************************************
//
// SwallowUnhandledExceptions