HalHandleNMI

INT8 __stdcall HalHandleNMI(){
  INT64 *v0; 
  char v1; 
  INT8 result; 
  INT8 v3; 
  INT64 v4; 
  UINT64 v5; 
  _WHEAP_ERROR_SOURCE *ErrorSource; 

  dword_140C50698 = 1;
  HalpProcessorInNmiHandler = KeGetPcr()->Prcb.Number;
  if( !HalpGenericNmiInitDone )
    goto LABEL_7;
  v0 = (INT64 *)qword_140C49AE0;
  v1 = 0;
  if( (INT64 *)qword_140C49AE0 == &qword_140C49AE0 )
    goto LABEL_7;
  do
  {
    result = HalpCheckAndReportGhes((INT64)v0);
    v0 = (INT64 *)*v0;
    if( result )
      v1 = 1;
  }
  while( v0 != &qword_140C49AE0 );
  if( v1 != 1 )
  {
LABEL_7:
    result = __inbyte(0x61u);
    v3 = result;
    if( HIDWORD(ErrorSourceId) == 1 )
    {
      memset(&ErrPkt, 0i64, 0x5Cu);
      ErrPkt.Version = 3;
      ErrPkt.ErrorType = WheaErrTypeNMI;
      ErrPkt.ErrorSourceType = WheaErrSrcTypeNMI;
      ErrPkt.Signature = 1095059543;
      dword_140C506F8 = ((unsigned __int32)ErrPkt.Flags._bf_0 >> 2) & 1;
      ErrPkt.Length = 92;
      ErrPkt.ErrorSeverity = WheaErrSevFatal;
      ErrPkt.ErrorSourceId = ErrorSourceId;
      ErrPkt.NotifyType = NMI_NOTIFY_TYPE_GUID;
      ErrPkt.DataFormat = WheaDataFormatNMIPort;
      ErrPkt.DataOffset = 80;
      ErrPkt.DataLength = 12;
      byte_140C506F0 = v3;
      ErrorSource = WheapGetErrorSource(
                      (_WHEAP_ERROR_SOURCE_TABLE *)&WheapErrorSourceTable,
                      (unsigned int)ErrorSourceId,
                      v4,
                      v5);
      PshedRetrieveErrorInfo(
        &ErrPkt,
        (unsigned __int64)&ErrorSource->Descriptor & ((unsigned __int128)-(__int128)(unsigned __int64)ErrorSource >> 64));
      result = WheaReportHwError(&ErrPkt);
    }
  }
  HalpProcessorInNmiHandler = 1280;
  return result;
}

Referenced by:

KiProcessNMI