KiMcheckAbort
VOID __stdcall KiMcheckAbort(UINT64 a1, UINT64 a2, UINT64 a3, UINT64 a4){
unsigned __int64 v4;
unsigned __int64 v5;
unsigned __int64 v6;
_M128A v7;
_M128A v8;
_M128A v9;
_M128A v10;
_KTRAP_FRAME *__shifted(_KTRAP_FRAME,0x80) TrapFrame;
bool v12;
unsigned __int32 v13;
unsigned __int64 *v14;
int v15;
int v16;
unsigned __int64 v17;
_M128A v18;
_M128A v19;
__int64 v20;
unsigned __int8 CurrentIrql;
__int64 v22;
unsigned __int64 Rsp;
unsigned __int64 v24;
unsigned __int64 v25;
_BYTE *Rip;
_WORD *v27;
_ETHREAD *CurrentThread;
unsigned __int64 *p_Alignment;
VOID(__stdcall *v30)(INT64, UINT64, UINT64, UINT64, CHAR);
_KIDTENTRY64 *IdtBase;
__m128i v32;
TrapFrame = KeGetTrapFrame();
ADJ(TrapFrame)->ExceptionActive = 0;
ADJ(TrapFrame)->_Rax = v4;
ADJ(TrapFrame)->_Rcx = a1;
ADJ(TrapFrame)->_Rdx = a2;
ADJ(TrapFrame)->_R8 = a3;
ADJ(TrapFrame)->_R9 = a4;
ADJ(TrapFrame)->_R10 = v5;
ADJ(TrapFrame)->_R11 = v6;
if( (ADJ(TrapFrame)->SegCs & 1) == 0 )
{
ADJ(TrapFrame)->GsBase = __readmsr(0xC0000101);
v13 = __segmentlimit(0x50u);
if( v12 )
{
v16 = (v13 & 0x3FF) << 6;
v15 = v13 >> 14;
}
else
{
if( !KUSER_SHARED_DATA.ProcessorFeatures[32] )
{
__sgdt(&ADJ(TrapFrame)->_Xmm0);
v14 = *(unsigned __int64 **)(*(unsigned __int64 *)((char *)&ADJ(TrapFrame)->_Xmm0.Low + 2) - 8000);
LABEL_8:
__writemsr(0xC0000101, (unsigned __int64)v14);
v17 = __readcr2();
ADJ(TrapFrame)->FaultAddress = v17;
KiSetSpecCtrlNmi();
goto LABEL_13;
}
__asm { rdtscp }
v15 = 1;
v16 = 805306432;
}
v14 = &(*(&KiProcessorBlock + (unsigned int)KiProcessorNumberToIndexMappingTable[v16 | v15]))[-1].PrcbPad141[472];
goto LABEL_8;
}
if( (KiKvaShadow & 1) == 0 )
__swapgs();
_mm_lfence();
KiSetSpecCtrlNmi();
v12 = (*(_BYTE *)(v20 + 3) & 3) == 0;
LOWORD(ADJ(TrapFrame)->Dr7) = 0;
if( !v12 )
KiSaveDebugRegisterState();
LABEL_13:
ADJ(TrapFrame)->_MxCsr = _mm_getcsr();
_mm_setcsr(KeGetPcr()->Prcb._MxCsr);
ADJ(TrapFrame)->_Xmm0 = v7;
ADJ(TrapFrame)->_Xmm1 = v8;
ADJ(TrapFrame)->_Xmm2 = v9;
ADJ(TrapFrame)->_Xmm3 = v10;
ADJ(TrapFrame)->_Xmm4 = v18;
ADJ(TrapFrame)->_Xmm5 = v19;
if( KeGetPcr()->Prcb.DeepSleep )
KeWakeProcessor();
if( (unsigned __int64)&ExpInterlockedPopEntrySListResume < ADJ(TrapFrame)->_Rip
&& (unsigned __int64)&ExpInterlockedPopEntrySListEnd >= ADJ(TrapFrame)->_Rip )
{
KiCheckForSListAddress(ADJ(TrapFrame));
}
__incgsdword(0x8000u);
if( (_BYTE)KeSmapEnabled )
__clac();
CurrentIrql = KeGetCurrentIrql();
__writecr8(0xFui64);
ADJ(TrapFrame)->PreviousIrql = CurrentIrql;
_enable();
KiMcheckFastForward(ADJ(TrapFrame));
__incgsbyte(0x7D67u);
if( (ADJ(TrapFrame)->SegCs & 1) == 0 )
{
Rsp = ADJ(TrapFrame)->_Rsp;
v24 = *(_QWORD *)((char *)KeGetPcr()->NtTib.StackBase + 52);
if( Rsp <= v24 )
{
v22 = 24576i64;
if( (KiKvaShadow & 1) != 0 )
v22 = 464i64;
if( Rsp > v24 - v22 )
goto LABEL_28;
}
if( (KiKvaShadow & 1) != 0 )
{
v25 = *(_QWORD *)(*(_QWORD *)((char *)KeGetPcr()->NtTib.StackBase + 52) + 8i64);
if( Rsp <= v25 && Rsp > v25 - 24544 )
{
LABEL_28:
ADJ(TrapFrame)->SegSs |= 4u;
_InterlockedIncrement64(&KiMcheckNmiBlocking);
}
}
Rip = (_BYTE *)ADJ(TrapFrame)->_Rip;
if( *Rip == 0xF4 )
{
v27 = Rip - 1;
if( *v27 == 0xF4FB )
{
ADJ(TrapFrame)->EFlags &= ~0x200u;
ADJ(TrapFrame)->_Rip = (unsigned __int64)v27;
_InterlockedIncrement64(&KiMcheckStiBlocking);
}
}
}
KxMcheckAbort((INT64)ADJ(TrapFrame), v22, &v32);
if( (v32.m128i_i8[0] & 1) != 0 )
{
*((__m128i *)KeGetCurrentThread()->InitialStack - 26) = _mm_load_si128(&v32);
ADJ(TrapFrame)->ExceptionActive = 1;
}
__writegsbyte(0x7D67u, KeGetPcr()->Prcb.MceActive - 1);
_disable();
__writecr8(ADJ(TrapFrame)->PreviousIrql);
_disable();
if( (ADJ(TrapFrame)->SegCs & 1) != 0 )
{
if( (_BYTE)KeSmapEnabled )
__stac();
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
if( (*(_DWORD *)CurrentThread->Tcb.gap0 & 0x40010000) != 0 && (CurrentThread->Tcb.gap0[2] & 1) != 0 )
KiCopyCounters(&CurrentThread->Tcb);
_mm_setcsr(ADJ(TrapFrame)->_MxCsr);
if( LOWORD(ADJ(TrapFrame)->Dr7) )
KiRestoreDebugRegisterState();
if( ADJ(TrapFrame)->ExceptionActive )
{
p_Alignment = (unsigned __int64 *)((char *)KeGetCurrentThread()->InitialStack - 40);
*p_Alignment = ADJ(TrapFrame)->_Rip;
p_Alignment[1] = ADJ(TrapFrame)->SegCs;
p_Alignment[2] = ADJ(TrapFrame)->EFlags;
p_Alignment[3] = ADJ(TrapFrame)->_Rsp;
p_Alignment[4] = ADJ(TrapFrame)->SegSs;
ADJ(TrapFrame)->SegSs = 24;
ADJ(TrapFrame)->SegCs = 16;
ADJ(TrapFrame)->EFlags &= ~0x200u;
v30 = KxMcheckAlternateReturn;
if( (KiKvaShadow & 1) != 0 )
{
IdtBase = KeGetPcr()->IdtBase;
*(&IdtBase[1118].Alignment + 1) = KeGetPcr()->Prcb.KernelDirectoryTableBase & 0x7FFFFFFFFFFFFFFFi64;
IdtBase[1118].Alignment = (unsigned __int64)KeGetPcr();
IdtBase = (_KIDTENTRY64 *)((char *)IdtBase + 16856);
IdtBase->Alignment = *p_Alignment;
*(_KIDTENTRY64 *)((char *)IdtBase + 8) = *(_KIDTENTRY64 *)(p_Alignment + 1);
*(&IdtBase[1].Alignment + 1) = p_Alignment[3];
IdtBase[2].Alignment = (unsigned __int64)p_Alignment;
p_Alignment = &IdtBase->Alignment;
v30 = KxMcheckAlternateReturnShadow;
}
ADJ(TrapFrame)->_Rip = (unsigned __int64)v30;
ADJ(TrapFrame)->_Rsp = (unsigned __int64)p_Alignment;
}
else
{
__writegsbyte(0x853u, ADJ(TrapFrame)->InterruptRetpolineState);
if( KeGetPcr()->Prcb.BpbKernelSpecCtrl )
__writemsr(0x48u, ADJ(TrapFrame)->FaultIndicator);
}
if( (KiKvaShadow & 1) != 0 )
{
LABEL_49:
KiKernelIstMceExit();
return;
}
__swapgs();
_mm_lfence();
}
else
{
_mm_setcsr(ADJ(TrapFrame)->_MxCsr);
__writegsbyte(0x853u, ADJ(TrapFrame)->InterruptRetpolineState);
if( KeGetPcr()->Prcb.BpbKernelSpecCtrl )
__writemsr(0x48u, ADJ(TrapFrame)->FaultIndicator);
__writemsr(0xC0000101, ADJ(TrapFrame)->GsBase);
__writecr2(ADJ(TrapFrame)->FaultAddress);
if( (KiKvaShadow & 1) != 0 )
goto LABEL_49;
}
KiMcheckExit();
}Referenced by:
KiMcheckAbortShadow