HalpTimerSelectRoles

VOID __stdcall HalpTimerSelectRoles(){
  INT64 *v0; 
  INT64 *v1; 
  void *v2; 
  INT64 *Timer; 
  void *v4; 
  void *v5; 
  VOID *v6; 
  VOID *v7; 
  VOID *v8; 
  ULONG_PTR *IdealClockSource; 
  void *v10; 
  void *v11; 
  void *v12; 
  ULONG_PTR *v13; 
  ULONG_PTR *IdealPerformanceCounterSource; 
  void *v15; 
  void *v16; 
  void *v17; 
  INT64 v18; 
  _KDPC *v19; 
  INT64 *v20; 
  void *v21; 
  void *v22; 
  void *v23; 
  INT64 *v24; 
  INT64 *BestAlwaysOnTimer; 
  void *v26; 
  void *v27; 
  void *v28; 
  INT64 *v29; 
  _DWORD *v30; 
  INT64 *v31; 
  void *v32; 
  void *v33; 
  void *v34; 
  INT64 *v35; 
  ULONG_PTR *v36; 
  void *v37; 
  void *v38; 
  void *v39; 
  __int64 v40; 
  ULONG_PTR *IdealWatchdog; 
  void *v42; 
  void *v43; 
  void *v44; 
  ULONG_PTR *v45; 
  INT64 *v46; 
  void *v47; 
  void *v48; 
  void *v49; 
  INT64 *v50; 
  _QWORD *v51; 
  INT64 *v52; 
  void *v53; 
  INT64 *v54; 
  void *v55; 
  void *v56; 

  if( HalpTimerFrequenciesMeasured )
    goto LABEL_6;
  do
  {
    v0 = 0i64;
    v1 = 0i64;
    Timer = HalpFindTimer(1, 2, 24576, 0, 0);
    if( Timer )
      goto LABEL_3;
    Timer = HalpFindTimer(3, 2, 24576, 0, 0);
    if( Timer )
      goto LABEL_3;
    Timer = HalpFindTimer(6, 2, 24576, 0, 0);
    if( Timer )
      goto LABEL_3;
    Timer = HalpFindTimer(2, 0, 0, 0, 0);
    if( Timer )
      goto LABEL_3;
    v46 = (INT64 *)HalpRegisteredTimers;
    if( (INT64 *)HalpRegisteredTimers == &HalpRegisteredTimers )
      goto LABEL_57;
    do
    {
      Timer = v46;
      v46 = (INT64 *)*v46;
      v2 = (void *)*((unsigned int *)Timer + 46);
      if( ((unsigned __int8)v2 & 1) == 0 )
      {
        if( Timer[22] )
          v0 = Timer;
        if( (Timer[28] & 2) != 0 && Timer[24] )
        {
          if( ((unsigned __int8)v2 & 8) == 0 )
            goto LABEL_58;
          if( !v1 )
            v1 = Timer;
        }
      }
    }
    while( v46 != &HalpRegisteredTimers );
    if( v0 )
    {
      Timer = v0;
      goto LABEL_58;
    }
    if( !v1 )
    {
LABEL_57:
      Timer = 0i64;
    }
    else
    {
      *((_DWORD *)v1 + 46) &= ~8u;
      Timer = v1;
    }
LABEL_58:
    if( !Timer )
    {
      HalpTimerLastProblem = 19;
      return;
    }
LABEL_3:
    if( (int)HalpTimerInitialize((INT64)Timer, v2, v4, v5) >= 0 )
    {
      HalpTimerMeasureFrequencies((_KDPC *)Timer, v6, v7, v8);
      HalpTimerFrequenciesMeasured = 1;
    }
  }
  while( !HalpTimerFrequenciesMeasured );
LABEL_6:
  while( !HalpClockTimer )
  {
    IdealClockSource = HalpTimerFindIdealClockSource();
    v13 = IdealClockSource;
    if( !IdealClockSource )
      goto LABEL_60;
    if( (int)HalpTimerInitialize((INT64)IdealClockSource, v10, v11, v12) >= 0 )
    {
      v13[46] |= 4u;
      HalpClockTimer = v13;
      break;
    }
  }
  while( !HalpPerformanceCounter
       || (*(_DWORD *)(HalpPerformanceCounter + 184) & 4) == 0
       || (PVOID)HalpPerformanceCounter == HalpClockTimer )
  {
    IdealPerformanceCounterSource = HalpTimerFindIdealPerformanceCounterSource();
    v18 = (INT64)IdealPerformanceCounterSource;
    if( !IdealPerformanceCounterSource )
    {
      HalpTimerLastProblem = 21;
      return;
    }
    if( (int)HalpTimerInitialize((INT64)IdealPerformanceCounterSource, v15, v16, v17) >= 0 )
    {
      HalpPerformanceCounter = v18;
      HalpTimerPropagateQpcBiasUpdate(v18);
      *(_DWORD *)(v18 + 184) |= 4u;
      break;
    }
  }
  v19 = HalpStallCounter;
  if( ((__int64)HalpStallCounter[3].DeferredContext & 0x2000) != 0 || HalpStallCounter == HalpClockTimer )
  {
    v19 = (_KDPC *)HalpPerformanceCounter;
    HalpStallCounter = (_KDPC *)HalpPerformanceCounter;
  }
  else
  {
    LODWORD(HalpStallCounter[2].DpcData) |= 4u;
  }
  if( v19 != (_KDPC *)HalpOriginalStallTimer )
    *(_DWORD *)(HalpOriginalStallTimer + 184) |= 4u;
  if( !HalpAuxiliaryCounter )
  {
    v20 = HalpFindTimer(15, 1048578, 24576, 0, 0);
    v24 = v20;
    if( v20 )
    {
      if( (unsigned __int64)v20[24] <= 0x3B9ACA00 && (int)HalpTimerInitialize((INT64)v20, v21, v22, v23) >= 0 )
      {
        *((_DWORD *)v24 + 46) |= 4u;
        HalpAuxiliaryCounter = v24;
      }
    }
  }
  while( !HalpAlwaysOnTimer )
  {
    if( (*((_DWORD *)HalpClockTimer + 56) & 0x8000) != 0 )
      break;
    BestAlwaysOnTimer = HalpTimerFindBestAlwaysOnTimer(0);
    v29 = BestAlwaysOnTimer;
    if( !BestAlwaysOnTimer )
      break;
    if( (int)HalpTimerInitialize((INT64)BestAlwaysOnTimer, v26, v27, v28) >= 0 )
    {
      *((_DWORD *)v29 + 46) |= 4u;
      HalpAlwaysOnTimer = v29;
      break;
    }
  }
  v30 = HalpClockTimer;
  if( (*((_DWORD *)HalpClockTimer + 56) & 1) != 0 )
  {
LABEL_26:
    if( HalpAlwaysOnTimer && (*((_DWORD *)HalpAlwaysOnTimer + 56) & 1) == 0 && (v30[56] & 1) != 0 )
    {
      if( (int)HalpVpptTimerRegister() < 0 )
        v52 = 0i64;
      else
        v52 = HalpFindTimer(12, 32, 0, 3840, 0);
      HalpAlwaysOnTimer = v52;
      if( !v52 )
      {
        HalpTimerLastProblem = 33;
        return;
      }
      *((_DWORD *)v52 + 46) |= 4u;
    }
    while( !HalpAlwaysOnCounter
         && ((*(_DWORD *)(HalpPerformanceCounter + 224) & 0x8000) == 0
          || ((__int64)HalpStallCounter[3].DeferredContext & 0x8000) == 0) )
    {
      v31 = HalpTimerFindBestAlwaysOnTimer(1);
      v35 = v31;
      if( !v31 )
        break;
      if( (int)HalpTimerInitialize((INT64)v31, v32, v33, v34) >= 0 )
      {
        *((_DWORD *)v35 + 46) |= 4u;
        HalpAlwaysOnCounter = v35;
        break;
      }
    }
    while( !HalpProfileTimer && (__int64(__fastcall **)())HalpProfileInterface[0] == DefaultProfileInterface )
    {
      v54 = HalpFindTimer(0, 65, 0, 3840, 0);
      if( !v54
        && ((unsigned int)HalpQueryMaximumRegisteredProcessorCount() != 1
         || (v54 = HalpFindTimer(0, 64, 0, 3840, 0)) == 0i64) )
      {
        HalpTimerLastProblem = 23;
        break;
      }
      if( (int)HalpTimerInitialize((INT64)v54, v53, v55, v56) >= 0 )
      {
        *((_DWORD *)v54 + 46) |= 4u;
        HalpProfileTimer = v54;
        HalpTimerStopProfileInterrupt();
        break;
      }
    }
    if( (*(_DWORD *)(HalpPerformanceCounter + 224) & 1) != 0 )
    {
      while( !HalpFallbackPerformanceCounter )
      {
        v36 = HalpTimerFindIdealPerformanceCounterSource();
        v40 = (__int64)v36;
        if( !v36 )
        {
          HalpTimerLastProblem = 22;
          break;
        }
        if( (int)HalpTimerInitialize((INT64)v36, v37, v38, v39) >= 0 )
        {
          *(_DWORD *)(v40 + 184) |= 4u;
          HalpFallbackPerformanceCounter = v40;
          break;
        }
      }
    }
    if( !byte_140C4A360 )
    {
      IdealWatchdog = HalpTimerFindIdealWatchdog();
      v45 = IdealWatchdog;
      if( IdealWatchdog )
      {
        if( (int)HalpTimerInitialize((INT64)IdealWatchdog, v42, v43, v44) >= 0 )
        {
          v45[46] |= 4u;
          HalpWatchdogTimer = v45;
        }
      }
    }
  }
  else
  {
    if( (int)HalpVpptTimerRegister() < 0 )
      v50 = 0i64;
    else
      v50 = HalpFindTimer(12, 32, 0, 3840, 0);
    HalpClockTimer = v50;
    if( !v50 )
    {
LABEL_60:
      HalpTimerLastProblem = 20;
      return;
    }
    if( (int)HalpTimerInitialize((INT64)v50, v47, v48, v49) >= 0 )
    {
      v30 = HalpClockTimer;
      *((_DWORD *)HalpClockTimer + 46) |= 4u;
      goto LABEL_26;
    }
    v51 = HalpClockTimer;
    HalpTimerLastProblem = 20;
    if( HalpClockTimer )
    {
      *((_DWORD *)HalpClockTimer + 63) = 20;
      v51[33] = "minkernel\\hals\\lib\\timers\\common\\timer.c";
      *((_DWORD *)v51 + 64) = 2;
      *((_DWORD *)v51 + 68) = 3280;
    }
  }
}

Referenced by:

HalpInitializeTimers