PpmUnlockProcessors

VOID __stdcall PpmUnlockProcessors(_KAFFINITY_EX *SecondaryMask, _KAFFINITY_EX *UnlockMask){
  __int64 v2; 
  int v5; 
  _KPRCB *Prcb; 
  _PPM_IDLE_STATES *IdleStates; 
  unsigned __int32 AsLong; 
  unsigned __int32 v9; 
  int v10; 
  UINT64 ProcIndex; 
  _KAFFINITY_ENUMERATION_CONTEXT Context; 
  _KAFFINITY_EX Affinity; 

  *(_DWORD *)(&Context.CurrentIndex + 1) = 0;
  *(&Context.CurrentIndex + 3) = 0;
  LODWORD(ProcIndex) = 0;
  *(_DWORD *)&Affinity.Count = 1310721;
  memset(&Affinity.Reserved, 0i64, 0xA4u);
  LODWORD(v2) = KeGetPcr()->Prcb.Number;
  Context.CurrentMask = UnlockMask->Bitmap[0];
  Context.CurrentIndex = 0;
  Context.Affinity = UnlockMask;
  while( 1 )
  {
    KeEnumerateNextProcessor(&ProcIndex, &Context);
    if( v5 )
      break;
    Prcb = KeGetPrcb((unsigned int)ProcIndex);
    IdleStates = Prcb->PowerState.IdleStates;
    _m_prefetchw((const void *)&Prcb->PowerState.Synchronization);
    AsLong = Prcb->PowerState.Synchronization.AsLong;
    do
    {
      v9 = AsLong;
      v10 = AsLong ^ (AsLong ^ (AsLong - 1)) & 0xFFFFFF;
      if( (v10 & 0xFFFFFF) == 0 )
      {
        if( HIBYTE(AsLong) == 5 )
        {
          v10 = v10 & 0xFFFFFF | 0x4000000;
        }
        else if( HIBYTE(AsLong) == 7 )
        {
          v10 = v10 & 0xFFFFFF | 0x6000000;
        }
      }
      AsLong = _InterlockedCompareExchange(&Prcb->PowerState.Synchronization.AsLong, v10, AsLong);
    }
    while( AsLong != v9 );
    if( HIBYTE(v10) == 6 )
      KeAddProcessorAffinityEx(&Affinity.Count, (unsigned int)ProcIndex);
    _InterlockedAnd64(
      (volatile signed __int64 *)&IdleStates->PrimaryProcessorMask.Bitmap[(unsigned __int64)(unsigned int)KiProcessorIndexToNumberMappingTable[v2] >> 6],
      ~(1i64 << (KiProcessorIndexToNumberMappingTable[v2] & 0x3F)));
    KeRemoveProcessorAffinityEx(&SecondaryMask->Count, (unsigned int)ProcIndex);
  }
  if( !KeIsEmptyAffinityEx(&Affinity.Count) )
    HalRequestIpi(IpiAffinity, &Affinity);
}

Referenced by:

PpmIdleSelectStates