PpmIdleCheckCoordinatedStateEligibility
INT64 __fastcall PpmIdleCheckCoordinatedStateEligibility(
_KPRCB *Prcb,
UINT64 PreselectState,
UINT64 RemainingLatency,
UINT64 ExpectedIdle,
UINT64 StateIndex,
UINT64 EntryPriority,
UINT *ProcessorState,
_PPM_COORDINATED_SELECTION *CoordinatedSelection){
unsigned int v8;
UINT64 v9;
unsigned int v10;
__int64 v12;
__int64 v13;
_KAFFINITY_EX *SecondaryMask;
__int64 v15;
unsigned int v16;
UINT64 v17;
UINT64 v18;
unsigned int v19;
UINT64 Dependencies;
unsigned int StateIndexa;
v8 = StateIndex;
v9 = PpmPlatformStates;
v10 = RemainingLatency;
v12 = *((_QWORD *)Prcb + 4096);
v13 = 384i64 * (unsigned int)StateIndex;
SecondaryMask = (_KAFFINITY_EX *)(v12 + 240);
StateIndexa = CoordinatedSelection->SelectedStates;
if( *(_BYTE *)(v13 + PpmPlatformStates + 121) )
{
if( !*(_BYTE *)(v12 + 540) )
{
v15 = *((_BYTE *)Prcb + 33) != 0 ? 0xFFFFFFFFi64 : 2147483660i64;
LABEL_21:
PpmIdleRollbackCoordinatedSelection((INT64)CoordinatedSelection, StateIndexa);
return v15;
}
}
else if( !(unsigned int)KeIsSubsetAffinityEx(
(_KAFFINITY_EX *)(v13 + PpmPlatformStates + 128),
(_KAFFINITY_EX *)(v12 + 576)) )
{
LABEL_5:
v15 = 0xFFFFFFFFi64;
goto LABEL_21;
}
if( _InterlockedCompareExchange(
(volatile signed __int32 *)(v13 + v9 + 320),
((_DWORD)EntryPriority << 27) | *((_DWORD *)KeGetPcr() + 105) & 0xFFF | 0x1000000,
0) )
{
goto LABEL_5;
}
CoordinatedSelection->Selection[CoordinatedSelection->SelectedStates++] = v8;
v16 = PpmCheckIdleVeto(v13 + v9 + 80);
if( v16 )
{
v15 = v16 | 0x100000000i64;
goto LABEL_21;
}
if( *(_DWORD *)(v13 + v9 + 72) > v10 )
{
v15 = 2147483650i64;
goto LABEL_21;
}
if( *(_DWORD *)(v13 + v9 + 384) )
goto LABEL_20;
if( *(unsigned int *)(v13 + v9 + 76) > v18 )
{
v15 = 2147483651i64;
goto LABEL_21;
}
LODWORD(Dependencies) = *(_DWORD *)(v13 + v9 + 124);
v15 = PpmIdleCheckCoordinatedDependencies(
Prcb,
v19,
v17,
v10 - *(_DWORD *)(v13 + v9 + 72),
v18,
Dependencies,
*(_PPM_SELECTION_DEPENDENCY **)(v13 + v9 + 312),
ProcessorState,
CoordinatedSelection,
SecondaryMask);
if( v15 )
goto LABEL_21;
if( *ProcessorState == -1 )
{
v15 = 2147483649i64;
goto LABEL_21;
}
if( (int)PpmIdleWaitForDependentTransitions((__int64)SecondaryMask) < 0 )
{
v15 = 2147483653i64;
goto LABEL_21;
}
if( *(_DWORD *)(v13 + v9 + 384) )
{
LABEL_20:
v15 = 2147483652i64;
goto LABEL_21;
}
return v15;
}Referenced by:
PpmIdleCheckCoordinatedDependency
PpmIdleSelectStates