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