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