PpmExitCoordinatedIdle
NTSTATUS __stdcall PpmExitCoordinatedIdle(
_KPRCB *Prcb,
PPM_COORDINATED_SELECTION *CoordinatedSelection,
INT64 Entered,
INT64 Status,
INT64 Cancelled,
UINT64 ExitTime,
UINT8 DeepSleepEnabled,
INT64 a9){
__int64 v8;
int v9;
char v10;
int v13;
NTSTATUS result;
__int64 i;
__int64 v16;
__int64 v17;
__int64 v18;
__int64 Number;
__int64 v20;
unsigned int v21;
char v22;
int v23;
int v24;
unsigned __int64 v25;
__int64 v26;
UINT64 v27;
char Initiator[4];
int v29;
UINT64 v30;
int v31;
v8 = 0i64;
Initiator[0] = 0;
v9 = Status;
v10 = Entered;
v13 = -1;
if( PpmPlatformStates )
{
if( !(_BYTE)Entered )
{
for( i = 0i64; (unsigned int)i < CoordinatedSelection->SelectedStates; i = (unsigned int)(i + 1) )
{
v16 = CoordinatedSelection->Selection[i];
v17 = PpmPlatformStates + 384 * v16;
if( (*(_DWORD *)(v17 + 320) & 0x3000000) == 0x1000000 )
*(_DWORD *)(v17 + 320) = *(_DWORD *)(v17 + 320) & 0xFE000FFF | ((*(_DWORD *)(v17 + 320) & 0xFFF | 0x2000) << 12);
if( (_BYTE)Cancelled )
++*(_DWORD *)(1008 * v16 + *(_QWORD *)(PpmPlatformStates + 48) + 24);
}
}
LODWORD(v18) = *(_DWORD *)PpmPlatformStates;
if( *(_DWORD *)PpmPlatformStates )
{
do
{
Number = Prcb->Number;
v18 = (unsigned int)(v18 - 1);
LOBYTE(v29) = 0;
v20 = 384 * v18 + PpmPlatformStates + 64;
v21 = KiProcessorIndexToNumberMappingTable[Number];
v30 = v20;
if( ((*(_QWORD *)(v20 + 8 * ((unsigned __int64)v21 >> 6) + 72) >> (v21 & 0x3F)) & 1) != 0
&& PpmExitCoordinatedIdleState((_PPM_COORDINATED_SYNCHRONIZATION *)(v20 + 256), (UINT8 *)Initiator) )
{
v22 = Cancelled;
CoordinatedSelection->Selection[v8] = v18;
v8 = (unsigned int)(v8 + 1);
if( (_DWORD)v8 == 1 && *(_BYTE *)(v20 + 57) )
{
v13 = v18;
if( v10 )
{
if( v9 < 0 || (_BYTE)Cancelled )
{
v24 = v31;
LOBYTE(v23) = v29;
}
else
{
LOBYTE(v23) = v29;
v24 = v31;
if( (_DWORD)v18 == PpmDripsStateIndex && *(_BYTE *)(PpmPlatformStates + 56) )
{
v23 = (unsigned __int8)v29;
if( v31 != 7 )
v23 = 1;
v29 = v23;
}
}
if( *(_BYTE *)(v20 + 56) )
{
KdCallPowerHandlers(PowerDeviceD0);
KdPowerTransitionEx(2147483649i64, 1);
LOBYTE(v23) = v29;
v22 = Cancelled;
v24 = v31;
}
if( (*(&stru_140C23628 + 1164) & 0x100) != 0
&& v9 >= 0
&& v22
&& DeepSleepEnabled
&& (_DWORD)v18 == PpmDripsStateIndex )
{
KeBugCheckEx(0xA0u, (PVOID)0x257, (PVOID)(unsigned int)v18, 0i64, 0i64);
}
}
else
{
LOBYTE(v23) = v29;
v24 = v31;
}
*(_BYTE *)(PpmPlatformStates + 56) = 0;
}
else
{
v24 = v31;
LOBYTE(v23) = v29;
}
if( !v22 )
{
v25 = *(_QWORD *)(v30 + 264);
v26 = *(_QWORD *)(PpmPlatformStates + 48) + 1008i64 * (unsigned int)v18;
if( ExitTime >= v25 )
{
v27 = ExitTime - v25;
*(_QWORD *)(v26 + 56) += ExitTime - v25;
}
else
{
v27 = 0i64;
}
v30 = v27;
if( (_BYTE)v23 )
{
PopIdleWakeNotifyWakeSource(v13, v24, a9, v25, ExitTime);
v27 = v30;
}
if( v9 < 0 && Initiator[0] )
{
++*(_DWORD *)(v26 + 28);
}
else
{
++*(_DWORD *)(v26 + 32);
PpmUpdatePlatformIdleAccounting((_PLATFORM_IDLE_STATE_ACCOUNTING *)(v26 + 24), v27);
}
}
}
}
while( (_DWORD)v18 );
}
if( v10 )
PpmEventCoordinatedIdleTransition(0, (unsigned int)v8, (UINT64 *)CoordinatedSelection->Selection);
}
result = v13;
CoordinatedSelection->SelectedStates = v8;
return result;
}Referenced by:
PpmIdleExecuteTransition