KiProcessNMI
NTSTATUS __stdcall KiProcessNMI(_KTRAP_FRAME *a1, _KTRAP_FRAME *a2){
unsigned __int64 v4;
__int64 Number;
unsigned int v6;
unsigned __int64 v7;
unsigned __int64 v8;
__int64 v9;
__int64(__fastcall *v10)(_QWORD, __int64);
char v11;
char v12;
((void(__fastcall *)(_QWORD))off_140C00978[0])(0i64);
if( (KiSpeculationFeatures & 0x2000000) != 0 )
KiFlushCurrentRsb();
_mm_lfence();
LOBYTE(v4) = KiCheckForFreezeExecution(a1, (_KEXCEPTION_FRAME *)a2);
if( !(_BYTE)v4 )
{
Number = KeGetCurrentPrcb()->Number;
v6 = KiProcessorIndexToNumberMappingTable[Number];
v7 = (unsigned __int64)v6 >> 6;
v8 = 1i64 << (v6 & 0x3F);
_m_prefetchw(&KiNmiInProgress.Bitmap[v7]);
v4 = _InterlockedOr64((volatile signed __int64 *)&KiNmiInProgress.Bitmap[v7], v8);
if( (v8 & v4) == 0 )
{
((void(__fastcall *)(__int64))off_140C00978[0])(1i64);
v10 = (__int64(__fastcall *)(_QWORD, __int64))KiNmiCallbackListHead;
v11 = 0;
if( !KiNmiCallbackListHead )
goto LABEL_8;
do
{
LOBYTE(v9) = v11;
v12 = (*((__int64(__fastcall **)(_QWORD, __int64))v10 + 1))(*((_QWORD *)v10 + 2), v9);
v10 = *(__int64(__fastcall **)(_QWORD, __int64))v10;
v11 |= v12;
}
while( v10 );
if( !v11 )
{
LABEL_8:
while( !KxTryToAcquireSpinLock(&KiNMILock) )
{
do
KiCheckForFreezeExecution(a1, (_KEXCEPTION_FRAME *)a2);
while( *(_QWORD *)&KiNMILock );
}
_InterlockedCompareExchange(&KiBugCheckActive, 1, 0);
HalHandleNMI();
_InterlockedCompareExchange(&KiBugCheckActive, 0, 1);
KxReleaseSpinLock((UINT64 *)&KiNMILock);
}
v4 = (unsigned __int64)(unsigned int)KiProcessorIndexToNumberMappingTable[Number] >> 6;
_InterlockedAnd64(
(volatile signed __int64 *)&KiNmiInProgress.Bitmap[v4],
~(1i64 << (KiProcessorIndexToNumberMappingTable[Number] & 0x3F)));
}
}
return v4;
}Referenced by:
KxNmiInterrupt