PpmTestAndLockProcessor

NTSTATUS __stdcall PpmTestAndLockProcessor(
        _KPRCB *Prcb,
        _KAFFINITY_EX *SecondaryProcessorMask,
        PPM_SELECTION_MENU *Menu){
  volatile _PPM_IDLE_SYNCHRONIZATION_STATE *p_Synchronization; 
  volatile _PPM_IDLE_SYNCHRONIZATION_STATE v4; 
  _PPM_SELECTION_MENU_ENTRY *v5; 
  _KAFFINITY_EX *v7; 
  int v9; 
  unsigned int Count; 
  __int64 i; 
  unsigned __int64 v12; 
  unsigned __int64 v13; 
  _PPM_IDLE_STATES *IdleStates; 
  __int64 v15; 
  _QWORD v17[4]; 

  p_Synchronization = &Prcb->PowerState.Synchronization;
  v4.AsLong = (int)Prcb->PowerState.Synchronization;
  v5 = 0i64;
  v17[3] = 0x100000000i64;
  v17[2] = Prcb;
  v7 = SecondaryProcessorMask;
  v17[0] = 0i64;
  v17[1] = PopIdleTransitionTimeout;
  if( (v4.AsLong & 0xFF000000) == 0x2000000 )
  {
    do
    {
      PpmIdleTransitionStall((__int64)v17);
      v4.AsLong = p_Synchronization->AsLong;
    }
    while( (p_Synchronization->AsLong & 0xFF000000) == 0x2000000 );
    v7 = SecondaryProcessorMask;
  }
  v9 = -1073741782;
  if( HIBYTE(v4.AsLong) - 3 <= 2u )
  {
    if( Menu )
    {
      Count = Menu->Count;
      for( i = 0i64; (unsigned int)i < Count; i = (unsigned int)(i + 1) )
      {
        v5 = &Menu->Entries[i];
        if( v5->StateIndex == Prcb->PowerState.TargetIdleState )
          break;
      }
      if( (_DWORD)i == Count || !v5->DependentState )
        return v9;
      if( !v5->StrictDependency )
        return 0;
    }
    v12 = (unsigned int)KiProcessorIndexToNumberMappingTable[Prcb->Number];
    v13 = v7->Bitmap[v12 >> 6] >> (v12 & 0x3F);
    if( (v13 & 1) != 0 )
      return 0;
    LODWORD(v13) = KeGetPcr()->Prcb.Number;
    IdleStates = Prcb->PowerState.IdleStates;
    v15 = (unsigned int)v13;
    _InterlockedOr64(
      (volatile signed __int64 *)&IdleStates->PrimaryProcessorMask.Bitmap[(unsigned __int64)(unsigned int)KiProcessorIndexToNumberMappingTable[v13] >> 6],
      1i64 << (KiProcessorIndexToNumberMappingTable[v13] & 0x3F));
    v9 = PpmIdleLockProcessor((PPM_IDLE_SYNCHRONIZATION_STATE *)p_Synchronization);
    if( v9 < 0 )
    {
      _InterlockedAnd64(
        (volatile signed __int64 *)&IdleStates->PrimaryProcessorMask.Bitmap[(unsigned __int64)(unsigned int)KiProcessorIndexToNumberMappingTable[v15] >> 6],
        ~(1i64 << (KiProcessorIndexToNumberMappingTable[v15] & 0x3F)));
      return v9;
    }
    KeAddProcessorAffinityEx(&SecondaryProcessorMask->Count, Prcb->Number);
    if( !Menu || v5->StateIndex == Prcb->PowerState.TargetIdleState )
      return 0;
  }
  return v9;
}

Referenced by:

PpmIdleCheckCoordinatedDependencies
PpmIdleCheckCoordinatedDependency
PpmIdleExecuteTransition