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