RtlDispatchException

UINT8 __stdcall RtlDispatchException(EXCEPTION_RECORD *ExceptionRecord, CONTEXT *ContextRecord){
  UINT8 v4; 
  unsigned int v5; 
  unsigned __int64 Rsp; 
  int v7; 
  unsigned __int64 v8; 
  void *v9; 
  void *Rip; 
  UNWIND_HISTORY_TABLE *p_HistoryTable; 
  UINT64 *v12; 
  unsigned __int64 v13; 
  INT64 v14; 
  INT64 v15; 
  INT64 v16; 
  UINT64 v17; 
  int v18; 
  int v19; 
  bool v20; 
  INT64 v21; 
  PVOID v22; 
  INT64 v23; 
  INT64 v24; 
  int v25; 
  int v26; 
  int v27; 
  INT64 v28; 
  __int64 v29; 
  UINT64 v30; 
  char v31; 
  int v32; 
  INT64 v33; 
  bool IsFrameInBounds; 
  __int128 a2; 
  INT64 v37; 
  UINT64 HighLimit; 
  UINT64 LowLimit; 
  INT64 a3; 
  unsigned __int64 ImageBase; 
  PVOID v42; 
  unsigned __int64 v43; 
  INT64 a1; 
  DWORD64 ControlPc; 
  unsigned __int64 v46; 
  UINT64 *v47; 
  UINT64 StackFrame; 
  CONTEXT *Source; 
  INT64 v50; 
  PVOID v51; 
  UNWIND_HISTORY_TABLE *v52; 
  DWORD64 *v53; 
  INT64 v54; 
  struct _UNWIND_HISTORY_TABLE HistoryTable; 
  v54 = (INT64)ContextRecord;
  a1 = (INT64)ExceptionRecord;
  HIDWORD(a2) = 0;
  v4 = 0;
  memset((INT64)&ControlPc, 0i64);
  BYTE8(a2) = 0;
  v37 = 0i64;
  v42 = 0i64;
  HighLimit = 0i64;
  ImageBase = 0i64;
  LowLimit = 0i64;
  DWORD1(a2) = 0;
  memset((INT64)HistoryTable.Entry, 0i64);
  if( (NtGlobalFlag & 0x800000) != 0 )
  {
    BYTE8(a2) = 1;
    RtlpLogExceptionDispatch(ExceptionRecord, ContextRecord);
  }
  v5 = ExceptionRecord->ExceptionFlags & 1;
  LODWORD(a2) = v5;
  KeQueryCurrentStackInformation((_KERNEL_STACK_LIMITS *)&a2 + 1, &LowLimit, &HighLimit);
  Rsp = ContextRecord->Rsp;
  v7 = DWORD1(a2) == 10;
  DWORD1(a2) = v7;
  if( !RtlpGetStackLimitsEx(Rsp, (CHAR **)&LowLimit, &HighLimit) )
  {
    ExceptionRecord->ExceptionFlags = v5 | 8;
    return v4;
  }
  RtlGetExtendedContextLength2(0x10000Bui64, (_DWORD *)&a2 + 3, 0i64);
  v8 = HIDWORD(a2) + 15i64;
  if( v8 <= HIDWORD(a2) )
    v8 = 0xFFFFFFFFFFFFFF0i64;
  v9 = alloca(v8 & 0xFFFFFFFFFFFFFFF0ui64);
  RtlInitializeExtendedContext2((INT64)&a2, 1048587i64, &a3, 0i64);
  RtlpCopyContext((CONTEXT *)&a2, ContextRecord);
  Rip = (void *)ContextRecord->Rip;
  v43 = 0i64;
  p_HistoryTable = &HistoryTable;
  HistoryTable.Count = 0;
  HistoryTable.HighAddress = 0i64;
  *(_DWORD *)&HistoryTable.LocalHint = 0x1000000;
  HistoryTable.LowAddress = -1i64;
  while( 1 )
  {
    v12 = RtlLookupFunctionEntry(Rip, &ImageBase, p_HistoryTable);
    if( !v12 )
    {
      if( Rip == (void *)*v53 )
        goto LABEL_52;
      HistoryTable.Entry[3].ImageBase = *v53++;
      RtlpPopUserShadowStack((INT64)&a2);
      goto LABEL_11;
    }
    v13 = ImageBase;
    v14 = RtlVirtualUnwind(1i64, ImageBase, (UINT64)Rip);
    v15 = v37;
    v16 = v14;
    if( !RtlpIsFrameInBounds(&LowLimit, v37, &HighLimit) )
    {
      if( BYTE4(a2) == 1 )
      {
        BYTE4(a2) = 2;
        RtlpGetStackLimitsEx(v15, (CHAR **)&LowLimit, &HighLimit);
        v15 = v37;
      }
      else if( !BYTE4(a2) )
      {
        v32 = a2 | 8;
LABEL_53:
        v4 = 0;
        *(_DWORD *)(a1 + 4) = v32;
        return v4;
      }
    }
    if( v16 )
      break;
LABEL_10:
    v7 = DWORD1(a2);
LABEL_11:
    v17 = (UINT64)v53;
    Rip = (void *)HistoryTable.Entry[3].ImageBase;
    if( !RtlpIsFrameInBounds(&LowLimit, (UINT64)v53, &HighLimit) )
    {
      if( (_BYTE)v7 != 1
        || (LOBYTE(v7) = 0, DWORD1(a2) = v7, !RtlpGetStackLimitsEx(v17, (CHAR **)&LowLimit, &HighLimit)) )
      {
LABEL_52:
        v32 = a2;
        goto LABEL_53;
      }
    }
  }
  v18 = a2;
  v19 = 0;
  HIDWORD(a2) = 0;
  while( 1 )
  {
    v20 = BYTE8(a2) == 0;
    v21 = a1;
    v22 = v42;
    BYTE9(a2) = 0;
    ControlPc = (DWORD64)Rip;
    *(_DWORD *)(a1 + 4) = v18;
    v46 = v13;
    v47 = v12;
    StackFrame = v15;
    Source = (CONTEXT *)&a2;
    v50 = v16;
    v51 = v22;
    v52 = p_HistoryTable;
    LODWORD(v53) = v19;
    a3 = 0i64;
    if( !v20 )
    {
      v33 = RtlpLogExceptionHandler(v21, &a2, (INT64)Rip, v16);
      v15 = v37;
      a3 = v33;
    }
    v23 = v15;
    v24 = a1;
    v25 = RtlpExecuteHandlerForException(a1, v23, v54, (INT64)&ControlPc);
    if( a3 )
      *(_DWORD *)(a3 + 1396) = v25;
    v26 = *(_DWORD *)(v24 + 4) & 1;
    v15 = v37;
    v18 = v26 | a2;
    LODWORD(a2) = v26 | a2;
    if( v43 == v37 )
    {
      v18 &= ~0x10u;
      v43 = 0i64;
      LODWORD(a2) = v18;
    }
    if( v25 == 1 )
      goto LABEL_21;
    if( !v25 )
      break;
    v27 = v25 - 2;
    if( v27 )
    {
      if( v27 != 1 )
        RtlRaiseStatus(-1073741786);
      Rip = (void *)ControlPc;
      ImageBase = v46;
      RtlpCopyContext((CONTEXT *)&a2, Source);
      a3 = RtlVirtualUnwind(1i64, v28, (UINT64)Rip);
      v37 = StackFrame;
      v12 = RtlLookupFunctionEntry(Rip, &ImageBase, p_HistoryTable);
      if( v12 != v47
        || (v13 = ImageBase, (int)RtlLookupExceptionHandler((__int64)v12, ImageBase, 2u, v29, &a3, &v42) < 0)
        || (v16 = a3, a3 != v50)
        || v42 != v51 )
      {
        __fastfail(0x27u);
      }
      v15 = v37;
      p_HistoryTable = v52;
      HIDWORD(a2) = (_DWORD)v53;
      BYTE9(a2) = 1;
      if( !RtlpIsFrameInBounds(&LowLimit, v37, &HighLimit) && BYTE4(a2) == 1 )
      {
        RtlpGetStackLimitsEx(v15, (CHAR **)&LowLimit, &HighLimit);
        v18 = a2;
        v15 = v37;
LABEL_45:
        BYTE4(a2) = 0;
        goto LABEL_22;
      }
      v18 = a2;
    }
    else
    {
      v30 = StackFrame;
      v18 |= 0x10u;
      v31 = 1;
      LODWORD(a2) = v18;
      if( BYTE4(a2) )
      {
        IsFrameInBounds = RtlpIsFrameInBounds(&LowLimit, StackFrame, &HighLimit);
        v18 = a2;
        v31 = IsFrameInBounds;
        v30 = StackFrame;
      }
      if( v30 > v43 || !v31 )
        v43 = v30;
    }
LABEL_21:
    if( BYTE4(a2) == 2 )
      goto LABEL_45;
LABEL_22:
    v19 = HIDWORD(a2);
    if( !BYTE9(a2) )
      goto LABEL_10;
  }
  if( (v18 & 1) != 0 )
    RtlRaiseStatus(-1073741787);
  return 1;
}

Referenced by:

KiDispatchException
RtlRaiseException