HalpCmcPollProcessor

VOID __stdcall HalpCmcPollProcessor(INT64 a1, CHAR a2, INT64 a3, INT64 a4){
  unsigned int v4; 
  INT64 v5; 
  unsigned int v6; 
  unsigned __int8 CurrentIrql; 
  char v10; 
  char v11; 
  int v12; 
  __int64 v13; 
  unsigned __int64 v14; 
  INT64 v15; 
  INT64 v16; 
  INT64 v17; 
  INT64 v18; 
  INT64 v19; 
  INT64 v20; 
  INT16 PageIrql[4]; 
  INT64 v22[2]; 
  UINT64 v23; 
  INT64 v24; 
  INT64 v25; 
  INT64 v26; 
  INT64 v27; 

  HIDWORD(v20) = 0;
  *(_QWORD *)PageIrql = a1;
  v4 = 0;
  v5 = 0i64;
  LOBYTE(v20) = a2;
  v6 = 0;
  LODWORD(v23) = 0;
  CurrentIrql = 0;
  *(_OWORD *)v22 = 0i64;
  while( HalpMcaReadErrorPresence(v5, a3) >= 0 )
  {
    v10 = 0;
    v11 = 0;
    if( !(_BYTE)v20 )
      goto LABEL_12;
    v10 = 1;
    if( KeGetCurrentIrql() < 2u )
    {
      v11 = 1;
      CurrentIrql = KeGetCurrentIrql();
      __writecr8(2ui64);
    }
    if( _InterlockedCompareExchange((_DWORD *)&stru_140CF2E80 + 1975, 1, 0) )
    {
      if( v11 )
        __writecr8(CurrentIrql);
    }
    else
    {
LABEL_12:
      HalpMcaReadError(
        1i64,
        *(_QWORD *)PageIrql + 80i64,
        (INT64)&v20 + 4,
        0i64,
        a3,
        v19,
        v20,
        PageIrql[0],
        v22[0],
        (_MMSUPPORT_INSTANCE *)v22[1],
        v23);
      if( v12 < 0 )
      {
        if( (_BYTE)v20 )
        {
          if( v10 )
            _InterlockedExchange((_DWORD *)&stru_140CF2E80 + 1975, 0);
          if( v11 )
            __writecr8(CurrentIrql);
        }
        break;
      }
      v13 = *(_QWORD *)PageIrql;
      v14 = *(_QWORD *)(*(_QWORD *)PageIrql + 120i64);
      v15 = *(_QWORD *)PageIrql + 80i64;
      *(_DWORD *)(*(_QWORD *)PageIrql + 12i64) = 0;
      v4 += (v14 >> 38) & 0x7FFF;
      *(_DWORD *)(v13 + 20) = HIDWORD(v20);
      HalpMcaReportError((_WHEA_ERROR_PACKET_V2 *)v13, v15, a3);
      HalpMcaClearError(*(_QWORD *)PageIrql + 80i64, a3);
      if( (_BYTE)v20 )
      {
        if( v10 )
          _InterlockedExchange((_DWORD *)&stru_140CF2E80 + 1975, 0);
        if( v11 )
          __writecr8(CurrentIrql);
      }
      ++v6;
      if( HalpCmcPollCount != -1 && HalpCmcPollCount && v6 >= HalpCmcPollCount )
        break;
    }
    v5 = 2i64;
    if( KeGetCurrentIrql() >= 2u )
    {
      *(_OWORD *)v22 = 0i64;
      LODWORD(v23) = 0;
      if( !KeQueryDpcWatchdogInformation((_KDPC_WATCHDOG_INFORMATION *)v22) )
      {
        if( HalpCmcIsDpcTimeRunningLow(v22) )
        {
          HalpCmcLogPollingTimeoutEvent(
            (INT64)v22,
            v6,
            v16,
            v17,
            v18,
            v19,
            v20,
            PageIrql[0],
            v22[0],
            v22[1],
            v23,
            v24,
            v25,
            v26,
            v27);
          break;
        }
      }
    }
  }
  *(_DWORD *)(a4 + 156) = v4;
  if( v4 > *(_DWORD *)(a4 + 160) )
    *(_DWORD *)(a4 + 160) = v4;
}

Referenced by:

HalpCmcWorkerRoutine
HalpCmciPollProcessor