ExpRaiseHardError
NTSTATUS __stdcall ExpRaiseHardError(
INT64 ErrorStatus,
UINT64 NumberOfParameters,
UINT64 UnicodeStringParameterMask,
UINT64 *Parameters,
UINT64 *TrustedParameters,
UINT64 ValidResponseOptions,
UINT64 *Response){
unsigned int v7;
unsigned int v8;
_ESERVERSILO_GLOBALS *CurrentServerSiloGlobals;
char PreviousMode;
unsigned int v11;
char v13;
_EPROCESS *Process;
int v15;
_ADAPTER_OBJECT *ExpDefaultErrorPort;
char v17;
_ETHREAD *CurrentThread;
_BYTE *Teb;
bool v20;
int v21;
int v22;
int v23;
UINT64 Alertable;
unsigned int UnicodeStringParameterMaska;
int v26;
CHAR WaitMode[8];
_PORT_MESSAGE ReceiveMessage;
unsigned int v30;
__int64 v31;
int v32;
unsigned int v33;
int v34;
int v35;
char v36[616];
UnicodeStringParameterMaska = UnicodeStringParameterMask;
v7 = NumberOfParameters;
v8 = ErrorStatus;
v26 = NumberOfParameters;
CurrentServerSiloGlobals = PsGetCurrentServerSiloGlobals((_KSPIN_LOCK *)ErrorStatus);
PreviousMode = KeGetCurrentThread()->PreviousMode;
v11 = 0;
*(_DWORD *)Response = 0;
if( v7 > 0x4D )
return -1073741811;
v13 = 0;
if( (_DWORD)ValidResponseOptions == 6 )
{
if( !SeSinglePrivilegeCheck(*(_QWORD *)&SeShutdownPrivilege, PreviousMode) )
return -1073741727;
if( !PsIsCurrentThreadInServerSilo() )
ExReadyForErrors = 0;
CurrentServerSiloGlobals->HardErrorState = 2;
v13 = 1;
}
Process = KeGetCurrentThread()->ApcState.Process;
v15 = *(_DWORD *)&KeGetCurrentThread()[1].gapD8[8] & 0x10;
if( !v15 && (v8 & 0xC0000000) == -1073741824 && (!CurrentServerSiloGlobals->HardErrorState || v13) )
{
ExpSystemErrorHandler(v8, v7, UnicodeStringParameterMaska, TrustedParameters, PreviousMode != 0, Alertable);
return 0;
}
if( Process == CurrentServerSiloGlobals->ExpDefaultErrorPortProcess )
{
if( (v8 & 0xC0000000) == -1073741824 )
ExpSystemErrorHandler(v8, v7, UnicodeStringParameterMaska, TrustedParameters, PreviousMode != 0, Alertable);
LABEL_37:
*(_DWORD *)Response = 0;
return 0;
}
ExpDefaultErrorPort = 0i64;
v17 = 0;
if( !v15 && ((Process->DefaultHardErrorProcessing & 1) != 0 || (v8 & 0x10000000) != 0) )
{
ExpDefaultErrorPort = (_ADAPTER_OBJECT *)PsCaptureExceptionPort(Process);
if( ExpDefaultErrorPort )
v17 = 1;
else
ExpDefaultErrorPort = (_ADAPTER_OBJECT *)CurrentServerSiloGlobals->ExpDefaultErrorPort;
}
if( ExpDefaultErrorPort
&& ((CurrentThread = (_ETHREAD *)KeGetCurrentThread(), (CurrentThread->Tcb._bf_0 & 0x400) != 0)
|| CurrentThread->Tcb.ApcStateIndex == 1 ? (Teb = 0i64) : (Teb = CurrentThread->Tcb.Teb),
Teb) )
{
v20 = (Teb[5808] & 0x10) == 0;
v21 = 0;
if( !v20 )
v21 = -1073741823;
v22 = UnicodeStringParameterMaska;
if( v21 < 0 )
{
if( v17 == 1 )
HalPutDmaAdapter(ExpDefaultErrorPort);
ExpDefaultErrorPort = 0i64;
}
}
else
{
v22 = UnicodeStringParameterMaska;
}
if( !ExpDefaultErrorPort )
goto LABEL_37;
ReceiveMessage.u1 = (struct {__int16 DataLength;__int16 TotalLength;})7340104;
ReceiveMessage.u2 = (struct {__int16 Type;__int16 DataInfoOffset;})9;
v30 = v8 & 0xEFFFFFFF;
v32 = ValidResponseOptions;
v35 = v22;
v34 = v26;
if( Parameters )
memmove(v36, Parameters, 8 * v7);
v31 = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
*(_QWORD *)WaitMode = 688i64;
v23 = LpcSendWaitReceivePort(
(INT64)ExpDefaultErrorPort,
0x20000i64,
(__m256i *)&ReceiveMessage,
(UINT64)&ReceiveMessage,
(INT64 *)WaitMode,
0i64);
if( v17 == 1 )
HalPutDmaAdapter(ExpDefaultErrorPort);
if( v23 >= 0 )
{
if( v33 <= 0xA )
v11 = v33;
*(_DWORD *)Response = v11;
}
return v23;
}Referenced by:
ExRaiseHardError
NtRaiseHardError