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