HalpInitializeMce

__int64 __fastcall HalpInitializeMce(int a1, INT64 a2, INT64 a3, INT64 a4){
  UINT8 v5; 
  _HHIVE *v6; 
  _CELL_DATA *v7; 
  UINT64 v8; 
  INT64 v9; 
  INT64 v10; 
  INT64 v11; 
  __int64 v13; 
  __int64 v14; 
  __int64 v15; 
  __int64 v16; 
  unsigned int v17; 
  unsigned int ActiveProcessorCount; 
  int *v19; 
  unsigned int v20; 
  _GROUP_AFFINITY *v21; 
  __int64 i; 
  int v23[8]; 
  INT64 v24; 
  _GROUP_AFFINITY Affinity; 
  __int128 v26; 

  v24 = 0i64;
  Affinity = 0i64;
  v26 = 0i64;
  if( a1 )
  {
    if( a1 == 1 )
    {
      dword_140C5056C = *(_DWORD *)(a2 + 28);
      qword_140C50540 = a2;
      HalpMceInit(a2, a2, a3, a4);
      if( *(&stru_140CF2E80 + 7434) )
        HalpMcaExtendedLogInitialize();
      if( !PshedIsSystemWheaEnabled() )
        HalpHandlePreviousMcaErrors(byte_140C50520 != 0);
      _InterlockedOr(v23, 0);
      if( (unsigned __int8)PshedInitAvailable(v14, v13, v15, v16, v24) )
      {
        PshedInitGlobal();
        v17 = 0;
        ActiveProcessorCount = KeQueryActiveProcessorCountEx(0xFFFFu);
        if( ActiveProcessorCount )
        {
          v19 = KiProcessorIndexToNumberMappingTable;
          do
          {
            v20 = *v19;
            Affinity.Reserved[1] = 0;
            Affinity.Reserved[2] = 0;
            *(_DWORD *)&Affinity.Group = (unsigned __int16)(v20 >> 6);
            Affinity.Mask = 1i64 << (v20 & 0x3F);
            if( v17 )
              v21 = 0i64;
            else
              v21 = (_GROUP_AFFINITY *)&v26;
            KeSetSystemGroupAffinityThread(&Affinity, v21);
            for( i = *(_QWORD *)&KeGetPcr()->HalReserved[6]; i; i = *(_QWORD *)(i + 176) )
              PshedInitProc(*(unsigned int *)(i + 164));
            ++v17;
            ++v19;
          }
          while( v17 < ActiveProcessorCount );
        }
      }
      byte_140C50550 = 1;
    }
    else
    {
      LODWORD(v24) = KeGetPcr()->Prcb.Number;
      HalpMceInitProcessor(a2, v24);
      HalpHandlePreviousMcaErrorsOnProcessor(0i64, 0i64, v24);
    }
  }
  else
  {
    dword_140C5056C = *(_DWORD *)(a2 + 28);
    qword_140C50540 = a2;
    HalpMcaSetFeatureFlags();
    HalpInitializeGhesRecovery(
      v6,
      v5,
      v7,
      v8,
      v24,
      (_RTL_BITMAP *)Affinity.Mask,
      *(UINT64 **)&Affinity.Group,
      (UINT64 *)v26);
    HalpMceInitializeRecovery();
    HalpMceInit(a2, v9, v10, v11);
  }
  return 0i64;
}

Referenced by:

HalpInitializeErrSrc