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