https://git.reactos.org/?p=reactos.git;a=commitdiff;h=842605e3ef6c3673d8846…
commit 842605e3ef6c3673d8846181787c1f671a2e8c24
Author: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org>
AuthorDate: Sun Apr 1 15:53:49 2018 +0200
Commit: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org>
CommitDate: Sun Apr 1 22:50:33 2018 +0200
[NTOSKRNL] Don't emit hard errors for the calling thread if hard errors have been disabled for this thread on user-mode side.
---
ntoskrnl/ex/harderr.c | 28 +++++++++++++++++++++++++++-
1 file changed, 27 insertions(+), 1 deletion(-)
diff --git a/ntoskrnl/ex/harderr.c b/ntoskrnl/ex/harderr.c
index 82d22f4926..185d43537e 100644
--- a/ntoskrnl/ex/harderr.c
+++ b/ntoskrnl/ex/harderr.c
@@ -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)
{
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=1fadfea05327c7532b79d…
commit 1fadfea05327c7532b79db6287838b5d4ad9f287
Author: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org>
AuthorDate: Sun Apr 1 15:06:45 2018 +0200
Commit: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org>
CommitDate: Sun Apr 1 22:39:32 2018 +0200
[NTOSKRNL] Update Doxygen descriptions for NtRaiseHardError, ExRaiseHardError, ExpRaiseHardError and NtSetDefaultHardErrorPort.
---
ntoskrnl/ex/harderr.c | 55 ++++++++++++++++++---------------------------------
1 file changed, 19 insertions(+), 36 deletions(-)
diff --git a/ntoskrnl/ex/harderr.c b/ntoskrnl/ex/harderr.c
index a5200e3e74..30fdce8f0a 100644
--- a/ntoskrnl/ex/harderr.c
+++ b/ntoskrnl/ex/harderr.c
@@ -85,30 +85,15 @@ ExpSystemErrorHandler(IN NTSTATUS ErrorStatus,
/*++
* @name ExpRaiseHardError
+ * @implemented
*
- * For now it's a stub
- *
- * @param ErrorStatus
- * FILLME
- *
- * @param NumberOfParameters
- * FILLME
- *
- * @param UnicodeStringParameterMask
- * FILLME
- *
- * @param Parameters
- * FILLME
- *
- * @param ValidResponseOptions
- * FILLME
- *
- * @param Response
- * FILLME
- *
- * @return None
+ * See ExRaiseHardError and NtRaiseHardError, same parameters.
*
- * @remarks None
+ * This function performs the central work for both ExRaiseHardError
+ * and NtRaiseHardError. ExRaiseHardError is the service for kernel-mode
+ * that copies the parameters to user-mode, and NtRaiseHardError is the
+ * service for both kernel-mode and user-mode that performs parameters
+ * validation and capture if necessary.
*
*--*/
NTSTATUS
@@ -342,7 +327,7 @@ ExSystemExceptionFilter(VOID)
* @name ExRaiseHardError
* @implemented
*
- * See NtRaiseHardError
+ * See NtRaiseHardError and ExpRaiseHardError.
*
* @param ErrorStatus
* Error Code
@@ -362,9 +347,7 @@ ExSystemExceptionFilter(VOID)
* @param Response
* Pointer to HARDERROR_RESPONSE enumeration
*
- * @return None
- *
- * @remarks None
+ * @return Status
*
*--*/
NTSTATUS
@@ -489,9 +472,9 @@ ExRaiseHardError(IN NTSTATUS ErrorStatus,
* @name NtRaiseHardError
* @implemented
*
- * This function sends HARDERROR_MSG LPC message to listener
- * (typically CSRSS.EXE). See NtSetDefaultHardErrorPort for more information
- * See: http://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/Error…
+ * This function sends HARDERROR_MSG LPC message to a hard-error listener,
+ * typically CSRSS.EXE. See NtSetDefaultHardErrorPort for more information.
+ * See also: http://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/Error…
*
* @param ErrorStatus
* Error Code
@@ -513,8 +496,8 @@ ExRaiseHardError(IN NTSTATUS ErrorStatus,
*
* @return Status
*
- * @remarks NtRaiseHardError is easy way to display message in GUI
- * without loading Win32 API libraries
+ * @remarks NtRaiseHardError constitutes an easy way to display messages
+ * in GUI without loading any Win32 API libraries.
*
*--*/
NTSTATUS
@@ -696,11 +679,11 @@ NtRaiseHardError(IN NTSTATUS ErrorStatus,
* @name NtSetDefaultHardErrorPort
* @implemented
*
- * NtSetDefaultHardErrorPort is typically called only once. After call,
- * kernel set BOOLEAN flag named ExReadyForErrors to TRUE, and all other
- * tries to change default port are broken with STATUS_UNSUCCESSFUL error code
- * See: http://www.windowsitlibrary.com/Content/356/08/2.html
- * http://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/Error…
+ * NtSetDefaultHardErrorPort is typically called only once. After the call,
+ * the kernel sets a BOOLEAN flag named ExReadyForErrors to TRUE, and all other
+ * attempts to change the default port fail with STATUS_UNSUCCESSFUL error code.
+ * See: http://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/Error…
+ * https://web.archive.org/web/20070716133753/http://www.windowsitlibrary.com/…
*
* @param PortHandle
* Handle to named port object
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=f0729b30bb79d6f538cf2…
commit f0729b30bb79d6f538cf2b9578ff8ebe7989f8d3
Author: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org>
AuthorDate: Sun Apr 1 14:46:19 2018 +0200
Commit: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org>
CommitDate: Sun Apr 1 22:39:31 2018 +0200
[NTOSKRNL] Forbid processes without the Tcb prvilege to perform a user-mode hard-error BSOD.
---
ntoskrnl/ex/harderr.c | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/ntoskrnl/ex/harderr.c b/ntoskrnl/ex/harderr.c
index 84f409a1bb..a5200e3e74 100644
--- a/ntoskrnl/ex/harderr.c
+++ b/ntoskrnl/ex/harderr.c
@@ -132,8 +132,18 @@ ExpRaiseHardError(IN NTSTATUS ErrorStatus,
/* Check if this error will shutdown the system */
if (ValidResponseOptions == OptionShutdownSystem)
{
- /* Check for privilege */
- if (!SeSinglePrivilegeCheck(SeShutdownPrivilege, PreviousMode))
+ /*
+ * Check if we have the privileges.
+ *
+ * NOTE: In addition to the Shutdown privilege we also check whether
+ * the caller has the Tcb privilege. The purpose is to allow only
+ * SYSTEM processes to "shutdown" the system on hard errors (BSOD)
+ * while forbidding regular processes to do so. This behaviour differs
+ * from Windows, where any user-mode process, as soon as it has the
+ * Shutdown privilege, can trigger a hard-error BSOD.
+ */
+ if (!SeSinglePrivilegeCheck(SeTcbPrivilege, PreviousMode) ||
+ !SeSinglePrivilegeCheck(SeShutdownPrivilege, PreviousMode))
{
/* No rights */
*Response = ResponseNotHandled;