HalpCmcWorkerRoutine

VOID __fastcall HalpCmcWorkerRoutine(INT64 a1){
  INT64 v1; 
  unsigned int v2; 
  unsigned int ActiveProcessorCount; 
  unsigned int v4; 
  int *v5; 
  unsigned int v6; 
  unsigned int v7; 
  struct _GROUP_AFFINITY *p_PreviousAffinity; 
  INT64 v9; 
  unsigned int v10; 
  unsigned int v11; 
  PVOID v12; 
  unsigned int v13; 
  bool v14; 
  struct _GROUP_AFFINITY Affinity; 
  INT64 v16; 
  __int128 Src; 
  __int128 v18; 
  __int128 v19; 
  struct _GROUP_AFFINITY PreviousAffinity; 
  ++*(_DWORD *)(a1 + 184);
  v1 = a1;
  v16 = a1;
  v2 = 0;
  Affinity = 0i64;
  PreviousAffinity = 0i64;
  Src = 0i64;
  v18 = 0i64;
  v19 = 0i64;
  ActiveProcessorCount = KeQueryActiveProcessorCountEx(0xFFFFu);
  v4 = 0;
  if( ActiveProcessorCount )
  {
    v5 = KiProcessorIndexToNumberMappingTable;
    v6 = ActiveProcessorCount;
    do
    {
      v7 = *v5;
      Affinity.Reserved[1] = 0;
      Affinity.Reserved[2] = 0;
      *(_DWORD *)&Affinity.Group = (unsigned __int16)(v7 >> 6);
      Affinity.Mask = 1i64 << (v7 & 0x3F);
      if( v4 )
        p_PreviousAffinity = 0i64;
      else
        p_PreviousAffinity = &PreviousAffinity;
      KeSetSystemGroupAffinityThread(&Affinity, p_PreviousAffinity);
      v9 = *((_QWORD *)KeGetPcr() + 27);
      while( v9 )
      {
        v10 = v2;
        HalpCmcPollProcessor(HalpCmcErrorPacket, HalpCmciEnabled, *(_QWORD *)(v9 + 164), v9);
        v2 = *(_DWORD *)(v9 + 156);
        v9 = *(_QWORD *)(v9 + 176);
        if( v2 <= v10 )
          v2 = v10;
      }
      ++v4;
      ++v5;
    }
    while( v4 < v6 );
    v1 = v16;
  }
  if( HalpCmciRevertToPolledMode )
  {
    if( *(_BYTE *)(v1 + 172) )
    {
      if( *(_DWORD *)(v1 + 184) > 1u )
      {
        v11 = *(_DWORD *)(v1 + 188);
        if( v11 < *(_DWORD *)(v1 + 180) && v2 < *(_DWORD *)(v1 + 176) )
        {
          *(_DWORD *)(v1 + 188) = v11 + 1;
          KeCancelTimer((PKTIMER)(v1 + 8));
          v12 = HalpCmcErrorSource;
          HalpCmciRevertToPolledMode = 0;
          HalpCmcPollingStarted = 0;
          *((_BYTE *)HalpCmcErrorSource + 48) = 5;
          HalpCmciInit((INT64)v12);
          v13 = *(_DWORD *)(v1 + 180);
          v14 = *(_DWORD *)(v1 + 188) < v13;
          LODWORD(v19) = *(_DWORD *)(v1 + 188);
          *(_DWORD *)(v1 + 184) = 0;
          *(_QWORD *)&Src = 0x1674C6857i64;
          DWORD1(v18) = -v14 - 2147483620;
          HIDWORD(v19) = *(_DWORD *)(v1 + 176);
          *((_QWORD *)&Src + 1) = 48i64;
          LODWORD(v18) = 541868360;
          *((_QWORD *)&v18 + 1) = 0x1000000002i64;
          *(_QWORD *)((char *)&v19 + 4) = __PAIR64__(v2, v13);
          WheaLogInternalEvent(&Src);
        }
      }
    }
  }
  KeRevertToUserGroupAffinityThread(&PreviousAffinity);
  _InterlockedExchange((volatile __int32 *)(v1 + 168), 0);
}

Referenced by:

No references.