PspCatchCriticalBreak

VOID __stdcall PspCatchCriticalBreak(INT8 *Msg, PVOID Object, UINT8 *ImageFileName, _EJOB *Silo, INT64 ExitStatus){
  char v7; 
  const char *v8; 
  __int64 v9; 
  char v10; 
  char v11; 
  _EPROCESS *v12; 
  char Response; 
  _KAPC_STATE ApcState; 

  v7 = 0;
  memset(&ApcState, 0, sizeof(ApcState));
  if( PsGetServerSiloState(Silo) < SERVERSILO_SHUTTING_DOWN )
  {
    v10 = 0;
    if( !(_BYTE)KdDebuggerEnabled )
    {
LABEL_15:
      v11 = *(_BYTE *)Object & 0x7F;
      if( v11 == 6 )
        v12 = (_EPROCESS *)*((_QWORD *)Object + 68);
      else
        v12 = (_EPROCESS *)Object;
      if( PsIsHostSilo(Silo) )
      {
        if( v12 != KeGetCurrentThread()->ApcState.Process )
          KeStackAttachProcess(&v12->Pcb, &ApcState);
        KeBugCheckEx(0xEFu, Object, (PVOID)(v11 == 6), 0i64, 0i64);
      }
      if( !v10 )
        PsTerminateServerSilo();
      return;
    }
    DbgPrintEx(0, 0, v8, Object, v9);
    while( 1 )
    {
      if( (_BYTE)KdDebuggerNotPresent )
        goto LABEL_14;
      DbgPrompt((INT64)"Break, or Ignore(bi)? ");
      if( Response == 66 )
        goto LABEL_11;
      if( Response != 73 )
        break;
LABEL_12:
      v7 = 1;
LABEL_13:
      if( v7 )
        goto LABEL_14;
    }
    if( Response != 98 )
    {
      if( Response != 105 )
        goto LABEL_13;
      goto LABEL_12;
    }
LABEL_11:
    __debugbreak();
    goto LABEL_12;
  }
  v10 = 1;
  v7 = 1;
LABEL_14:
  if( !v7 )
    goto LABEL_15;
}

Referenced by:

PspExitThread
PspTerminateAllThreads
PspTerminateThreadByPointer