[NTOSKRNL] Don't emit hard errors for the calling thread if hard errors have been disabled for this thread on user-mode side.

This commit is contained in:
Hermès Bélusca-Maïto 2018-04-01 15:53:49 +02:00
parent 3a0ecb3dc8
commit 842605e3ef
No known key found for this signature in database
GPG key ID: 3B2539C65E7B93D0

View file

@ -105,13 +105,14 @@ ExpRaiseHardError(IN NTSTATUS ErrorStatus,
IN ULONG ValidResponseOptions,
OUT PULONG Response)
{
NTSTATUS Status;
PEPROCESS Process = PsGetCurrentProcess();
PETHREAD Thread = PsGetCurrentThread();
UCHAR Buffer[PORT_MAXIMUM_MESSAGE_LENGTH];
PHARDERROR_MSG Message = (PHARDERROR_MSG)Buffer;
NTSTATUS Status;
HANDLE PortHandle;
KPROCESSOR_MODE PreviousMode = KeGetPreviousMode();
PAGED_CODE();
/* Check if this error will shutdown the system */
@ -182,6 +183,31 @@ ExpRaiseHardError(IN NTSTATUS ErrorStatus,
/* If hard errors are disabled, do nothing */
if (Thread->HardErrorsAreDisabled) PortHandle = NULL;
/*
* If this is not the system thread, check whether hard errors are
* disabled for this thread on user-mode side, and if so, do nothing.
*/
if (!Thread->SystemThread && (PortHandle != NULL))
{
/* Check if we have a TEB */
PTEB Teb = PsGetCurrentThread()->Tcb.Teb;
if (Teb)
{
_SEH2_TRY
{
if (Teb->HardErrorMode & RTL_SEM_FAILCRITICALERRORS)
{
PortHandle = NULL;
}
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
NOTHING;
}
_SEH2_END;
}
}
/* Now check if we have a port */
if (PortHandle == NULL)
{