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