PpmIdleSelectStates

__int64 __fastcall PpmIdleSelectStates(
        __int64 a1,
        unsigned __int64 a2,
        unsigned __int64 *a3,
        char *a4,
        unsigned int *a5,
        int *a6,
        _QWORD *a7,
        bool *a8){
  __int64 v9; 
  __int64 v10; 
  __int64 v11; 
  unsigned __int64 TimeUpdateLock; 
  unsigned __int64 BaselineInterruptTimeQpc; 
  __int64 v14; 
  LARGE_INTEGER PerformanceCounter; 
  __int64 v16; 
  LARGE_INTEGER v17; 
  _QWORD *v18; 
  unsigned __int64 v19; 
  INT64 v20; 
  UINT64 *v21; 
  int v22; 
  char v23; 
  UINT64 v24; 
  char v25; 
  __int64 v26; 
  __int64 v27; 
  unsigned __int64 v28; 
  char v29; 
  int v30; 
  UINT64 v31; 
  __int16 v32; 
  bool v33; 
  unsigned __int64 v34; 
  __int64 v35; 
  unsigned int v36; 
  unsigned int v37; 
  unsigned int i; 
  ULONG v39; 
  char v40; 
  unsigned int v41; 
  __int64(__fastcall *v42)(_QWORD, __int64); 
  UINT64 v43; 
  unsigned int v44; 
  char v45; 
  char v46; 
  __int64 v47; 
  __int64 v48; 
  unsigned int v49; 
  __int64 v50; 
  __int64 v51; 
  unsigned __int64 v52; 
  UINT64 v53; 
  CHAR v54; 
  UINT64 v55; 
  char v56; 
  int v57; 
  int v58; 
  UINT64 v59; 
  UINT64 v60; 
  unsigned int v61; 
  unsigned int v62; 
  unsigned int j; 
  ULONG v64; 
  __int64 v65; 
  __int64 v66; 
  __int64 v67; 
  __int64 v68; 
  unsigned int v69; 
  __int64 v70; 
  bool v71; 
  int v72; 
  _QWORD *v73; 
  __int64 v74; 
  int v75; 
  unsigned int(__fastcall *v76)(_QWORD, _QWORD); 
  unsigned int(__fastcall *v77)(_QWORD, _QWORD, __int64); 
  struct _KPRCB *CurrentPrcb; 
  __int64 v79; 
  unsigned int v80; 
  unsigned int NextNode; 
  __int64 v82; 
  char v83; 
  UINT8 *v84; 
  __int64 v85; 
  __int64 v86; 
  __int64 v87; 
  __int64 v88; 
  unsigned __int64 v89; 
  __int64 v90; 
  __int64 v91; 
  unsigned __int64 v92; 
  char v93; 
  UINT8 *v94; 
  __int64 v95; 
  __int64 v96; 
  __int64 v97; 
  __int64 v98; 
  UINT64 v99; 
  __int64 v100; 
  __int64 v101; 
  UINT64 v102; 
  unsigned __int64 v103; 
  signed __int64 v104; 
  INT64 v105; 
  __int64 v106; 
  unsigned int v107; 
  __int64 v108; 
  __int64 v109; 
  __int64 v110; 
  _KPRCB *v111; 
  char v112; 
  int v113; 
  UINT64 v114; 
  UINT64 v115; 
  INT64 v116; 
  UINT64 v117; 
  unsigned int(__fastcall *v118)(_QWORD, _QWORD, _QWORD); 
  UINT64 v119; 
  int v120; 
  _DWORD *v121; 
  _DWORD *v122; 
  __int64 *v123; 
  __int64 v124; 
  __int64 v125; 
  UINT64 StateIndex; 
  UINT64 EntryPriority; 
  char v128; 
  CHAR v129; 
  char v130; 
  UINT ProcessorState; 
  int v132; 
  INT64 v133; 
  INT64 v134; 
  unsigned __int64 v135; 
  INT64 v136; 
  unsigned int v137; 
  int v138; 
  int v139; 
  int v140; 
  INT64 v141; 
  unsigned int *v142; 
  UINT64 RemainingLatency; 
  unsigned __int64 v144; 
  UINT64 v145; 
  _DWORD *v146; 
  UINT64 ExpectedIdle; 
  UINT64 v148; 
  UINT64 v149; 
  unsigned __int64 *v150; 
  __int64 v151; 
  bool *v152; 
  UINT64 v153; 
  __int64 v154; 
  UINT64 LookupIndex; 
  __int64 v156; 
  __int64 v157; 
  unsigned int *v158; 
  int *v159; 
  char *v160; 
  _QWORD *v161; 
  UINT16 *v162[2]; 
  __int64 v163; 
  UINT16 *v164[2]; 
  __int64 v165; 
  int v166; 
  INT64 v167; 
  __int64 v168[21]; 
  int v169; 
  INT64 v170; 
  __int64 v171[21]; 
  _KAFFINITY_EX result; 
  v158 = a5;
  v159 = a6;
  v161 = a7;
  v150 = a3;
  v135 = a2;
  v134 = a1;
  v152 = a8;
  v160 = a4;
  memset((INT64)&result, 0i64);
  v9 = *(_QWORD *)(a1 + 0x8000);
  v10 = 0i64;
  v157 = *(_QWORD *)(a1 + 32776);
  v145 = PpmPlatformStates;
  v11 = *(_QWORD *)(a1 + 0x8000);
  v151 = v9;
  LODWORD(RemainingLatency) = *(_DWORD *)PopFxSystemLatencyHint;
  v128 = 0;
  LOBYTE(v132) = 1;
  LOBYTE(v138) = 0;
  v130 = 0;
  v154 = 0i64;
  ProcessorState = 0;
  v146 = 0i64;
  v137 = 0;
  v142 = 0i64;
  v133 = 0i64;
  ExpectedIdle = 0i64;
  v153 = 0i64;
  LODWORD(v141) = 0;
  while( 1 )
  {
    TimeUpdateLock = KUSER_SHARED_DATA.TimeUpdateLock;
    if( (KUSER_SHARED_DATA.TimeUpdateLock & 1) == 0 )
    {
      BaselineInterruptTimeQpc = KUSER_SHARED_DATA.BaselineInterruptTimeQpc;
      v14 = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart;
      PerformanceCounter = KeQueryPerformanceCounter(0i64);
      if( KUSER_SHARED_DATA.TimeUpdateLock == TimeUpdateLock )
        break;
    }
    _mm_pause();
  }
  v16 = v151;
  v17 = PerformanceCounter;
  v18 = (_QWORD *)v135;
  if( PerformanceCounter.QuadPart > BaselineInterruptTimeQpc )
  {
    v156 = 0i64;
    v19 = -1i64 - BaselineInterruptTimeQpc + PerformanceCounter.QuadPart;
    if( KUSER_SHARED_DATA.QpcInterruptTimeIncrementShift )
      v19 <<= KUSER_SHARED_DATA.QpcInterruptTimeIncrementShift;
    v10 = (v19 * (unsigned __int128)KUSER_SHARED_DATA.QpcInterruptTimeIncrement) >> 64;
    v156 = v10;
  }
  v20 = v134;
  v21 = v150;
  *v150 = v10 + v14;
  *(LARGE_INTEGER *)(v11 + 496) = v17;
  *(_QWORD *)(v11 + 504) = *(_QWORD *)(v20 + 32792) + *(_QWORD *)(v20 + 32968);
  *(_BYTE *)(v11 + 538) = *(_BYTE *)(v20 + 33212);
  *(_BYTE *)(v11 + 536) = *(_BYTE *)(v20 + 32824);
  *(_BYTE *)(v11 + 537) = *(_BYTE *)(v20 + 32825);
  *(_BYTE *)(v11 + 539) = 1;
  if( *(_BYTE *)(v20 + 33)
    && (CurrentPrcb = KeGetCurrentPrcb(),
        LODWORD(LookupIndex) = 0,
        v79 = *((_QWORD *)CurrentPrcb + 24),
        v80 = *(unsigned __int16 *)(v79 + 146),
        (*(_QWORD *)(v79 + 64) & ~(1i64 << *((_BYTE *)CurrentPrcb + 209))) == (*(_QWORD *)(v79 + 136) & ~(1i64 << (KiProcessorIndexToNumberMappingTable[*((unsigned int *)CurrentPrcb + 9)] & 0x3F)))) )
  {
    while( 1 )
    {
      NextNode = MmGetNextNode(v80, &LookupIndex);
      v22 = -1;
      if( NextNode == -1 )
        break;
      if( *(_QWORD *)(*(_QWORD *)(v82 + 8i64 * NextNode) + 64i64) != *(_QWORD *)(*(_QWORD *)(v82 + 8i64 * NextNode)
                                                                                + 136i64) )
        goto LABEL_9;
    }
    *(_BYTE *)(v11 + 540) = 1;
    *(_WORD *)(v11 + 48) |= 0x80u;
  }
  else
  {
LABEL_9:
    *(_BYTE *)(v11 + 540) = 0;
    v22 = -1;
  }
  if( *(_BYTE *)(v11 + 1) )
  {
    *(_WORD *)(v11 + 48) |= 0x100u;
    v22 = *(_DWORD *)(v11 + 28);
  }
  *(_DWORD *)(v11 + 528) = v22;
  if( PpmIdleRespectIdleStateMax )
  {
    v23 = *((_BYTE *)PpmCurrentProfile + 2736 * dword_140C23D0C + 198);
    *(_BYTE *)(v11 + 542) = v23;
    if( v23 )
      *(_WORD *)(v11 + 48) |= 0x4000u;
  }
  else
  {
    *(_BYTE *)(v11 + 542) = 0;
  }
  *v18 = v17.QuadPart;
  *(_QWORD *)(v16 + 240) = 1310721i64;
  memset(v16 + 248, 0i64);
  v24 = *v21;
  v25 = *(_BYTE *)(v20 + 33);
  v26 = *(_QWORD *)(v20 + 0x8000);
  v144 = v24;
  if( !v25 && KiSerializeTimerExpiration )
  {
    v135 = 0i64;
    _m_prefetchw(&PpmPlatformIdleHint);
    v103 = PpmPlatformIdleHint;
    if( (_WORD)PpmPlatformIdleHint )
    {
      while( 1 )
      {
        v104 = _InterlockedCompareExchange64(&PpmPlatformIdleHint, v103 ^ (unsigned __int16)(v103 ^ (v103 - 1)), v103);
        if( v103 == v104 )
          break;
        v103 = v104;
        _mm_pause();
        if( !(_WORD)v104 )
          goto LABEL_172;
      }
      v135 = v103 >> 16;
    }
LABEL_172:
    v27 = *(_QWORD *)(v20 + 0x8000);
    v25 = *(_BYTE *)(v20 + 33);
  }
  else
  {
    v135 = 0i64;
    v27 = v26;
  }
  v163 = 0i64;
  *(_OWORD *)v162 = 0i64;
  memset((INT64)&v166, 0i64);
  v28 = -1i64;
  v29 = *(_BYTE *)(v27 + 540);
  v30 = -(v25 != 0);
  v31 = KiClockTimerNextTickTime;
  v32 = v30 & 8;
  v148 = 0i64;
  v33 = *(_BYTE *)(v134 + 33) == 0;
  LODWORD(v136) = 2;
  if( v33 )
  {
    KiGetNextTimerExpirationDueTime(v134, 0, v24, 0, 0, &v148, &v136);
    if( v31 <= v148 )
      v31 = v148;
  }
  else if( v29 && !(_BYTE)KiDynamicTickDisableReason && !KiClockState )
  {
    KiGetNextTimerExpirationDueTime(v134, 1, v24, 0, 0, &v148, &v136);
    if( v24 + (unsigned int)KiLastRequestedTimeIncrement < v148 )
      v31 = v148;
    else
      LODWORD(v136) = 2;
  }
  if( v31 == -1i64 )
  {
    v34 = -1i64;
  }
  else
  {
    v34 = 0i64;
    if( v31 > v24 )
      v34 = v31 - v24;
  }
  v35 = v134;
  v36 = 0;
  v37 = *(_DWORD *)(v134 + 11684);
  for( i = v37; i; i >>= 4 )
    v36 += KeMaximumIncrement;
  if( v37 )
  {
    v39 = KeMaximumIncrement / (v37 + 1);
    if( !v39 )
      v39 = 1;
    v28 = v39;
  }
  if( v34 <= v28 )
  {
    v28 = v34;
  }
  else
  {
    v32 |= 1u;
    if( v34 >= v36 )
      v34 = v36;
  }
  if( PpmIdleDurationExpirationTimeout )
  {
    if( *(_BYTE *)(v134 + 33) )
    {
      v166 = 1310721;
      v83 = 0;
      memset((INT64)&v167, 0i64);
      if( KeNumberNodes )
      {
        v84 = &KeNodeBlock;
        v85 = (unsigned __int16)KeNumberNodes;
        do
        {
          v86 = *(_QWORD *)v84;
          v87 = *(unsigned __int16 *)(*(_QWORD *)v84 + 144i64);
          v88 = *(_QWORD *)(*(_QWORD *)v84 + 72i64);
          if( (unsigned __int16)v166 <= (unsigned __int16)v87 )
            LOWORD(v166) = v87 + 1;
          v168[v87] |= v88;
          if( *(_QWORD *)(v86 + 72) )
            v83 = 1;
          v84 += 8;
          --v85;
        }
        while( v85 );
        if( v83 )
        {
          v162[1] = (UINT16 *)v168[0];
          v89 = 0i64;
          v162[0] = (UINT16 *)&v166;
          while( 1 )
          {
            v139 = 0;
            if( (int)KiEnumerateNextProcessorNumber((INT64)&v139, v162) < 0 )
              break;
            v90 = (unsigned int)KiProcessorNumberToIndexMappingTable[64 * (unsigned __int16)v139 + BYTE2(v139)];
            if( (unsigned int)v90 >= (unsigned int)KeQueryActiveProcessorCountEx(0xFFFFu) )
            {
              v91 = 0i64;
            }
            else
            {
              _mm_lfence();
              v91 = (__int64)*(&KiProcessorBlock + v90);
            }
            v92 = *(_QWORD *)(v91 + 32808);
            if( v92 > v89 && v92 != -1i64 )
              v89 = v92;
          }
          v16 = v151;
          if( v89 && v34 + v144 > v89 )
          {
            v32 |= 0x2000u;
            v34 = v89 > v144 ? (unsigned int)(v89 - v144) : 1i64;
            if( v34 < v28 )
              v28 = v34;
          }
          v35 = v134;
        }
      }
    }
  }
  if( v28 < v135 )
  {
    v28 = v135;
    v34 = v135;
    v32 |= 0x1000u;
  }
  *(_WORD *)(v26 + 48) |= v32;
  v40 = v136;
  *(_QWORD *)(v26 + 520) = v34;
  v41 = -1;
  *(_BYTE *)(v26 + 541) = v40;
  *(_QWORD *)(v26 + 512) = v28;
  v42 = *(__int64(__fastcall **)(_QWORD, __int64))(v16 + 432);
  LODWORD(v135) = -1;
  if( v42 )
  {
    v41 = v42(*(_QWORD *)(v16 + 488), v16 + 496);
    LODWORD(v135) = v41;
  }
  if( *(_BYTE *)(v35 + 32829) )
  {
    v41 = 0;
    LODWORD(v135) = 0;
  }
  v43 = v145;
  if( v145 )
  {
    PoCopyDeepIdleMask((_DWORD *)(v16 + 576));
    KeAddProcessorAffinityEx((_WORD *)(v16 + 576), *(_DWORD *)(v35 + 36));
    v105 = *(_QWORD *)(v16 + 752);
    v144 = *(_QWORD *)(v43 + 48);
    v146 = (_DWORD *)v105;
    memset(v105, 0i64);
    v44 = ProcessorState;
    v106 = 0i64;
    if( *(_DWORD *)(v16 + 776) )
    {
      v107 = 0;
      while( 1 )
      {
        v108 = *(_QWORD *)(v16 + 784);
        v109 = v107;
        if( PpmIdleVetoBias || !*(_BYTE *)(v108 + 24 * v106 + 1) )
        {
          LODWORD(v117) = -2;
        }
        else
        {
          v110 = *(unsigned int *)(v108 + 24 * v106 + 4);
          v111 = (_KPRCB *)v134;
          if( PpmDripsStateIndex == -1
            || (unsigned int)v110 < PpmDripsStateIndex
            || !PpmCheckPreConditionsForDeepSleep(v134) )
          {
            v113 = (unsigned __int8)v132;
            if( v128 == 1 )
              v113 = 1;
            v112 = 0;
          }
          else
          {
            v112 = 1;
            v113 = (unsigned __int8)v132;
            if( !v128 )
              v113 = 1;
          }
          v128 = v112;
          v132 = v113;
          if( (_BYTE)v113 )
          {
            LOBYTE(v132) = 0;
            PpmEstimateIdleDuration((INT64)v111, v112, v112, *v150, 0i64, &ExpectedIdle, &v153, &v141, &v133);
          }
          v114 = ExpectedIdle;
          v115 = (unsigned int)RemainingLatency;
          ProcessorState = -1;
          LODWORD(EntryPriority) = v110;
          LODWORD(StateIndex) = v110;
          *(_DWORD *)(v16 + 796) = 0;
          v116 = PpmIdleCheckCoordinatedStateEligibility(
                   v111,
                   v41,
                   v115,
                   v114,
                   StateIndex,
                   EntryPriority,
                   &ProcessorState,
                   (_PPM_COORDINATED_SELECTION *)(v16 + 792));
          v44 = ProcessorState;
          v117 = v116;
          if( !*(_BYTE *)(v145 + 12) && !v116 )
          {
            v118 = *(unsigned int(__fastcall **)(_QWORD, _QWORD, _QWORD))(v145 + 16);
            if( v118 )
              v117 = v118(*(_QWORD *)(v16 + 488), ProcessorState, (unsigned int)v110);
          }
          PpmIdleUpdateSelectionStatistics(v117, -16 * v110 + v144 + 72);
          v119 = v145 + 384 * v110;
          if( v117 != 0xFFFFFFFF )
            v154 = *(_QWORD *)(v119 + 64);
          if( !v117 )
          {
            v122 = v146;
            v72 = -1;
            *v152 = 1;
            *v122 = v110;
            if( *(_BYTE *)(v119 + 121) )
              v72 = v110;
            if( (unsigned int)KeSubtractAffinityEx(
                                 (_KAFFINITY_EX *)(v16 + 240),
                                 (_KAFFINITY_EX *)(v119 + 128),
                                 &result) )
              PpmUnlockProcessors((unsigned __int16 *)(v16 + 240), (__int64)&result);
            v35 = v134;
            v45 = v128;
            goto LABEL_92;
          }
          if( v117 == 2147483651 )
          {
            v130 = 1;
          }
          else
          {
            v120 = (unsigned __int8)v138;
            if( v117 == 2147483656 )
              v120 = 1;
            v138 = v120;
          }
          PpmIdleRollbackCoordinatedSelection(v16 + 792, 0i64);
        }
        v121 = v146;
        v107 = v109 + 1;
        v106 = (unsigned int)(v106 + 1);
        v137 = v109 + 1;
        v146[v109 + 2] = v117;
        if( (unsigned int)v106 >= *(_DWORD *)(v16 + 776) )
          break;
        v41 = v135;
      }
      v35 = v134;
      v137 = v107;
    }
    else
    {
      v121 = v146;
    }
    *(_DWORD *)(v16 + 796) = 0;
    *v121 = -1;
    PpmUnlockProcessors((unsigned __int16 *)(v16 + 240), v16 + 240);
  }
  else
  {
    v44 = ProcessorState;
  }
  v45 = 0;
  v142 = *(unsigned int **)(v16 + 744);
  v46 = 1;
  memset((INT64)v142, 0i64);
  v47 = 0i64;
  v154 = *(_QWORD *)(v16 + 40);
  v132 = 0;
  if( !*(_DWORD *)(v16 + 760) )
    goto LABEL_91;
  v48 = 2147483658i64;
  v49 = 0x80000000;
  v50 = 0x100000000i64;
  while( 1 )
  {
    v51 = *(_QWORD *)(v16 + 768);
    v52 = (unsigned int)v47;
    v144 = (unsigned int)v47;
    v44 = *(_DWORD *)(v51 + 24 * v47 + 4);
    ProcessorState = v44;
    if( !v145 && v44 == *(_DWORD *)(v16 + 32) - 1 && *(_BYTE *)(v16 + 540) && PpmCheckPreConditionsForDeepSleep(v35) )
    {
      v129 = 1;
      if( !v45 )
        v46 = 1;
    }
    else
    {
      if( v45 == 1 )
        v46 = 1;
      v129 = 0;
    }
    if( v46 )
    {
      LOBYTE(v134) = 0;
      *(_OWORD *)v164 = 0i64;
      v53 = *v150;
      v165 = 0i64;
      memset((INT64)&v169, 0i64);
      v54 = v129;
      v55 = -1i64;
      v56 = *(_BYTE *)(*(_QWORD *)(v35 + 0x8000) + 540i64);
      v57 = 0;
      if( *(_BYTE *)(v35 + 33) )
        v57 = 8;
      LODWORD(v133) = v57;
      if( v129 )
        LODWORD(v133) = v57 | 4;
      v58 = 2;
      v33 = *(_BYTE *)(v35 + 33) == 0;
      v59 = KiClockTimerNextTickTime;
      HIDWORD(v136) = 2;
      v149 = 0i64;
      if( v33 )
      {
        KiGetNextTimerExpirationDueTime(v35, 0, v53, v129, 0, &v149, (INT64 *)((char *)&v136 + 4));
        v54 = v129;
        if( v59 <= v149 )
          v59 = v149;
      }
      else
      {
        if( !v56 || (_BYTE)KiDynamicTickDisableReason || KiClockState )
          goto LABEL_60;
        KiGetNextTimerExpirationDueTime(v35, 1, v53, v129, 0, &v149, (INT64 *)((char *)&v136 + 4));
        v54 = v129;
        if( v53 + (unsigned int)KiLastRequestedTimeIncrement >= v149 )
        {
          v58 = 2;
          goto LABEL_60;
        }
        v59 = v149;
      }
      v58 = HIDWORD(v136);
LABEL_60:
      if( v59 == -1i64 )
      {
        v60 = -1i64;
      }
      else
      {
        v60 = 0i64;
        if( v59 > v53 )
          v60 = v59 - v53;
      }
      v61 = *(_DWORD *)(v35 + 11684);
      v62 = v61;
      LODWORD(v141) = v58;
      for( j = 0; v62; v62 >>= 4 )
        j += KeMaximumIncrement;
      if( !v54 && v61 )
      {
        v64 = KeMaximumIncrement / (v61 + 1);
        if( !v64 )
          v64 = 1;
        v55 = v64;
      }
      if( v60 <= v55 )
      {
        v55 = v60;
      }
      else
      {
        LODWORD(v133) = v133 | 1;
        if( v60 >= j )
          v60 = j;
      }
      if( PpmIdleDurationExpirationTimeout )
      {
        if( *(_BYTE *)(v35 + 33) )
        {
          v169 = 1310721;
          v93 = 0;
          memset((INT64)&v170, 0i64);
          if( KeNumberNodes )
          {
            v94 = &KeNodeBlock;
            v95 = (unsigned __int16)KeNumberNodes;
            do
            {
              v96 = *(_QWORD *)v94;
              v97 = *(unsigned __int16 *)(*(_QWORD *)v94 + 144i64);
              v98 = *(_QWORD *)(*(_QWORD *)v94 + 72i64);
              if( (unsigned __int16)v169 <= (unsigned __int16)v97 )
                LOWORD(v169) = v97 + 1;
              v171[v97] |= v98;
              if( *(_QWORD *)(v96 + 72) )
                v93 = 1;
              v94 += 8;
              --v95;
            }
            while( v95 );
            if( v93 )
            {
              v164[1] = (UINT16 *)v171[0];
              v99 = 0i64;
              v164[0] = (UINT16 *)&v169;
              while( 1 )
              {
                v140 = 0;
                if( (int)KiEnumerateNextProcessorNumber((INT64)&v140, v164) < 0 )
                  break;
                v100 = (unsigned int)KiProcessorNumberToIndexMappingTable[64 * (unsigned __int16)v140 + BYTE2(v140)];
                if( (unsigned int)v100 >= (unsigned int)KeQueryActiveProcessorCountEx(0xFFFFu) )
                {
                  v101 = 0i64;
                }
                else
                {
                  _mm_lfence();
                  v101 = (__int64)*(&KiProcessorBlock + v100);
                }
                v102 = *(_QWORD *)(v101 + 32808);
                if( v102 > v99 && v102 != -1i64 )
                  v99 = v102;
              }
              v16 = v151;
              if( v99 && v60 + v53 > v99 )
              {
                LODWORD(v133) = v133 | 0x2000;
                v60 = v99 > v53 ? (unsigned int)(v99 - v53) : 1i64;
                if( v60 < v55 )
                  v55 = v60;
              }
              LODWORD(v47) = v132;
            }
          }
        }
      }
      v44 = ProcessorState;
      v49 = 0x80000000;
      v153 = v60;
      v50 = 0x100000000i64;
      v52 = v144;
      v48 = 2147483658i64;
      ExpectedIdle = v55;
      v46 = v134;
    }
    if( !v44 )
    {
      v67 = 0i64;
      goto LABEL_83;
    }
    v65 = *(_QWORD *)(v35 + 0x8000);
    if( *(_DWORD *)(v65 + 36) == 3 && PpmIdleVetoBias )
    {
      v67 = 4294967294i64;
      goto LABEL_83;
    }
    v66 = 248i64 * v44;
    if( *(_BYTE *)(v66 + v65 + 1063) )
    {
      v67 = v48;
      goto LABEL_83;
    }
    if( v44 > (unsigned int)v135 && (_DWORD)v135 != -1 )
    {
      v67 = 2147483656i64;
      goto LABEL_83;
    }
    if( !*(_BYTE *)(v66 + v65 + 1058) && *(_BYTE *)(v65 + 539) )
    {
      v67 = 2147483655i64;
      goto LABEL_83;
    }
    v75 = *(_DWORD *)(v66 + v65 + 1016);
    if( v75 )
    {
      if( v75 >= 0 )
      {
        if( *(_QWORD *)(v66 + v65 + 1048) )
        {
          v123 = (__int64 *)(v66 + v65 + 1024);
          v124 = *v123;
          v33 = *v123 == (_QWORD)v123;
          v75 = v49;
          if( !v33 )
            v75 = *(_DWORD *)(v124 + 16);
        }
        else
        {
          v75 = v49;
        }
      }
      else
      {
        v75 = -2147483635;
      }
    }
    v44 = ProcessorState;
    if( v75 )
    {
      v67 = v50 | (unsigned int)v75;
    }
    else
    {
      if( *(_DWORD *)(v66 + v65 + 1000) > (unsigned int)RemainingLatency )
      {
        v44 = ProcessorState;
        v67 = 2147483650i64;
        goto LABEL_83;
      }
      if( *(unsigned int *)(v66 + v65 + 1004) > ExpectedIdle )
      {
        v44 = ProcessorState;
        v67 = 2147483651i64;
        goto LABEL_83;
      }
      v76 = *(unsigned int(__fastcall **)(_QWORD, _QWORD))(v65 + 448);
      v67 = v76 ? v76(*(_QWORD *)(v65 + 488), ProcessorState) : 0i64;
    }
    if( !v67 )
    {
      v77 = *(unsigned int(__fastcall **)(_QWORD, _QWORD, __int64))(v16 + 440);
      if( v77 )
        v67 = v77(*(_QWORD *)(v16 + 488), v44, 0xFFFFFFFFi64);
    }
LABEL_83:
    v68 = v157 + 1000i64 * v44;
    if( !v67 )
    {
      v69 = 0;
LABEL_85:
      ++*(_QWORD *)(v68 + 8i64 * v69 + 80);
      goto LABEL_86;
    }
    if( (v67 & 0x80000000) == 0 )
    {
      if( (v67 & 0x100000000i64) != 0 )
      {
        v125 = *(_QWORD *)(v68 + 200);
        v69 = 2;
        if( v125 )
          ++*(_QWORD *)(((unsigned __int64)(((unsigned int)v67 & 0x7FFFFFFF) - 1) << 6) + *(_QWORD *)(v125 + 32) + 24);
      }
      else
      {
        v69 = 1;
      }
      goto LABEL_85;
    }
    if( (unsigned int)v67 <= 0x8000000C )
    {
      v69 = v67 - 2147483646;
      goto LABEL_85;
    }
LABEL_86:
    if( !v67 )
      break;
    if( v67 == 2147483651i64 )
    {
      v130 = 1;
    }
    else if( v67 == 2147483656i64 )
    {
      LOBYTE(v138) = 1;
    }
    v47 = (unsigned int)(v47 + 1);
    v45 = v129;
    v49 = 0x80000000;
    v132 = v47;
    v50 = 0x100000000i64;
    v48 = 2147483658i64;
    v142[v52 + 2] = v67;
    if( (unsigned int)v47 >= *(_DWORD *)(v16 + 760) )
      goto LABEL_91;
  }
  v70 = 248i64 * v44;
  *v142 = v44;
  HIDWORD(v133) = v47;
  v71 = !*(_BYTE *)(v70 + v16 + 1058) || v145 && (!*(_BYTE *)(v70 + v16 + 1061) || v44);
  v45 = v129;
  *v152 = v71;
LABEL_91:
  v72 = -1;
LABEL_92:
  if( *v152 )
    PpmIdleSetSynchronizationState((UINT32 *)(v35 + 32832), 1u);
  *(_WORD *)(v16 + 48) |= v133;
  v73 = v161;
  *(_BYTE *)(v16 + 7) = v138;
  *(_BYTE *)(v16 + 6) = v130;
  *(_QWORD *)(v16 + 520) = v153;
  *(_QWORD *)(v16 + 512) = ExpectedIdle;
  *(_BYTE *)(v16 + 541) = v141;
  *v158 = v44;
  *v159 = v72;
  *v160 = v45;
  v74 = v154;
  *v73 = v154;
  return v74;
}

Referenced by:

PoIdle