KiExceptionDispatch

VOID __fastcall KiExceptionDispatch(INT64 a1, INT64 a2, VOID *a3, UINT64 a4, CHAR a5){
  unsigned __int64 v5; 
  __int64 v6; 
  unsigned __int64 v7; 
  unsigned __int64 v8; 
  __int64 v9; 
  __int64 v10; 
  unsigned __int64 v11; 
  unsigned __int64 v12; 
  unsigned __int64 v13; 
  _M128A v14; 
  _M128A v15; 
  _M128A v16; 
  _M128A v17; 
  _M128A v18; 
  _M128A v19; 
  _M128A v20; 
  _M128A v21; 
  _M128A v22; 
  _M128A v23; 
  _KTRAP_FRAME *v24; 
  unsigned __int64 CurrentIrql; 
  _KEXCEPTION_FRAME *v26; 
  _KEXCEPTION_FRAME *IsrStack; 
  INT64 v28; 
  INT64 v29; 
  INT64 v30; 
  _ETHREAD *CurrentThread; 
  _ETHREAD *v32; 
  INT64 v33; 
  INT64 v34; 
  unsigned __int8 BpbUserSpecCtrl; 
  unsigned __int8 v36; 
  _KEXCEPTION_FRAME v39; 
  __int64 v40; 
  VOID *v41; 
  int v42; 
  UINT64 v43; 
  __int64 v44; 
  __int64 v45; 
  void *retaddr; 
  __int16 v47; 
  int v48; 
  void *v49; 
  __int16 v50; 

  v39._Xmm6 = v14;
  v39._Xmm7 = v15;
  v39._Xmm8 = v16;
  v39._Xmm9 = v17;
  v39._Xmm10 = v18;
  v39._Xmm11 = v19;
  v39._Xmm12 = v20;
  v39._Xmm13 = v21;
  v39._Xmm14 = v22;
  v39._Xmm15 = v23;
  v39._Rbx = v5;
  v39._Rdi = v7;
  v39._Rsi = v8;
  v39._R12 = v11;
  v39._R13 = v12;
  v39._R14 = v13;
  if( _bittest((const signed __int32 *)&KeGetCurrentThread()->116, 8u) && (*(_BYTE *)(v6 + 240) & 1) != 0 )
    KiUmsExceptionEntry(
      a1,
      a2,
      (INT64)a3,
      a4,
      v39.P5,
      v39.Spare1,
      v39._Xmm6.Low,
      v39._Xmm6.High,
      v39._Xmm7.Low,
      v39._Xmm7.High,
      v39._Xmm8.Low,
      v39._Xmm8.High,
      v39._Xmm9.Low,
      v39._Xmm9.High,
      v39._Xmm10.Low,
      v39._Xmm10.High,
      v39._Xmm11.Low,
      v39._Xmm11.High,
      v39._Xmm12.Low,
      v39._Xmm12.High,
      v39._Xmm13.Low,
      v39._Xmm13.High,
      v39._Xmm14.Low,
      v39._Xmm14.High,
      v39._Xmm15.Low,
      v39._Xmm15.High,
      v39.TrapFrame,
      v39.OutputBuffer,
      v39.OutputLength,
      v39.Spare2,
      v39._MxCsr,
      v39._Rbp,
      v39._Rbx,
      v39._Rdi,
      v39._Rsi,
      v39._R12,
      v39._R13,
      v39._R14);
  v39.Return = (unsigned int)a1;
  v40 = 0i64;
  v41 = a3;
  v42 = a2;
  v43 = a4;
  v44 = v9;
  v45 = v10;
  LOBYTE(a4) = *(_BYTE *)(v6 + 240) & 1;
  LOBYTE(v39.P5) = 1;
  v24 = (_KTRAP_FRAME *)(v6 - 128);
  if( (_BYTE)a4 )
    goto LABEL_14;
  CurrentIrql = KeGetCurrentIrql();
  if( (*(_DWORD *)(v6 + 248) & 0x200) == 0 )
    CurrentIrql = 2i64;
  if( CurrentIrql < 2
    || KeGetPcr()->Prcb.ExceptionStackActive
    || (v26 = (_KEXCEPTION_FRAME *)((char *)KeGetPcr()->Prcb.ExceptionStack + 80), &v39 <= v26)
    && &v39 >= (_KEXCEPTION_FRAME *)&v26[-77]._Xmm7
    || (IsrStack = (_KEXCEPTION_FRAME *)KeGetPcr()->Prcb.IsrStack, &v39 <= IsrStack)
    && &v39 >= (_KEXCEPTION_FRAME *)&IsrStack[-77]._Xmm7 )
  {
LABEL_14:
    KiDispatchException((PEXCEPTION_RECORD)&v39.Return, &v39, v24, a4, v39.P5);
  }
  else
  {
    KiExceptionDispatchOnExceptionStack(
      (INT64)&v39.Return,
      (INT64)&v39,
      (INT64)v24,
      a4,
      v39.P5,
      v39.Spare1,
      v39._Xmm6.Low,
      v39._Xmm6.High);
  }
  _disable();
  if( (*(_BYTE *)(v6 + 240) & 1) == 0 )
  {
    _mm_setcsr(*(_DWORD *)(v6 - 84));
    __iretq(retaddr, v47, v48, v49, v50);
  }
  if( (_BYTE)KeSmapEnabled )
    __stac();
  while( (KeGetCurrentThread()->ApcState.UserApcPendingAll & 3) != 0 )
  {
    __writecr8(1ui64);
    _enable();
    KiInitiateUserApc((_KTRAP_FRAME *)1);
    _disable();
    __writecr8(0i64);
  }
  if( (*((_BYTE *)&KeGetPcr()->Prcb.2 + 14) & 2) != 0 )
    KiUpdateStibpPairing(0i64);
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  if( (*(_DWORD *)CurrentThread->Tcb.gap0 & 0x8000000) != 0 )
    KiRestoreSetContextState((INT64)CurrentThread, v28, v29, v30, v39.P5);
  v32 = (_ETHREAD *)KeGetCurrentThread();
  if( (*(_DWORD *)v32->Tcb.gap0 & 0x40010000) != 0 )
  {
    if( (v32->Tcb.gap0[2] & 1) != 0 )
    {
      KiCopyCounters(&v32->Tcb);
      v32 = (_ETHREAD *)KeGetCurrentThread();
    }
    if( (v32->Tcb.gap0[3] & 0x40) != 0 )
      KiUmsExit(1);
  }
  _mm_setcsr(*(_DWORD *)(v6 - 84));
  if( *(_WORD *)(v6 + 128) )
    KiRestoreDebugRegisterState();
  v33 = *(_QWORD *)(v6 - 48);
  v34 = *(_QWORD *)(v6 - 56);
  __writegsbyte(0x853u, 0);
  BpbUserSpecCtrl = KeGetPcr()->Prcb.BpbUserSpecCtrl;
  if( KeGetPcr()->Prcb.BpbCurrentSpecCtrl != BpbUserSpecCtrl )
  {
    __writegsbyte(0x27Au, BpbUserSpecCtrl);
    __writemsr(0x48u, BpbUserSpecCtrl);
  }
  v36 = _bittestandreset16(MK_FP(__GS__, 632i64), 2u);
  if( v36 )
    __writemsr(0x49u, 1ui64);
  v36 = _bittestandreset16(MK_FP(__GS__, 632i64), 5u);
  if( v36 )
    __flush_rsb();
  if( (KiKvaShadow & 1) == 0 )
  {
    __swapgs();
    __iretq(retaddr, v47, v48, v49, v50);
  }
  KiKernelExit(*(_QWORD *)(v6 - 72), *(_QWORD *)(v6 - 64), v34, v33, a5);
}

Referenced by:

KiAlignmentFault
KiBoundFault
KiBreakpointTrap
KiControlProtectionFault
KiDebugServiceTrap
KiDivideErrorFault
KiFloatingErrorFault
KiGeneralProtectionFault
KiInvalidOpcodeFault
KiOverflowTrap
KiPageFault
KiRaiseAssertion
KiSegmentNotPresentFault
KiStackFault
KiSystemCall32
KiSystemCall32Shadow
KiSystemCall64
KiXmmException
KxDebugTrapOrFault