PoIdle

void __fastcall PoIdle(ULONG_PTR BugCheckParameter4){
  unsigned __int16 v1; 
  __int64 v3; 
  unsigned int *v4; 
  UINT64 v5; 
  __int64 v6; 
  unsigned __int64 v7; 
  __int64 v8; 
  __int64 v9; 
  __int64 *v10; 
  unsigned int v11; 
  __int64 v12; 
  unsigned int v13; 
  unsigned int v14; 
  unsigned int v15; 
  UINT64 v16; 
  __int64 v18; 
  unsigned __int16 v19; 
  char v20; 
  unsigned __int16 v21; 
  struct _KPRCB *CurrentPrcb; 
  __int64 v23; 
  unsigned int v24; 
  unsigned int NextNode; 
  __int64 v26; 
  bool v27; 
  char v28[3]; 
  unsigned int v29; 
  unsigned int v30; 
  __int64 v31; 
  UINT64 LookupIndex; 
  __int64 v33; 
  UINT64 DurationHINT64; 
  __int64 v35; 
  int v36; 
  INT64 result; 
  _QWORD result_4[21]; 
  v1 = 0;
  v28[0] = 0;
  v31 = 0i64;
  v33 = 0i64;
  v35 = 0i64;
  v27 = 0;
  v30 = 0;
  v29 = 0;
  memset((INT64)result_4, 0i64);
  if( *((_BYTE *)PpmCurrentProfile + 2736 * dword_140C23D0C + 189) )
    return;
  v3 = *(_QWORD *)(BugCheckParameter4 + 0x8000);
  v4 = *(unsigned int **)(BugCheckParameter4 + 32776);
  v5 = 0i64;
  DurationHINT64 = 0i64;
  if( !v3 )
    goto LABEL_56;
  *(_DWORD *)(v3 + 796) = 0;
  v6 = *(_QWORD *)(BugCheckParameter4 + 0x8000);
  if( *(_BYTE *)(v6 + 5) )
  {
    v7 = *(_QWORD *)(BugCheckParameter4 + 32784);
    *(_QWORD *)(BugCheckParameter4 + 32784) = 0i64;
    v8 = *(unsigned int *)(v6 + 20);
    *(_QWORD *)(BugCheckParameter4 + 32792) += v7;
    v9 = *(_QWORD *)(BugCheckParameter4 + 32776) + 1000 * v8;
    *(_QWORD *)(v9 + 40) += v7;
    if( *(_DWORD *)(v6 + 68) == 3 )
    {
      if( *(int *)(v6 + 64) < 0 )
      {
        ++*(_DWORD *)(v9 + 52);
      }
      else
      {
        ++*(_DWORD *)(v9 + 56);
        v10 = &PpmIdleIntervalLimits;
        v11 = 0;
        while( v7 >= *v10 )
        {
          if( v7 < v10[3] )
          {
            ++v11;
            break;
          }
          v10 += 6;
          v11 += 2;
          if( v11 >= 0x1A )
            goto LABEL_58;
        }
        if( v11 >= 0x1A )
        {
LABEL_58:
          ++*(_DWORD *)(v9 + 60);
          goto LABEL_17;
        }
        v12 = 32i64 * v11;
        *(_QWORD *)(v12 + v9 + 208) += v7;
        ++*(_DWORD *)(v12 + v9 + 232);
        if( v7 < *(_QWORD *)(v12 + v9 + 216) )
          *(_QWORD *)(v12 + v9 + 216) = v7;
        if( v7 > *(_QWORD *)(v12 + v9 + 224) )
          *(_QWORD *)(v12 + v9 + 224) = v7;
LABEL_17:
        if( v7 < *(_QWORD *)(v9 + 64) )
          *(_QWORD *)(v9 + 64) = v7;
        if( v7 > *(_QWORD *)(v9 + 72) )
          *(_QWORD *)(v9 + 72) = v7;
      }
    }
    else
    {
      ++*(_DWORD *)(v9 + 48);
    }
  }
  *(_DWORD *)(v6 + 64) = 0;
  *(_DWORD *)(v6 + 68) = 3;
  *(_BYTE *)(v6 + 5) = 0;
  *(_BYTE *)(v3 + 5) = 1;
  v36 = 1310721;
  memset((INT64)&result, 0i64);
  *(_WORD *)(v3 + 48) = 0;
  if( !*(_BYTE *)v3 )
  {
    v13 = PpmIdlePrepare(
            BugCheckParameter4,
            v28,
            (LARGE_INTEGER *)&v31,
            (unsigned __int64 *)&v33,
            &DurationHINT64,
            &v36);
    v14 = v13;
    v29 = v13;
    if( v13 != -2 )
    {
      if( v13 == -1 )
      {
        ++v4[3];
        return;
      }
      v15 = *(_DWORD *)(v3 + 560);
      v30 = v15;
      if( v15 != -1 )
      {
        **(_DWORD **)(v3 + 808) = v15;
        *(_DWORD *)(v3 + 796) = 1;
      }
      v5 = DurationHINT64;
      v27 = *(_BYTE *)(248i64 * v13 + v3 + 1058) == 0;
      goto LABEL_27;
    }
LABEL_56:
    HalProcessorIdle();
    return;
  }
  if( PpmIdleVetoBias && *(_BYTE *)(v3 + 8) )
    goto LABEL_56;
  PpmIdleSelectStates(
    BugCheckParameter4,
    (unsigned __int64)&v31,
    (unsigned __int64 *)&v33,
    v28,
    &v29,
    (int *)&v30,
    &v35,
    &v27);
  v14 = v29;
LABEL_27:
  v16 = *(unsigned int *)(v3 + 16);
  if( v14 != (_DWORD)v16 )
  {
    *(_DWORD *)(v3 + 24) = v16;
    *(_DWORD *)(v3 + 16) = v14;
    PpmEventIdleStateChange(v14, v16);
  }
  if( v4[1]++ == -1 )
    PpmResetProcessorIdleAccounting(v4, v31);
  v18 = *(_QWORD *)(BugCheckParameter4 + 0x8000);
  v19 = 0;
  v20 = *(_BYTE *)(248i64 * v14 + v3 + 1057);
  v21 = v36;
  if( (_WORD)v36 )
  {
    while( !result_4[v19] )
    {
      if( ++v19 >= (unsigned __int16)v36 )
        goto LABEL_34;
    }
    *(_WORD *)(v18 + 48) |= 0x400u;
    if( KiSerializeTimerExpiration && v5 )
      PpmSetPlatformIdleDurationHint(v5);
    v21 = v36;
  }
LABEL_34:
  if( !(_BYTE)KiDynamicTickDisableReason
    && !PpmIpiLastClockOwnerDisable
    && !*(_BYTE *)(BugCheckParameter4 + 33)
    && *((_BYTE *)*(&KiProcessorBlock + (unsigned int)KiClockTimerOwner) + 33)
    && !v20 )
  {
    CurrentPrcb = KeGetCurrentPrcb();
    LODWORD(LookupIndex) = 0;
    v23 = *((_QWORD *)CurrentPrcb + 24);
    v24 = *(unsigned __int16 *)(v23 + 146);
    if( (*(_QWORD *)(v23 + 64) & ~(1i64 << *((_BYTE *)CurrentPrcb + 209))) == (*(_QWORD *)(v23 + 136) & ~(1i64 << (KiProcessorIndexToNumberMappingTable[*((unsigned int *)CurrentPrcb + 9)] & 0x3F))) )
    {
      while( 1 )
      {
        NextNode = MmGetNextNode(v24, &LookupIndex);
        if( NextNode == -1 )
          break;
        if( *(_QWORD *)(*((_QWORD *)&KeNodeBlock + NextNode) + 64i64) != *(_QWORD *)(*((_QWORD *)&KeNodeBlock + NextNode)
                                                                                    + 136i64) )
          goto LABEL_40;
      }
      if( ((result_4[(unsigned __int64)(unsigned int)KiProcessorIndexToNumberMappingTable[v26] >> 6] >> (KiProcessorIndexToNumberMappingTable[v26] & 0x3F)) & 1) == 0 )
      {
        KeAddProcessorAffinityEx(&v36, v26);
        *(_WORD *)(v18 + 48) |= 0x800u;
      }
    }
LABEL_40:
    v14 = v29;
    v21 = v36;
  }
  if( v21 )
  {
    while( !result_4[v1] )
    {
      if( ++v1 >= v21 )
        goto LABEL_44;
    }
    HalRequestIpi(0, &v36);
  }
LABEL_44:
  PpmIdleExecuteTransition(BugCheckParameter4, v14, v30, v35, v28[0], v31, v33, v27);
}

Referenced by:

KiIdleLoop