KiDispatchException

VOID __stdcall KiDispatchException(
        PEXCEPTION_RECORD ExceptionRecord,
        PKEXCEPTION_FRAME ExceptionFrame,
        PKTRAP_FRAME TrapFrame,
        _KPROCESSOR_MODE PreviousMode,
        BOOL FirstChance){
  UINT8 P1Home; 
  unsigned __int64 P5; 
  unsigned __int64 v9; 
  unsigned __int64 v10; 
  void *v11; 
  unsigned __int64 v12; 
  int P1Home_high; 
  _KTRAP_FRAME *v14; 
  _CONTEXT *v15; 
  _CONTEXT *v16; 
  INT64 v17; 
  char v18; 
  char v19; 
  UINT64 v20; 
  unsigned __int64 High; 
  UINT8 IsThisAKdTrap; 
  int v23; 
  INT64 v24; 
  char v25; 
  unsigned __int64 v26; 
  unsigned __int64 v27; 
  unsigned __int64 v28; 
  _QWORD *P3Home; 
  __int64 v30; 
  UINT64 v31; 
  __int64 v32; 
  int ExceptionCode; 
  char v35; 
  INT64 v36; 
  INT64 PreviousModea; 
  INT64 PreviousModeb; 
  INT64 v39; 
  INT64 v40; 
  _KEXCEPTION_FRAME ExceptionFramea; 
  __int64 v42; 

  P1Home = PreviousMode;
  LOWORD(ExceptionFramea.P1Home) = (unsigned __int8)PreviousMode;
  ExceptionFramea.P3Home = (unsigned __int64)ExceptionFrame;
  ExceptionFramea._Xmm7.High = (__int64)ExceptionRecord;
  ExceptionFramea._Xmm11.Low = (unsigned __int64)TrapFrame;
  ExceptionFramea.Spare1 = 0i64;
  LODWORD(ExceptionFramea.P4Home) = 0;
  memset((char *)&ExceptionFramea._Xmm12.Low + 4, 0i64, 0x94u);
  *(_OWORD *)&ExceptionFramea._R15 = 0i64;
  v42 = 0i64;
  ExceptionFramea._Xmm6.High = (__int64)KeGetCurrentThread();
  P5 = *(_QWORD *)(ExceptionFramea._Xmm6.High + 184);
  ExceptionFramea.P5 = P5;
  __incgsdword(0x8030u);
  if( FirstChance && *(_QWORD *)(P5 + 2240) )
  {
    ExceptionCode = ExceptionRecord->ExceptionCode;
    switch( ExceptionRecord->ExceptionCode )
    {
      case 0x10000002:
        ExceptionRecord->ExceptionCode = -1073741795;
        break;
      case 0x10000003:
        ExceptionRecord->ExceptionCode = -1073741676;
        break;
      case 0x10000004:
        ExceptionRecord->ExceptionCode = -1073741819;
        break;
    }
    if( ObGetCurrentIrql() < 2u
      && (P1Home
       || (ExceptionRecord->ExceptionCode == -2147483647
        || (unsigned int)(ExceptionRecord->ExceptionCode + 1073741819) <= 1)
       && ExceptionRecord->ExceptionInformation[1] <= 0x7FFFFFFF0000i64) )
    {
      LOBYTE(PreviousModea) = P1Home;
      if( (unsigned __int8)((__int64(__fastcall *)(PEXCEPTION_RECORD, unsigned __int64, PKTRAP_FRAME, _QWORD))xmmword_140C1DE60)(
                              ExceptionRecord,
                              ExceptionFramea.P3Home,
                              TrapFrame,
                              0i64) )
        return;
    }
    ExceptionRecord->ExceptionCode = ExceptionCode;
    P5 = ExceptionFramea.P5;
  }
  HIDWORD(ExceptionFramea.P1Home) = 1048607;
  v9 = 0i64;
  if( P1Home )
  {
    if( ((unsigned __int64)KeFeatureBits & 0x800000) != 0 )
    {
      HIDWORD(ExceptionFramea.P1Home) = 1048671;
      if( (KUSER_SHARED_DATA.XState._bf_0 & 2) != 0 )
      {
        v9 = KUSER_SHARED_DATA.XState.EnabledFeatures | KUSER_SHARED_DATA.XState.EnabledUserVisibleSupervisorFeatures;
        if( ((KUSER_SHARED_DATA.XState.EnabledFeatures | KUSER_SHARED_DATA.XState.EnabledUserVisibleSupervisorFeatures) & 0x800) != 0
          && (*(_DWORD *)(P5 + 2516) & 0x4000) == 0 )
        {
          v9 &= ~0x800ui64;
        }
      }
    }
  }
  RtlGetExtendedContextLength2(HIDWORD(ExceptionFramea.P1Home), &ExceptionFramea.P4Home, v9);
  v10 = LODWORD(ExceptionFramea.P4Home) + 15i64;
  if( v10 <= LODWORD(ExceptionFramea.P4Home) )
    v10 = 0xFFFFFFFFFFFFFF0i64;
  v11 = alloca(v10 & 0xFFFFFFFFFFFFFFF0ui64);
  ExceptionFramea._Xmm10.High = (__int64)&ExceptionFramea;
  if( P1Home )
    memset(&ExceptionFramea, 0i64, ExceptionFramea.P4Home);
  v12 = v9;
  P1Home_high = HIDWORD(ExceptionFramea.P1Home);
  RtlInitializeExtendedContext2(
    (__int64)&ExceptionFramea,
    SHIDWORD(ExceptionFramea.P1Home),
    &ExceptionFramea.Spare1,
    v12);
  KeContextFromKframes(TrapFrame, (_KTRAP_FRAME *)ExceptionFramea.P3Home, (PCONTEXT)&ExceptionFramea);
  if( ExceptionRecord->ExceptionCode == -2147483645 )
  {
    --ExceptionFramea._Rbp;
    if( (KiDynamicTraceMask & 2) != 0 )
    {
      if( KiTpHandleTrap((INT64)ExceptionRecord, (INT64)&ExceptionFramea, P1Home, FirstChance) )
        goto LABEL_14;
    }
  }
  LOBYTE(v14) = P1Home;
  KiPreprocessFault(ExceptionRecord, &ExceptionFramea, v14, v15, PreviousModea);
  if( v18 )
    goto LABEL_14;
  if( !P1Home )
  {
    if( !FirstChance
      || (KdTrap(TrapFrame, (_KTRAP_FRAME *)ExceptionFramea.P3Home, ExceptionRecord, (_CONTEXT *)&ExceptionFramea, 0, 0),
          !v19)
      && !RtlDispatchException(ExceptionRecord, (_CONTEXT *)&ExceptionFramea) )
    {
      KdTrap(TrapFrame, (_KTRAP_FRAME *)ExceptionFramea.P3Home, ExceptionRecord, (_CONTEXT *)&ExceptionFramea, 0, 1u);
      if( !v35 )
        KeBugCheckEx(
          0x1Eu,
          (PVOID)ExceptionRecord->ExceptionCode,
          ExceptionRecord->ExceptionAddress,
          (PVOID)ExceptionRecord->ExceptionInformation[0],
          (PVOID)ExceptionRecord->ExceptionInformation[1]);
    }
    goto LABEL_14;
  }
  High = ExceptionFramea._Xmm12.High;
  ExceptionFramea._Xmm7.Low = ExceptionFramea._Xmm12.High;
  if( (*(_DWORD *)(ExceptionFramea.P5 + 2172) & 1) == 0 )
  {
    if( KeGetCurrentThread()->ApcState.Process->WoW64Process
      && ExceptionRecord->ExceptionCode == -2147483646
      && (TrapFrame->EFlags & 0x40000) != 0 )
    {
      _disable();
      TrapFrame->EFlags &= ~0x40000u;
      goto LABEL_75;
    }
    if( (ExceptionFramea._Xmm6.High & 0xFFF8) == 32 )
    {
      if( ExceptionRecord->ExceptionCode == -2147483645 )
      {
        ExceptionRecord->ExceptionCode = 1073741855;
      }
      else if( ExceptionRecord->ExceptionCode == -2147483644 )
      {
        ExceptionRecord->ExceptionCode = 1073741854;
      }
      High = (unsigned int)High & 0xFFFFFFF0;
      ExceptionFramea._Xmm7.Low = High;
    }
  }
  if( FirstChance )
  {
    LODWORD(ExceptionFramea.P5) = ExceptionRecord->ExceptionCode;
    IsThisAKdTrap = KdIsThisAKdTrap(ExceptionRecord, v16, ExceptionFramea.P5);
    BYTE1(ExceptionFramea.P1Home) = IsThisAKdTrap;
    if( !KeGetCurrentThread()->ApcState.Process->DebugPort && !KdIgnoreUmExceptions && v23 != -2147483597
      || IsThisAKdTrap )
    {
      KdTrap(
        TrapFrame,
        (_KTRAP_FRAME *)ExceptionFramea.P3Home,
        ExceptionRecord,
        (_CONTEXT *)&ExceptionFramea,
        ExceptionFramea.P1Home,
        0);
      if( v25 )
      {
        P1Home = ExceptionFramea.P1Home;
LABEL_14:
        LOBYTE(PreviousModea) = P1Home;
        KeContextToKframes(
          TrapFrame,
          (_KTRAP_FRAME *)ExceptionFramea.P3Home,
          (PCONTEXT)&ExceptionFramea,
          ExceptionFramea._Xmm6.Low,
          PreviousModea);
        if( !BYTE1(ExceptionFramea.P1Home) )
          return;
        _disable();
        KiSetupForInstrumentationReturn(TrapFrame, v20);
LABEL_75:
        _enable();
        return;
      }
      v23 = ExceptionFramea.P5;
    }
    if( v23 == -2147483597
      || !DbgkForwardException(ExceptionRecord, 1u, 0, v24, PreviousModea, v39, ExceptionFramea.P1Home) )
    {
      _disable();
      TrapFrame->EFlags &= ~0x100u;
      _enable();
      LODWORD(ExceptionFramea._Xmm12.Low) = -1073741819;
      LODWORD(ExceptionFramea.P2Home) = 0;
      v26 = High;
      ExceptionFramea._Xmm6.Low = High;
      if( (P1Home_high & 0x100040) == 1048640 )
      {
        v26 = (High - *(unsigned int *)(ExceptionFramea.Spare1 + 20)) & 0xFFFFFFFFFFFFFFC0ui64;
        ExceptionFramea._Xmm6.Low = v26;
      }
      ExceptionFramea.P3Home = (v26 - 40) & 0xFFFFFFFFFFFFFFF0ui64;
      ExceptionFramea._Xmm8.Low = ExceptionFramea.P3Home;
      ExceptionFramea._Xmm9.Low = ExceptionFramea.P3Home - 160;
      ExceptionFramea._Xmm9.High = ExceptionFramea.P3Home - 192;
      v27 = ExceptionFramea.P3Home - 1424;
      ExceptionFramea._Xmm8.High = ExceptionFramea.P3Home - 1424;
      LODWORD(ExceptionFramea._R15) = -1232;
      v28 = High - (ExceptionFramea.P3Home - 1424);
      HIDWORD(ExceptionFramea._R15) = High - (LODWORD(ExceptionFramea.P3Home) - 1424);
      ExceptionFramea.Return = 0x4D0FFFFFB30i64;
      LODWORD(v42) = v26 - (LODWORD(ExceptionFramea.P3Home) - 192);
      HIDWORD(v42) = High - v26;
      if( v28 - 1 > 0xFFE )
      {
        ProbeForWrite(ExceptionFramea.P3Home - 1424, High - (ExceptionFramea.P3Home - 1424), 16i64);
        P3Home = (_QWORD *)ExceptionFramea.P3Home;
      }
      else
      {
        if( v27 >= 0x7FFFFFFF0000i64 )
          v27 = 0x7FFFFFFF0000i64;
        *(_BYTE *)v27 = *(_BYTE *)v27;
        *(_BYTE *)(v27 + v28 - 1) = *(_BYTE *)(v27 + v28 - 1);
        P3Home = (_QWORD *)ExceptionFramea._Xmm8.Low;
        v27 = ExceptionFramea._Xmm8.High;
      }
      P3Home[3] = High;
      *P3Home = ExceptionFramea._Rbp;
      KeCopyExceptionRecord(ExceptionFramea._Xmm9.Low, (INT64)ExceptionRecord);
      v30 = ExceptionFramea._Xmm9.High;
      RtlpCopyExtendedContext(
        1,
        (_CONTEXT_EX *)ExceptionFramea._Xmm9.High,
        (_CONTEXT_EX *)&ExceptionFramea._R15,
        HIDWORD(ExceptionFramea.P1Home),
        (_CONTEXT_EX *)ExceptionFramea.Spare1,
        0i64);
      *(_OWORD *)v30 = *(_OWORD *)&ExceptionFramea._R15;
      *(_QWORD *)(v30 + 16) = v42;
      --*(_WORD *)(ExceptionFramea._Xmm6.High + 486);
      LODWORD(ExceptionFramea.P2Home) = 1;
      KePopulateContinuationContext(TrapFrame->_Rip);
      TrapFrame->_Rsp = v27;
      TrapFrame->SegCs = 51;
      TrapFrame->_Rip = KeUserExceptionDispatcher;
      KiSetupForInstrumentationReturn(TrapFrame, v31);
      KiLeaveGuardedRegionUnsafe(v32);
      LODWORD(ExceptionFramea.P2Home) = 0;
    }
  }
  else if( !DbgkForwardException(ExceptionRecord, 1u, 1u, v17, PreviousModea, v39, ExceptionFramea.P1Home)
         && !DbgkForwardException(ExceptionRecord, 0, 1u, v36, PreviousModeb, v40, ExceptionFramea.P1Home) )
  {
    ZwTerminateProcess((VOID *)0xFFFFFFFFFFFFFFFFi64, ExceptionRecord->ExceptionCode);
  }
}

Referenced by:

KiExceptionDispatch
KiFastFailDispatch
KiParkUmsThread
KiRaiseException
KiSwapToUmsThread
PspFreeUserFiberShadowStack
PspInitializeThunkContext