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