HalpMceHandlerCore

CHAR __fastcall HalpMceHandlerCore(INT64 a1, CHAR a2, INT64 a3){
  CHAR v6; 
  unsigned int v7; 
  INT64 v8; 
  __int64 v9; 
  _QWORD *McaPcrContext; 
  __int64 *v11; 
  int v12; 
  INT64 v14; 
  LODWORD(v14) = 0;
  v6 = 0;
  v7 = ((__int64(__fastcall *)(INT64, __int64, _QWORD))HalpWheaReadMsr)(a3, 378i64, 0i64);
  if( !a2 || (v8 = v7, LOBYTE(v8) = v7 & 3, (v7 & 3) != 1) && (v7 & 4) != 0 )
  {
    v9 = 0i64;
    if( !HalpMcaWheaReady
      || (McaPcrContext = (_QWORD *)HalpGetMcaPcrContext(a3)) == 0i64
      || (v9 = *McaPcrContext, v11 = (__int64 *)(*McaPcrContext + 80i64), !*McaPcrContext) )
    {
      v11 = HalpMceBackupErrorBuffer;
    }
    while( (int)HalpMcaReadErrorPresence(v8, a3) >= 0 )
    {
      while( !KxTryToAcquireSpinLock((volatile INT32 *)&HalpMceLock) )
        _mm_pause();
      if( (int)HalpMcaReadError(16i64, (INT64)v11, &v14, a1, a3) < 0 )
      {
        KxReleaseSpinLock(&HalpMceLock);
        return v6;
      }
      if( v9 )
      {
        v12 = v14;
        *(_DWORD *)(v9 + 12) = 0;
        *(_DWORD *)(v9 + 20) = v12;
      }
      HalpProcessorInMceHandler = *((_DWORD *)KeGetPcr() + 105);
      HalpMcaReportError((_WHEA_ERROR_PACKET_V2 *)v9, (INT64)v11, a3);
      HalpProcessorInMceHandler = 1280;
      HalpMcaClearError((INT64)v11, a3);
      if( McaWmiCallback )
        LOBYTE(HalpClockWorkUnion) = 1;
      KxReleaseSpinLock(&HalpMceLock);
      v6 = 1;
    }
  }
  return v6;
}

Referenced by:

HalpMceHandler