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