KiNmiInterruptStart
VOID __stdcall KiNmiInterruptStart(UINT64 a1, UINT64 a2, UINT64 a3, UINT64 a4, INT64 a5, INT64 a6, INT64 a7, INT64 a8){
unsigned __int64 v8;
unsigned __int64 v9;
unsigned __int64 v10;
_M128A v11;
_M128A v12;
_M128A v13;
_M128A v14;
_KTRAP_FRAME *__shifted(_KTRAP_FRAME,0x80) TrapFrame;
bool v16;
unsigned __int32 v17;
unsigned __int64 *v18;
int v19;
int v20;
unsigned __int64 v21;
_M128A v22;
_M128A v23;
__int64 v24;
unsigned __int8 CurrentIrql;
unsigned __int8 v26;
_ETHREAD *CurrentThread;
INT64 R9;
INT64 R8;
INT64 Rdx;
INT64 Rcx;
void *retaddr;
__int16 v34;
int v35;
void *v36;
__int16 v37;
TrapFrame = KeGetTrapFrame();
ADJ(TrapFrame)->ExceptionActive = 0;
ADJ(TrapFrame)->_Rax = v8;
ADJ(TrapFrame)->_Rcx = a1;
ADJ(TrapFrame)->_Rdx = a2;
ADJ(TrapFrame)->_R8 = a3;
ADJ(TrapFrame)->_R9 = a4;
ADJ(TrapFrame)->_R10 = v9;
ADJ(TrapFrame)->_R11 = v10;
if( (ADJ(TrapFrame)->SegCs & 1) == 0 )
{
ADJ(TrapFrame)->GsBase = __readmsr(0xC0000101);
v17 = __segmentlimit(0x50u);
if( v16 )
{
v20 = (v17 & 0x3FF) << 6;
v19 = v17 >> 14;
}
else
{
if( !KUSER_SHARED_DATA.ProcessorFeatures[32] )
{
__sgdt(&ADJ(TrapFrame)->_Xmm0);
v18 = *(unsigned __int64 **)(*(unsigned __int64 *)((char *)&ADJ(TrapFrame)->_Xmm0.Low + 2) - 8000);
LABEL_8:
__writemsr(0xC0000101, (unsigned __int64)v18);
v21 = __readcr2();
ADJ(TrapFrame)->FaultAddress = v21;
KiSetSpecCtrlNmi();
goto LABEL_13;
}
__asm { rdtscp }
v19 = 1;
v20 = 805306432;
}
v18 = &(*(&KiProcessorBlock + (unsigned int)KiProcessorNumberToIndexMappingTable[v20 | v19]))[-1].PrcbPad141[472];
goto LABEL_8;
}
if( (KiKvaShadow & 1) == 0 )
__swapgs();
_mm_lfence();
KiSetSpecCtrlNmi();
v16 = (*(_BYTE *)(v24 + 3) & 3) == 0;
LOWORD(ADJ(TrapFrame)->Dr7) = 0;
if( !v16 )
KiSaveDebugRegisterState();
LABEL_13:
ADJ(TrapFrame)->_MxCsr = _mm_getcsr();
_mm_setcsr(KeGetPcr()->Prcb._MxCsr);
ADJ(TrapFrame)->_Xmm0 = v11;
ADJ(TrapFrame)->_Xmm1 = v12;
ADJ(TrapFrame)->_Xmm2 = v13;
ADJ(TrapFrame)->_Xmm3 = v14;
ADJ(TrapFrame)->_Xmm4 = v22;
ADJ(TrapFrame)->_Xmm5 = v23;
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;
KiMcheckFastForward(ADJ(TrapFrame));
v26 = _bittestandset16(MK_FP(__GS__, 32102i64), 0);
if( v26
|| (ADJ(TrapFrame)->SegCs & 1) == 0
&& (unsigned __int64)KiNmiInterruptStart <= ADJ(TrapFrame)->_Rip
&& (unsigned __int64)&KiNmiInterruptEnd > ADJ(TrapFrame)->_Rip
|| (unsigned __int64)KiNmiInterruptShadow <= ADJ(TrapFrame)->_Rip
&& (unsigned __int64)KiNmiInterruptShadowEnd > ADJ(TrapFrame)->_Rip )
{
KiBugCheckDispatch(0x111u, 0i64, 0i64, 0i64);
}
KxNmiInterrupt();
__writegsbyte(0x7D66u, 0);
__writecr8(ADJ(TrapFrame)->PreviousIrql);
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();
R9 = ADJ(TrapFrame)->_R9;
R8 = ADJ(TrapFrame)->_R8;
__writegsbyte(0x853u, ADJ(TrapFrame)->InterruptRetpolineState);
if( KeGetPcr()->Prcb.BpbKernelSpecCtrl )
__writemsr(0x48u, ADJ(TrapFrame)->FaultIndicator);
Rdx = ADJ(TrapFrame)->_Rdx;
Rcx = ADJ(TrapFrame)->_Rcx;
if( (KiKvaShadow & 1) == 0 )
{
__swapgs();
__iretq(retaddr, v34, v35, v36, v37);
}
}
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);
R9 = ADJ(TrapFrame)->_R9;
R8 = ADJ(TrapFrame)->_R8;
Rdx = ADJ(TrapFrame)->_Rdx;
Rcx = ADJ(TrapFrame)->_Rcx;
if( (KiKvaShadow & 1) == 0 )
__iretq(retaddr, v34, v35, v36, v37);
}
KiKernelIstExit(Rcx, Rdx, R8, R9, a5, a6, a7, a8);
}Referenced by:
KiNmiInterruptShadow