PpmExitCoordinatedIdle
INT64 __fastcall PpmExitCoordinatedIdle(
_KPRCB *Prcb,
_PPM_COORDINATED_SELECTION *CoordinatedSelection,
INT64 Entered,
INT64 Status,
INT64 Cancelled,
UINT64 ExitTime,
UINT8 DeepSleepEnabled){
__int64 v7;
int v8;
char v9;
unsigned int v12;
INT64 result;
__int64 i;
__int64 v15;
UINT64 v16;
__int64 v17;
__int64 v18;
UINT64 v19;
unsigned int v20;
char v21;
int v22;
unsigned int v23;
unsigned __int64 v24;
__int64 v25;
UINT64 v26;
BOOL v27;
int v28;
UINT64 v29;
INT64 a3;
unsigned int a2;
v7 = 0i64;
LOBYTE(v27) = 0;
v8 = Status;
v9 = Entered;
v12 = -1;
if( PpmPlatformStates )
{
if( !(_BYTE)Entered )
{
for( i = 0i64; (unsigned int)i < CoordinatedSelection->SelectedStates; i = (unsigned int)(i + 1) )
{
v15 = CoordinatedSelection->Selection[i];
v16 = PpmPlatformStates + 384 * v15;
if( (*(_DWORD *)(v16 + 320) & 0x3000000) == 0x1000000 )
*(_DWORD *)(v16 + 320) = *(_DWORD *)(v16 + 320) & 0xFE000FFF | ((*(_DWORD *)(v16 + 320) & 0xFFF | 0x2000) << 12);
if( (_BYTE)Cancelled )
++*(_DWORD *)(1008 * v15 + *(_QWORD *)(PpmPlatformStates + 48) + 24);
}
}
LODWORD(v17) = *(_DWORD *)PpmPlatformStates;
if( *(_DWORD *)PpmPlatformStates )
{
do
{
v18 = *((unsigned int *)Prcb + 9);
v17 = (unsigned int)(v17 - 1);
LOBYTE(v28) = 0;
v19 = 384 * v17 + PpmPlatformStates + 64;
v20 = KiProcessorIndexToNumberMappingTable[v18];
v29 = v19;
if( ((*(_QWORD *)(v19 + 8 * ((unsigned __int64)v20 >> 6) + 72) >> (v20 & 0x3F)) & 1) != 0
&& PpmExitCoordinatedIdleState((volatile INT32 *)(v19 + 256), &v27) )
{
v21 = Cancelled;
CoordinatedSelection->Selection[v7] = v17;
v7 = (unsigned int)(v7 + 1);
if( (_DWORD)v7 == 1 && *(_BYTE *)(v19 + 57) )
{
v12 = v17;
if( v9 )
{
if( v8 < 0 || (_BYTE)Cancelled )
{
v23 = a2;
LOBYTE(v22) = v28;
}
else
{
LOBYTE(v22) = v28;
v23 = a2;
if( (_DWORD)v17 == PpmDripsStateIndex && *(_BYTE *)(PpmPlatformStates + 56) )
{
v22 = (unsigned __int8)v28;
if( a2 != 7 )
v22 = 1;
v28 = v22;
}
}
if( *(_BYTE *)(v19 + 56) )
{
KdCallPowerHandlers(PowerDeviceD0);
KdPowerTransitionEx(2147483649i64, 1);
LOBYTE(v22) = v28;
v21 = Cancelled;
v23 = a2;
}
if( (*(_WORD *)PopSimulate & 0x100) != 0
&& v8 >= 0
&& v21
&& DeepSleepEnabled
&& (_DWORD)v17 == PpmDripsStateIndex )
{
KeBugCheckEx(0xA0u, 0x257ui64, (unsigned int)v17, 0i64, 0i64);
}
}
else
{
LOBYTE(v22) = v28;
v23 = a2;
}
*(_BYTE *)(PpmPlatformStates + 56) = 0;
}
else
{
v23 = a2;
LOBYTE(v22) = v28;
}
if( !v21 )
{
v24 = *(_QWORD *)(v29 + 264);
v25 = *(_QWORD *)(PpmPlatformStates + 48) + 1008i64 * (unsigned int)v17;
if( ExitTime >= v24 )
{
v26 = ExitTime - v24;
*(_QWORD *)(v25 + 56) += ExitTime - v24;
}
else
{
v26 = 0i64;
}
v29 = v26;
if( (_BYTE)v22 )
{
PopIdleWakeNotifyWakeSource(v12, v23, a3, v24, ExitTime);
v26 = v29;
}
if( v8 < 0 && v27 )
{
++*(_DWORD *)(v25 + 28);
}
else
{
++*(_DWORD *)(v25 + 32);
PpmUpdatePlatformIdleAccounting(v25 + 24, v26);
}
}
}
}
while( (_DWORD)v17 );
}
if( v9 )
PpmEventCoordinatedIdleTransition(0, (unsigned int)v7, (UINT64 *)CoordinatedSelection->Selection);
}
result = v12;
CoordinatedSelection->SelectedStates = v7;
return result;
}Referenced by:
PpmIdleExecuteTransition