PpmIdleCheckCoordinatedStateEligibility

UINT64 __stdcall PpmIdleCheckCoordinatedStateEligibility(
        _KPRCB *Prcb,
        UINT64 PreselectState,
        UINT64 RemainingLatency,
        UINT64 ExpectedIdle,
        UINT64 StateIndex,
        UINT64 EntryPriority,
        UINT64 *ProcessorState,
        _PPM_COORDINATED_SELECTION *CoordinatedSelection){
  unsigned int v8; 
  __int64 v9; 
  unsigned int v10; 
  _PPM_IDLE_STATES *IdleStates; 
  __int64 v13; 
  _KAFFINITY_EX *SecondaryMask; 
  __int64 v15; 
  int v16; 
  unsigned int v17; 
  UINT64 v18; 
  UINT64 v19; 
  unsigned int v20; 
  UINT64 Dependencies; 
  unsigned int StateIndexa; 

  v8 = StateIndex;
  v9 = PpmPlatformStates;
  v10 = RemainingLatency;
  IdleStates = Prcb->PowerState.IdleStates;
  v13 = 384i64 * (unsigned int)StateIndex;
  SecondaryMask = &IdleStates->SecondaryProcessorMask;
  StateIndexa = CoordinatedSelection->SelectedStates;
  if( *(_BYTE *)(v13 + PpmPlatformStates + 121) )
  {
    if( !IdleStates->PrepareInfo.Constraints.PlatformIdle )
    {
      v15 = Prcb->ClockOwner != 0 ? 0xFFFFFFFFi64 : 2147483660i64;
LABEL_21:
      PpmIdleRollbackCoordinatedSelection(CoordinatedSelection, StateIndexa);
      return v15;
    }
  }
  else
  {
    KeIsSubsetAffinityEx((_KAFFINITY_EX *)(v13 + PpmPlatformStates + 128), &IdleStates->DeepIdleSnapshot);
    if( !v16 )
    {
LABEL_5:
      v15 = 0xFFFFFFFFi64;
      goto LABEL_21;
    }
  }
  if( _InterlockedCompareExchange(
         (volatile signed __int32 *)(v13 + v9 + 320),
         ((_DWORD)EntryPriority << 27) | KeGetPcr()->Prcb.Number & 0xFFF | 0x1000000,
         0) )
  {
    goto LABEL_5;
  }
  CoordinatedSelection->Selection[CoordinatedSelection->SelectedStates++] = v8;
  v17 = PpmCheckIdleVeto((_PPM_VETO_ACCOUNTING *)(v13 + v9 + 80));
  if( v17 )
  {
    v15 = v17 | 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) > v19 )
  {
    v15 = 2147483651i64;
    goto LABEL_21;
  }
  LODWORD(Dependencies) = *(_DWORD *)(v13 + v9 + 124);
  v15 = PpmIdleCheckCoordinatedDependencies(
          Prcb,
          v20,
          v18,
          v10 - *(_DWORD *)(v13 + v9 + 72),
          v19,
          Dependencies,
          *(_PPM_SELECTION_DEPENDENCY **)(v13 + v9 + 312),
          ProcessorState,
          CoordinatedSelection,
          SecondaryMask);
  if( v15 )
    goto LABEL_21;
  if( *(_DWORD *)ProcessorState == -1 )
  {
    v15 = 2147483649i64;
    goto LABEL_21;
  }
  if( PpmIdleWaitForDependentTransitions(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