PpmExitCoordinatedIdleState
UINT8 __stdcall PpmExitCoordinatedIdleState(_PPM_COORDINATED_SYNCHRONIZATION *Synchronization, UINT8 *Initiator){
unsigned int AsLong;
UINT8 v3;
signed __int32 v6;
_QWORD v8[2];
__int128 v9;
AsLong = Synchronization->AsLong;
v9 = 0i64;
v3 = 0;
BYTE12(v9) = 1;
*(_QWORD *)&v9 = 0i64;
v8[0] = 0i64;
v8[1] = PopCoordinatedIdleExitTimeout;
*Initiator = 0;
while( AsLong )
{
if( (AsLong & 0x4000000) != 0 )
{
v6 = _InterlockedCompareExchange(
&Synchronization->AsLong,
AsLong & 0xFA000FFF | ((KeGetPcr()->Prcb.Number & 0xFFF | 0x2000) << 12),
AsLong);
if( AsLong == v6 )
{
v3 = 1;
*Initiator = (AsLong & 0xFFF) == KeGetPcr()->Prcb.Number;
return v3;
}
AsLong = v6;
}
else
{
if( (AsLong & 0x3000000) == 0x2000000 && ((AsLong >> 12) & 0xFFF) == KeGetPcr()->Prcb.Number )
{
v3 = 1;
*Initiator = 1;
return v3;
}
PpmIdleTransitionStall((__int64)v8);
AsLong = Synchronization->AsLong;
}
}
return v3;
}Referenced by:
PpmExitCoordinatedIdle