[NTOSKRNL] Simplify NtRaiseHardError() by merging the terminating blocks.

- Return the status codes provided by the Ex(p)RaiseHardError() calls.
- Fix the return values in case of failure.
This commit is contained in:
Hermès Bélusca-Maïto 2018-04-01 17:59:31 +02:00
parent ea390c2b3f
commit 6cefd1242d
No known key found for this signature in database
GPG key ID: 3B2539C65E7B93D0

View file

@ -394,7 +394,7 @@ ExRaiseHardError(IN NTSTATUS ErrorStatus,
PVOID UserData = NULL;
PHARDERROR_USER_PARAMETERS UserParams;
PWSTR BufferBase;
ULONG SafeResponse;
ULONG SafeResponse = ResponseNotHandled;
PAGED_CODE();
@ -430,7 +430,12 @@ ExRaiseHardError(IN NTSTATUS ErrorStatus,
&Size,
MEM_COMMIT,
PAGE_READWRITE);
if (!NT_SUCCESS(Status)) return Status;
if (!NT_SUCCESS(Status))
{
/* Return failure */
*Response = ResponseNotHandled;
return Status;
}
/* Set the pointers to our data */
UserParams = UserData;
@ -551,12 +556,14 @@ NtRaiseHardError(IN NTSTATUS ErrorStatus,
{
NTSTATUS Status = STATUS_SUCCESS;
PULONG_PTR SafeParams = NULL;
ULONG SafeResponse;
ULONG SafeResponse = ResponseNotHandled;
UNICODE_STRING SafeString;
ULONG i;
ULONG ParamSize = 0;
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
PAGED_CODE();
/* Validate parameter count */
if (NumberOfParameters > MAXIMUM_HARDERROR_PARAMETERS)
{
@ -662,37 +669,17 @@ NtRaiseHardError(IN NTSTATUS ErrorStatus,
_SEH2_END;
/* Call the system function directly, because we probed */
ExpRaiseHardError(ErrorStatus,
NumberOfParameters,
UnicodeStringParameterMask,
SafeParams,
ValidResponseOptions,
&SafeResponse);
}
else
{
/* Reuse variable */
SafeParams = Parameters;
Status = ExpRaiseHardError(ErrorStatus,
NumberOfParameters,
UnicodeStringParameterMask,
SafeParams,
ValidResponseOptions,
&SafeResponse);
/*
* Call the Executive Function. It will probe and copy pointers to
* user-mode
*/
ExRaiseHardError(ErrorStatus,
NumberOfParameters,
UnicodeStringParameterMask,
SafeParams,
ValidResponseOptions,
&SafeResponse);
}
/* Check if we were called in user-mode */
if (PreviousMode != KernelMode)
{
/* That means we have a buffer to free */
/* Free captured buffer */
if (SafeParams) ExFreePoolWithTag(SafeParams, TAG_ERR);
/* Enter SEH Block for return */
/* Enter SEH Block to return the response */
_SEH2_TRY
{
/* Return the response */
@ -707,6 +694,20 @@ NtRaiseHardError(IN NTSTATUS ErrorStatus,
}
else
{
/* Reuse variable */
SafeParams = Parameters;
/*
* Call the Executive Function. It will probe
* and copy pointers to user-mode.
*/
Status = ExRaiseHardError(ErrorStatus,
NumberOfParameters,
UnicodeStringParameterMask,
SafeParams,
ValidResponseOptions,
&SafeResponse);
/* Return the response */
*Response = SafeResponse;
}
@ -740,6 +741,8 @@ NtSetDefaultHardErrorPort(IN HANDLE PortHandle)
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
NTSTATUS Status = STATUS_UNSUCCESSFUL;
PAGED_CODE();
/* Check if we have the privileges */
if (!SeSinglePrivilegeCheck(SeTcbPrivilege, PreviousMode))
{