HalpCmcPollProcessor

VOID __fastcall HalpCmcPollProcessor(INT64 a1, CHAR a2, INT64 a3, INT64 a4){
  unsigned int v4; 
  INT64 v5; 
  unsigned int v6; 
  unsigned __int8 CurrentIrql; 
  char v10; 
  char v11; 
  __int64 v12; 
  unsigned __int64 v13; 
  INT64 v14; 
  char v16[12]; 
  struct _KDPC_WATCHDOG_INFORMATION WatchdogInformation; 
  *(_DWORD *)v16 = 0;
  *(_QWORD *)&v16[4] = a1;
  v4 = 0;
  v5 = 0i64;
  v6 = 0;
  CurrentIrql = 0;
  memset(&WatchdogInformation, 0, sizeof(WatchdogInformation));
  while( (int)HalpMcaReadErrorPresence(v5, a3) >= 0 )
  {
    v10 = 0;
    v11 = 0;
    if( !a2 )
      goto LABEL_12;
    v10 = 1;
    if( KeGetCurrentIrql() < 2u )
    {
      v11 = 1;
      CurrentIrql = KeGetCurrentIrql();
      __writecr8(2ui64);
    }
    if( _InterlockedCompareExchange(&HalpCmcLock, 1, 0) )
    {
      if( v11 )
        __writecr8(CurrentIrql);
    }
    else
    {
LABEL_12:
      if( (int)HalpMcaReadError(1i64, *(_QWORD *)&v16[4] + 80i64, (INT64 *)v16, 0i64, a3) < 0 )
      {
        if( a2 )
        {
          if( v10 )
            _InterlockedExchange(&HalpCmcLock, 0);
          if( v11 )
            __writecr8(CurrentIrql);
        }
        break;
      }
      v12 = *(_QWORD *)&v16[4];
      v13 = *(_QWORD *)(*(_QWORD *)&v16[4] + 120i64);
      v14 = *(_QWORD *)&v16[4] + 80i64;
      *(_DWORD *)(*(_QWORD *)&v16[4] + 12i64) = 0;
      v4 += (v13 >> 38) & 0x7FFF;
      *(_DWORD *)(v12 + 20) = *(_DWORD *)v16;
      HalpMcaReportError((_WHEA_ERROR_PACKET_V2 *)v12, v14, a3);
      HalpMcaClearError(*(_QWORD *)&v16[4] + 80i64, a3);
      if( a2 )
      {
        if( v10 )
          _InterlockedExchange(&HalpCmcLock, 0);
        if( v11 )
          __writecr8(CurrentIrql);
      }
      ++v6;
      if( HalpCmcPollCount != -1 && HalpCmcPollCount && v6 >= HalpCmcPollCount )
        break;
    }
    v5 = 2i64;
    if( KeGetCurrentIrql() >= 2u )
    {
      memset(&WatchdogInformation, 0, sizeof(WatchdogInformation));
      if( !KeQueryDpcWatchdogInformation(&WatchdogInformation) )
      {
        if( HalpCmcIsDpcTimeRunningLow((INT64 *)&WatchdogInformation) )
        {
          HalpCmcLogPollingTimeoutEvent((INT64)&WatchdogInformation, v6);
          break;
        }
      }
    }
  }
  *(_DWORD *)(a4 + 156) = v4;
  if( v4 > *(_DWORD *)(a4 + 160) )
    *(_DWORD *)(a4 + 160) = v4;
}

Referenced by:

HalpCmcWorkerRoutine
HalpCmciPollProcessor