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[2]; 
  struct _KAPC_STATE ApcState; 
  v7 = 0;
  memset(&ApcState, 0, sizeof(ApcState));
  if( (int)PsGetServerSiloState((INT64)Silo) < 2 )
  {
    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 != *((_EPROCESS **)KeGetCurrentThread() + 23) )
          KeStackAttachProcess((PRKPROCESS)v12, &ApcState);
        KeBugCheckEx(0xEFu, (ULONG_PTR)Object, v11 == 6, 0i64, 0i64);
      }
      if( !v10 )
        PsTerminateServerSilo(Silo, (unsigned int)ExitStatus);
      return;
    }
    DbgPrintEx(0, 0, v8, Object, v9);
    while( 1 )
    {
      if( (_BYTE)KdDebuggerNotPresent )
        goto LABEL_14;
      DbgPrompt((PSTR)"Break, or Ignore(bi)? ", Response, 2ui64);
      if( Response[0] == 66 )
        goto LABEL_11;
      if( Response[0] != 73 )
        break;
LABEL_12:
      v7 = 1;
LABEL_13:
      if( v7 )
        goto LABEL_14;
    }
    if( Response[0] != 98 )
    {
      if( Response[0] != 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