KiNmiInterruptStart
VOID __fastcall 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;
char *v18;
int v19;
int v20;
unsigned __int64 v21;
_M128A v22;
_M128A v23;
__int64 v24;
unsigned __int8 CurrentIrql;
unsigned __int8 v26;
_KTHREAD *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 = *(char **)(*(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 = (char *)*(&KiProcessorBlock + (unsigned int)KiProcessorNumberToIndexMappingTable[v20 | v19]) - 384;
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(*((_DWORD *)KeGetPcr() + 96));
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( *((_BYTE *)KeGetPcr() + 32794) )
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 & 0x40010000) != 0 && (*((_BYTE *)CurrentThread + 2) & 1) != 0 )
KiCopyCounters((_KTHREAD *)CurrentThread);
_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( *((_BYTE *)KeGetPcr() + 635) )
__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( *((_BYTE *)KeGetPcr() + 635) )
__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