PpmUnlockProcessors

__int64 __fastcall PpmUnlockProcessors(unsigned __int16 *a1, __int64 a2){
  __int64 v2; 
  __int64 v5; 
  __int64 v6; 
  __int64 v7; 
  unsigned __int32 v8; 
  unsigned __int32 v9; 
  int v10; 
  __int64 IsEmptyAffinity; 
  UINT64 ProcessorNumber; 
  unsigned __int16 *v13[2]; 
  __int16 v14; 
  int v15; 
  __int16 v16; 
  int v17; 
  INT64 result[21]; 
  v15 = 0;
  v16 = 0;
  LODWORD(ProcessorNumber) = 0;
  memset((INT64)result + 4, 0i64);
  v17 = 1310721;
  memset((INT64)result, 0i64);
  LODWORD(v2) = *((_DWORD *)KeGetPcr() + 105);
  v13[1] = *(unsigned __int16 **)(a2 + 8);
  v14 = 0;
  v13[0] = (unsigned __int16 *)a2;
  while( !(unsigned int)KeEnumerateNextProcessor(&ProcessorNumber, v13) )
  {
    KeGetPrcb((unsigned int)ProcessorNumber);
    v6 = v5;
    v7 = *(_QWORD *)(v5 + 0x8000);
    _m_prefetchw((const void *)(v5 + 32832));
    v8 = *(_DWORD *)(v5 + 32832);
    do
    {
      v9 = v8;
      v10 = v8 ^ (v8 ^ (v8 - 1)) & 0xFFFFFF;
      if( (v10 & 0xFFFFFF) == 0 )
      {
        if( HIBYTE(v8) == 5 )
        {
          v10 = v10 & 0xFFFFFF | 0x4000000;
        }
        else if( HIBYTE(v8) == 7 )
        {
          v10 = v10 & 0xFFFFFF | 0x6000000;
        }
      }
      v8 = _InterlockedCompareExchange((volatile signed __int32 *)(v6 + 32832), v10, v8);
    }
    while( v8 != v9 );
    if( HIBYTE(v10) == 6 )
      KeAddProcessorAffinityEx(&v17, ProcessorNumber);
    _InterlockedAnd64(
      (volatile signed __int64 *)(v7
                                + 8 * ((unsigned __int64)(unsigned int)KiProcessorIndexToNumberMappingTable[v2] >> 6)
                                + 80),
      ~(1i64 << (KiProcessorIndexToNumberMappingTable[v2] & 0x3F)));
    KeRemoveProcessorAffinityEx(a1, ProcessorNumber);
  }
  IsEmptyAffinity = KeIsEmptyAffinityEx(&v17);
  if( !(_DWORD)IsEmptyAffinity )
    return HalRequestIpi(0, &v17);
  return IsEmptyAffinity;
}

Referenced by:

PpmIdleSelectStates