ExpRaiseHardError
INT64 __stdcall ExpRaiseHardError(
INT64 ErrorStatus,
UINT64 NumberOfParameters,
UINT64 UnicodeStringParameterMask,
UINT64 *Parameters,
UINT64 *TrustedParameters,
UINT64 ValidResponseOptions,
UINT64 *Response){
unsigned int v7;
unsigned int v8;
__int64 *CurrentServerSiloGlobals;
INT8 v10;
unsigned int v11;
char v13;
__int64 v14;
int v15;
struct _DMA_ADAPTER *v16;
char v17;
struct _DMA_ADAPTER *v18;
_ETHREAD *CurrentThread;
__int64 v20;
bool v21;
int v22;
int v23;
int v24;
unsigned int UnicodeStringParameterMaska;
int v26;
INT64 v28;
__m256i v29;
unsigned int v30;
__int64 v31;
int v32;
unsigned int v33;
int v34;
int v35;
char dst[616];
UnicodeStringParameterMaska = UnicodeStringParameterMask;
v7 = NumberOfParameters;
v8 = ErrorStatus;
v26 = NumberOfParameters;
CurrentServerSiloGlobals = PsGetCurrentServerSiloGlobals();
v10 = *((_BYTE *)KeGetCurrentThread() + 562);
v11 = 0;
*(_DWORD *)Response = 0;
if( v7 > 0x4D )
return 3221225485i64;
v13 = 0;
if( (_DWORD)ValidResponseOptions == 6 )
{
if( !SeSinglePrivilegeCheck(*(_QWORD *)&SeShutdownPrivilege, v10) )
return 3221225569i64;
if( !PsIsCurrentThreadInServerSilo() )
ExReadyForErrors = 0;
*((_DWORD *)CurrentServerSiloGlobals + 224) = 2;
v13 = 1;
}
v14 = *((_QWORD *)KeGetCurrentThread() + 23);
v15 = *((_DWORD *)KeGetCurrentThread() + 324) & 0x10;
if( !v15 && (v8 & 0xC0000000) == -1073741824 && (!*((_DWORD *)CurrentServerSiloGlobals + 224) || v13) )
{
ExpSystemErrorHandler(v8, v7, UnicodeStringParameterMaska, TrustedParameters, v10 != 0);
return 0i64;
}
if( v14 == CurrentServerSiloGlobals[110] )
{
if( (v8 & 0xC0000000) == -1073741824 )
ExpSystemErrorHandler(v8, v7, UnicodeStringParameterMaska, TrustedParameters, v10 != 0);
LABEL_37:
*(_DWORD *)Response = 0;
return 0i64;
}
v16 = 0i64;
v17 = 0;
if( !v15 && ((*(_BYTE *)(v14 + 1528) & 1) != 0 || (v8 & 0x10000000) != 0) )
{
LODWORD(v18) = PsCaptureExceptionPort((_EPROCESS *)v14);
v16 = v18;
if( v18 )
v17 = 1;
else
v16 = (struct _DMA_ADAPTER *)CurrentServerSiloGlobals[111];
}
if( v16
&& ((CurrentThread = (_ETHREAD *)KeGetCurrentThread(), (*((_DWORD *)CurrentThread + 29) & 0x400) != 0)
|| *((_BYTE *)CurrentThread + 586) == 1 ? (v20 = 0i64) : (v20 = *((_QWORD *)CurrentThread + 30)),
v20) )
{
v21 = (*(_BYTE *)(v20 + 5808) & 0x10) == 0;
v22 = 0;
if( !v21 )
v22 = -1073741823;
v23 = UnicodeStringParameterMaska;
if( v22 < 0 )
{
if( v17 == 1 )
HalPutDmaAdapter(v16);
v16 = 0i64;
}
}
else
{
v23 = UnicodeStringParameterMaska;
}
if( !v16 )
goto LABEL_37;
v29.m256i_i64[0] = 0x900700048i64;
v30 = v8 & 0xEFFFFFFF;
v32 = ValidResponseOptions;
v35 = v23;
v34 = v26;
if( Parameters )
memmove((UINT8 *)dst, (UINT8 *)Parameters, 8i64 * v7);
v31 = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
v28 = 688i64;
v24 = LpcSendWaitReceivePort((INT64)v16, 0x20000i64, &v29, (UINT64)&v29, &v28, 0i64);
if( v17 == 1 )
HalPutDmaAdapter(v16);
if( v24 >= 0 )
{
if( v33 <= 0xA )
v11 = v33;
*(_DWORD *)Response = v11;
}
return(unsigned int)v24;
}Referenced by:
ExRaiseHardError
NtRaiseHardError