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