HalpMceInit

VOID __stdcall HalpMceInit(INT64 a1, INT64 a2, INT64 a3, INT64 a4){
  unsigned int v5; 
  unsigned int ActiveProcessorCount; 
  int *v7; 
  unsigned int v8; 
  _GROUP_AFFINITY *p_PreviousAffinity; 
  __int64 i; 
  _GROUP_AFFINITY Affinity; 
  _GROUP_AFFINITY PreviousAffinity; 

  Affinity = 0i64;
  PreviousAffinity = 0i64;
  if( (dword_140C4A10C & 4) == 0 || !*(_BYTE *)(a1 + 42) )
    HalpMcaEnabled = 0;
  if( !HalpMcaEnabled && (dword_140C4A10C & 8) == 0 )
    HalpMceEnabled = 0;
  v5 = 0;
  ActiveProcessorCount = KeQueryActiveProcessorCountEx(0xFFFFu);
  if( ActiveProcessorCount )
  {
    v7 = KiProcessorIndexToNumberMappingTable;
    do
    {
      v8 = *v7;
      Affinity.Reserved[1] = 0;
      Affinity.Reserved[2] = 0;
      *(_DWORD *)&Affinity.Group = (unsigned __int16)(v8 >> 6);
      Affinity.Mask = 1i64 << (v8 & 0x3F);
      if( v5 )
        p_PreviousAffinity = 0i64;
      else
        p_PreviousAffinity = &PreviousAffinity;
      KeSetSystemGroupAffinityThread(&Affinity, p_PreviousAffinity);
      HalpHvInitMcaPcrContext();
      for( i = *(_QWORD *)&KeGetPcr()->HalReserved[6]; i; i = *(_QWORD *)(i + 176) )
        HalpMceInitProcessor(a1, *(_QWORD *)(i + 164));
      ++v5;
      ++v7;
    }
    while( v5 < ActiveProcessorCount );
  }
  KeRevertToUserGroupAffinityThread(&PreviousAffinity);
  if( byte_140C4A110 )
  {
    if( HalpMceEnabled )
    {
      HalpHvInitMcaStatusMsrCache();
      HalpHvSetMachineCheckHandlerState();
    }
  }
}

Referenced by:

HalpInitializeMce