KiDispatchException
VOID __stdcall KiDispatchException(
_EXCEPTION_RECORD *ExceptionRecord,
_KEXCEPTION_FRAME *ExceptionFrame,
_KTRAP_FRAME *TrapFrame,
CHAR PreviousMode,
UINT8 FirstChance){
CHAR P1Home;
unsigned __int64 P5;
unsigned __int64 v9;
unsigned __int64 v10;
void *v11;
UINT64 v12;
int P1Home_high;
_KTRAP_FRAME *v14;
_CONTEXT *v15;
_CONTEXT *v16;
UINT64 v17;
unsigned __int64 High;
UINT8 IsThisAKdTrap;
int v20;
unsigned __int64 v21;
unsigned __int64 v22;
unsigned __int64 v23;
_QWORD *P3Home;
__int64 v25;
UINT64 v26;
__int64 v27;
int ExceptionCode;
CHAR BugCheckParameter4;
_KEXCEPTION_FRAME a1;
__int64 v32;
P1Home = PreviousMode;
LOWORD(a1.P1Home) = (unsigned __int8)PreviousMode;
a1.P3Home = (unsigned __int64)ExceptionFrame;
a1.Xmm7.High = (__int64)ExceptionRecord;
a1.Xmm11.Low = (unsigned __int64)TrapFrame;
a1.Spare1 = 0i64;
LODWORD(a1.P4Home) = 0;
memset((INT64)&a1.Xmm12.Low + 4, 0i64);
*(_OWORD *)&a1.R15 = 0i64;
v32 = 0i64;
a1.Xmm6.High = (__int64)KeGetCurrentThread();
P5 = *(_QWORD *)(a1.Xmm6.High + 184);
a1.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) )
{
BugCheckParameter4 = P1Home;
if( (unsigned __int8)((__int64(__fastcall *)(_EXCEPTION_RECORD *, unsigned __int64, _KTRAP_FRAME *, _QWORD))xmmword_140C1DE60)(
ExceptionRecord,
a1.P3Home,
TrapFrame,
0i64) )
return;
}
ExceptionRecord->ExceptionCode = ExceptionCode;
P5 = a1.P5;
}
HIDWORD(a1.P1Home) = 1048607;
v9 = 0i64;
if( P1Home )
{
if( (KeFeatureBits & 0x800000) != 0 )
{
HIDWORD(a1.P1Home) = 1048671;
if( (KUSER_SHARED_DATA.XState.ControlFlags & 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(a1.P1Home), &a1.P4Home, v9);
v10 = LODWORD(a1.P4Home) + 15i64;
if( v10 <= LODWORD(a1.P4Home) )
v10 = 0xFFFFFFFFFFFFFF0i64;
v11 = alloca(v10 & 0xFFFFFFFFFFFFFFF0ui64);
a1.Xmm10.High = (__int64)&a1;
if( P1Home )
memset((INT64)&a1, 0i64);
v12 = v9;
P1Home_high = HIDWORD(a1.P1Home);
RtlInitializeExtendedContext2((INT64)&a1, HIDWORD(a1.P1Home), &a1.Spare1, v12);
KeContextFromKframes(TrapFrame, (_KEXCEPTION_FRAME *)a1.P3Home, (_CONTEXT *)&a1);
if( ExceptionRecord->ExceptionCode == -2147483645 )
{
--a1.Rbp;
if( (KiDynamicTraceMask & 2) != 0 )
{
if( KiTpHandleTrap((INT64)ExceptionRecord, (INT64)&a1, P1Home, FirstChance) )
goto LABEL_14;
}
}
LOBYTE(v14) = P1Home;
if( KiPreprocessFault(ExceptionRecord, &a1, v14, v15, BugCheckParameter4) )
goto LABEL_14;
if( !P1Home )
{
if( (!FirstChance
|| !KdTrap(TrapFrame, (KTRAP_FRAME *)a1.P3Home, ExceptionRecord, (CONTEXT *)&a1, 0, 0)
&& !RtlDispatchException(ExceptionRecord, (CONTEXT *)&a1))
&& !KdTrap(TrapFrame, (KTRAP_FRAME *)a1.P3Home, ExceptionRecord, (CONTEXT *)&a1, 0, 1u) )
{
KeBugCheckEx(
0x1Eu,
ExceptionRecord->ExceptionCode,
(ULONG_PTR)ExceptionRecord->ExceptionAddress,
ExceptionRecord->ExceptionInformation[0],
ExceptionRecord->ExceptionInformation[1]);
}
goto LABEL_14;
}
High = a1.Xmm12.High;
a1.Xmm7.Low = a1.Xmm12.High;
if( (*(_DWORD *)(a1.P5 + 2172) & 1) == 0 )
{
if( *(_QWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 1408i64)
&& ExceptionRecord->ExceptionCode == -2147483646
&& (TrapFrame->EFlags & 0x40000) != 0 )
{
_disable();
TrapFrame->EFlags &= ~0x40000u;
goto LABEL_75;
}
if( (a1.Xmm6.High & 0xFFF8) == 32 )
{
if( ExceptionRecord->ExceptionCode == -2147483645 )
{
ExceptionRecord->ExceptionCode = 1073741855;
}
else if( ExceptionRecord->ExceptionCode == -2147483644 )
{
ExceptionRecord->ExceptionCode = 1073741854;
}
High = (unsigned int)High & 0xFFFFFFF0;
a1.Xmm7.Low = High;
}
}
if( FirstChance )
{
LODWORD(a1.P5) = ExceptionRecord->ExceptionCode;
IsThisAKdTrap = KdIsThisAKdTrap(ExceptionRecord, v16, a1.P5);
BYTE1(a1.P1Home) = IsThisAKdTrap;
if( !*(_QWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 1400i64) && !KdIgnoreUmExceptions && v20 != -2147483597
|| IsThisAKdTrap )
{
if( KdTrap(TrapFrame, (KTRAP_FRAME *)a1.P3Home, ExceptionRecord, (CONTEXT *)&a1, a1.P1Home, 0) )
{
P1Home = a1.P1Home;
LABEL_14:
KeContextToKframes(TrapFrame, (_KEXCEPTION_FRAME *)a1.P3Home, (_CONTEXT *)&a1, LODWORD(a1.Xmm6.Low), P1Home);
if( !BYTE1(a1.P1Home) )
return;
_disable();
KiSetupForInstrumentationReturn(TrapFrame, v17);
LABEL_75:
_enable();
return;
}
v20 = a1.P5;
}
if( v20 == -2147483597 || !DbgkForwardException(ExceptionRecord, 1u, 0) )
{
_disable();
TrapFrame->EFlags &= ~0x100u;
_enable();
LODWORD(a1.Xmm12.Low) = -1073741819;
LODWORD(a1.P2Home) = 0;
v21 = High;
a1.Xmm6.Low = High;
if( (P1Home_high & 0x100040) == 1048640 )
{
v21 = (High - *(unsigned int *)(a1.Spare1 + 20)) & 0xFFFFFFFFFFFFFFC0ui64;
a1.Xmm6.Low = v21;
}
a1.P3Home = (v21 - 40) & 0xFFFFFFFFFFFFFFF0ui64;
a1.Xmm8.Low = a1.P3Home;
a1.Xmm9.Low = a1.P3Home - 160;
a1.Xmm9.High = a1.P3Home - 192;
v22 = a1.P3Home - 1424;
a1.Xmm8.High = a1.P3Home - 1424;
LODWORD(a1.R15) = -1232;
v23 = High - (a1.P3Home - 1424);
HIDWORD(a1.R15) = High - (LODWORD(a1.P3Home) - 1424);
a1.Return = 0x4D0FFFFFB30i64;
LODWORD(v32) = v21 - (LODWORD(a1.P3Home) - 192);
HIDWORD(v32) = High - v21;
if( v23 - 1 > 0xFFE )
{
ProbeForWrite((VOID *)(a1.P3Home - 1424), High - (a1.P3Home - 1424), 0x10ui64);
P3Home = (_QWORD *)a1.P3Home;
}
else
{
if( v22 >= 0x7FFFFFFF0000i64 )
v22 = 0x7FFFFFFF0000i64;
*(_BYTE *)v22 = *(_BYTE *)v22;
*(_BYTE *)(v22 + v23 - 1) = *(_BYTE *)(v22 + v23 - 1);
P3Home = (_QWORD *)a1.Xmm8.Low;
v22 = a1.Xmm8.High;
}
P3Home[3] = High;
*P3Home = a1.Rbp;
KeCopyExceptionRecord(a1.Xmm9.Low, (INT64)ExceptionRecord);
v25 = a1.Xmm9.High;
RtlpCopyExtendedContext(1, a1.Xmm9.High, (INT64)&a1.R15, HIDWORD(a1.P1Home), a1.Spare1, 0i64);
*(_OWORD *)v25 = *(_OWORD *)&a1.R15;
*(_QWORD *)(v25 + 16) = v32;
--*(_WORD *)(a1.Xmm6.High + 486);
LODWORD(a1.P2Home) = 1;
KePopulateContinuationContext(TrapFrame->Rip);
TrapFrame->Rsp = v22;
TrapFrame->SegCs = 51;
TrapFrame->Rip = KeUserExceptionDispatcher;
KiSetupForInstrumentationReturn(TrapFrame, v26);
KiLeaveGuardedRegionUnsafe(v27);
LODWORD(a1.P2Home) = 0;
}
}
else if( !DbgkForwardException(ExceptionRecord, 1u, 1u) && !DbgkForwardException(ExceptionRecord, 0, 1u) )
{
ZwTerminateProcess((PVOID)0xFFFFFFFFFFFFFFFFi64, (unsigned int)ExceptionRecord->ExceptionCode);
}
}Referenced by:
KiExceptionDispatch
KiFastFailDispatch
KiParkUmsThread
KiRaiseException
KiSwapToUmsThread
PspFreeUserFiberShadowStack
PspInitializeThunkContext