HalpCmciInit

VOID __fastcall HalpCmciInit(INT64 a1){
  LARGE_INTEGER PerformanceCounter; 
  unsigned int v3; 
  unsigned int ActiveProcessorCount; 
  int *v5; 
  unsigned int v6; 
  struct _GROUP_AFFINITY *p_PreviousAffinity; 
  _QWORD *i; 
  INT64 v9; 
  struct _GROUP_AFFINITY Affinity; 
  struct _GROUP_AFFINITY PreviousAffinity; 
  Affinity = 0i64;
  PreviousAffinity = 0i64;
  HalpCmciLoadThresholdConfiguration();
  PerformanceCounter = KeQueryPerformanceCounter(0i64);
  v3 = 0;
  ActiveProcessorCount = KeQueryActiveProcessorCountEx(0xFFFFu);
  if( ActiveProcessorCount )
  {
    v5 = KiProcessorIndexToNumberMappingTable;
    do
    {
      v6 = *v5;
      Affinity.Reserved[1] = 0;
      Affinity.Reserved[2] = 0;
      *(_DWORD *)&Affinity.Group = (unsigned __int16)(v6 >> 6);
      Affinity.Mask = 1i64 << (v6 & 0x3F);
      if( v3 )
        p_PreviousAffinity = 0i64;
      else
        p_PreviousAffinity = &PreviousAffinity;
      KeSetSystemGroupAffinityThread(&Affinity, p_PreviousAffinity);
      for( i = (_QWORD *)*((_QWORD *)KeGetPcr() + 27); i; i = (_QWORD *)i[22] )
      {
        v9 = *(_QWORD *)((char *)i + 164);
        i[13] = PerformanceCounter.QuadPart;
        HalpCmciInitializeErrorPacket(a1, v9);
        HalpCmciInitProcessor(a1, v9);
      }
      ++v3;
      ++v5;
    }
    while( v3 < ActiveProcessorCount );
  }
  KeRevertToUserGroupAffinityThread(&PreviousAffinity);
}

Referenced by:

HalpCmcWorkerRoutine
HalpInitializeCmc