PpmIdleExecuteTransition

__int64 __fastcall PpmIdleExecuteTransition(
        ULONG_PTR BugCheckParameter4,
        unsigned int a2,
        unsigned int a3,
        __int64 a4,
        char a5,
        __int64 a6,
        __int64 a7,
        char a8){
  __int64 v8; 
  unsigned __int16 v9; 
  UINT64 v11; 
  int v12; 
  unsigned __int16 *v13; 
  unsigned int v14; 
  __int64 v15; 
  unsigned int v16; 
  _BYTE *v17; 
  UINT64 v18; 
  INT64 v19; 
  KSPIN_LOCK *v20; 
  unsigned __int64 v21; 
  unsigned int v22; 
  unsigned __int64 v23; 
  unsigned __int64 v24; 
  unsigned __int64 v25; 
  __int64 v26; 
  unsigned __int8(__fastcall *v27)(__int64); 
  __int64 v28; 
  _RTL_PROCESS_MODULES *v29; 
  UINT64 v30; 
  UINT64 *v31; 
  unsigned __int8 v32; 
  unsigned int v33; 
  unsigned __int16 v34; 
  char v35; 
  char v36; 
  bool v37; 
  __int64 v38; 
  unsigned __int64 v39; 
  unsigned __int64 v40; 
  int v41; 
  unsigned int v42; 
  int v43; 
  char v44; 
  int v45; 
  __int64 v46; 
  __int64 v47; 
  unsigned __int64 v48; 
  unsigned __int64 v49; 
  int v50; 
  unsigned __int64 v51; 
  __int64 v52; 
  signed __int64 v53; 
  __int64 v54; 
  char v55; 
  unsigned int v56; 
  __int64 v57; 
  int v58; 
  unsigned __int64 *v59; 
  __int64 v60; 
  unsigned __int64 v61; 
  int v62; 
  int v63; 
  int ExitSamplingCountdown; 
  char v65; 
  int v66; 
  int v67; 
  __int64 v68; 
  __int64 v69; 
  UINT64 v70; 
  unsigned int v71; 
  __int64 v72; 
  __int64 v73; 
  char v74; 
  struct _KPRCB *CurrentPrcb; 
  int v76; 
  int v77; 
  int v78; 
  KSPIN_LOCK *v79; 
  KSPIN_LOCK *v80; 
  unsigned __int64 v81; 
  unsigned __int64 v82; 
  unsigned __int64 v83; 
  unsigned __int64 v84; 
  unsigned __int128 v85; 
  unsigned __int64 v86; 
  void *v87; 
  __int64 v88; 
  __int64(__fastcall *v89)(__int64, _QWORD, _QWORD, _QWORD, _QWORD); 
  unsigned int v90; 
  __int64 v91; 
  __int64 v92; 
  UINT64 v93; 
  UINT64 v94; 
  int v95; 
  char v96; 
  __int64 v97; 
  __int32 v98; 
  __int32 v99; 
  __int64 v100; 
  struct _KPRCB *v101; 
  __int64 v102; 
  unsigned __int64 v103; 
  unsigned __int64 v104; 
  unsigned __int64 v105; 
  unsigned __int8 v106; 
  unsigned __int8 v107; 
  __int16 v108; 
  unsigned __int8 v109; 
  __int64 v110; 
  signed __int16 v111; 
  __int64 v112; 
  signed __int16 v113; 
  char v114; 
  char v115; 
  __int64 v116; 
  unsigned __int64 v117; 
  unsigned __int64 v118; 
  ULONG_PTR v119; 
  __int64 v120; 
  __int64 v121; 
  __int64 v122; 
  int v123; 
  unsigned __int64 v124; 
  __int64 v125; 
  __int64 v126; 
  unsigned __int64 v127; 
  __int64 v128; 
  __int64 v129; 
  __int64 v130; 
  __int64 v131; 
  volatile unsigned __int64 QpcBias; 
  bool v133; 
  __int64 v134; 
  __int64 v135; 
  int v136; 
  unsigned __int64 v137; 
  __int64 v138; 
  __int64 v139; 
  unsigned __int64 v140; 
  __int64 v141; 
  UINT64 v142; 
  bool v143; 
  __int64 v144; 
  INT64 *v145; 
  INT64 v146; 
  unsigned __int64 v147; 
  unsigned __int64 v148; 
  unsigned __int8 v149; 
  int v150; 
  int v151; 
  UINT64 *v152; 
  INT64 v153; 
  _PPM_COORDINATED_SELECTION *v154; 
  unsigned int *Selection; 
  unsigned __int64 v156; 
  unsigned __int16 v157; 
  unsigned int v158; 
  unsigned __int64 v159; 
  unsigned int v160; 
  __int64 v161; 
  __int64 v162; 
  __int64 v163; 
  unsigned __int32 v164; 
  unsigned __int32 v165; 
  int v166; 
  int v167; 
  __int64 v168; 
  __int64 v169; 
  int v170; 
  __int64 v171; 
  signed __int32 v172[8]; 
  ULONG_PTR BugCheckParameter4a; 
  UINT64 ExitTime; 
  UINT8 DeepSleepEnabled[8]; 
  BYTE *v176; 
  int v177; 
  char v178; 
  char v179; 
  char v180; 
  unsigned __int8 v181; 
  UINT8 v182; 
  char v183; 
  char v184; 
  ULONG_PTR BugCheckParameter2; 
  __int64 v186; 
  __int64 v187; 
  unsigned int StateIndex; 
  int StateIndex_4; 
  INT64 v190; 
  unsigned int v191; 
  __int64 v192; 
  int v193; 
  PKSPIN_LOCK SpinLock; 
  unsigned __int16 *v195; 
  int v196; 
  __int64 v197; 
  unsigned __int16 *v198; 
  unsigned __int64 v199; 
  unsigned __int16 v200; 
  int v201; 
  __int16 v202; 
  int v203; 
  int v204; 
  __int64 v205; 
  __int64 v206; 
  UINT64 FromFrequency; 
  __int64 v208; 
  __int64 v209; 
  _PPM_COORDINATED_SELECTION *CoordinatedSelection; 
  ULONG_PTR v211; 
  INT64 v212[2]; 
  __int128 v213; 
  __int64 v214; 
  _LIST_ENTRY LoadOrderListHead; 
  __int128 v216; 
  __int128 v217; 
  __int128 v218; 
  BYTE v219[16]; 
  __int128 v220; 
  __int128 v221; 
  __int128 v222; 
  __int128 v223; 
  __int128 v224; 
  __int128 v225; 
  __int128 v226; 
  __int64 v227; 
  _KAFFINITY_EX result; 
  int v229; 
  INT64 v230; 
  _QWORD v231[21]; 
  int v232; 
  v8 = *(_QWORD *)(BugCheckParameter4 + 0x8000);
  v9 = 0;
  v227 = 0i64;
  v178 = 0;
  v180 = 0;
  LOBYTE(v193) = 0;
  v11 = 0i64;
  LOBYTE(StateIndex_4) = 0;
  v12 = 0;
  v183 = 0;
  v181 = 0;
  v197 = *(_QWORD *)(v8 + 488);
  v211 = BugCheckParameter4;
  *(_OWORD *)v219 = 0i64;
  v220 = 0i64;
  CoordinatedSelection = (_PPM_COORDINATED_SELECTION *)(v8 + 792);
  v209 = a4;
  StateIndex = a3;
  LODWORD(BugCheckParameter2) = a2;
  LODWORD(SpinLock) = 0;
  v192 = 0i64;
  v190 = 7i64;
  v196 = -1;
  v186 = v8;
  v205 = v8 + 248i64 * a2;
  v184 = 0;
  LODWORD(v187) = 0;
  v221 = 0i64;
  v222 = 0i64;
  v223 = 0i64;
  v224 = 0i64;
  v225 = 0i64;
  v226 = 0i64;
  if( !a8 || *(_BYTE *)(v8 + 539) || *(_BYTE *)(v8 + 248i64 * a2 + 1061) )
  {
    v179 = 0;
    v182 = 3;
  }
  else
  {
    v179 = 1;
    v182 = 4;
  }
  v191 = 3;
  if( !*(_BYTE *)v8 )
  {
    if( a8 )
      PpmIdleSetSynchronizationState((UINT32 *)(BugCheckParameter4 + 32832), 1u);
    v13 = (unsigned __int16 *)(v8 + 240);
    v195 = (unsigned __int16 *)(v8 + 240);
    *(_QWORD *)(v8 + 240) = 1310721i64;
    memset(v8 + 248, 0i64);
    v14 = *(_DWORD *)(v8 + 548);
    v15 = *(_QWORD *)(v8 + 552);
    v214 = 0i64;
    v212[1] = (INT64)&v213;
    v16 = 0;
    v212[0] = 1i64;
    v213 = 0i64;
    LOBYTE(v213) = 1;
    BYTE2(v213) = 1;
    if( v14 )
    {
      v17 = (_BYTE *)(v15 + 4);
      while( 1 )
      {
        if( *v17 != 0xFF )
        {
          v18 = *((unsigned int *)v17 - 1);
          DWORD1(v213) = (unsigned __int8)*v17;
          KeGetPrcb(v18);
          LODWORD(v187) = PpmTestAndLockProcessor(v19, v13, (INT64)v212);
          v12 = v187;
          if( (int)v187 < 0 )
            break;
        }
        ++v16;
        v17 += 8;
        if( v16 >= v14 )
          goto LABEL_14;
      }
    }
    else
    {
LABEL_14:
      v21 = *((_QWORD *)v13 + 1);
      v199 = v21;
      LoadOrderListHead = 0i64;
      v201 = 0;
      v216 = 0i64;
      v202 = 0;
      v200 = 0;
      v198 = v13;
LABEL_15:
      while( 1 )
      {
        v203 = 0;
        v22 = v13 ? *v13 : v200 + 1;
        if( !v21 )
          break;
LABEL_21:
        _BitScanForward64(&v23, v21);
        v21 &= ~(1i64 << v23);
        v203 = v23;
        v199 = v21;
        KeGetPrcb((unsigned int)KiProcessorNumberToIndexMappingTable[64 * v200 + (unsigned __int8)v23]);
        v25 = v24;
        v216 = v24;
        v26 = *(_QWORD *)(v24 + 0x8000);
        LoadOrderListHead.Flink = 0i64;
        LoadOrderListHead.Blink = (_LIST_ENTRY *)PopIdleTransitionTimeout;
        v27 = *(unsigned __int8(__fastcall **)(__int64))(v26 + 472);
        v28 = *(_QWORD *)(v26 + 488);
        BYTE12(v216) = 1;
        if( !v27(v28) )
        {
          while( (*(_DWORD *)(v25 + 32832) & 0xFF000000) == 83886080 )
          {
            PpmIdleTransitionStall(&LoadOrderListHead, v29, v30, v31);
            if( (*(unsigned __int8(__fastcall **)(_QWORD))(v26 + 472))(*(_QWORD *)(v26 + 488)) )
            {
              v21 = v199;
              goto LABEL_15;
            }
          }
          v12 = -1073741782;
          LODWORD(v187) = -1073741782;
          goto LABEL_27;
        }
      }
      while( 1 )
      {
        v20 = (KSPIN_LOCK *)++v200;
        if( v200 >= v22 )
          break;
        v199 = *(_QWORD *)&v13[4 * v200 + 4];
        v21 = v199;
        if( v199 )
          goto LABEL_21;
      }
      v12 = 0;
      LODWORD(v187) = 0;
    }
LABEL_27:
    if( v12 < 0 )
    {
      if( a8 )
        PpmIdleSetSynchronizationState((UINT32 *)(BugCheckParameter4 + 32832), 0);
      v32 = 0;
      v33 = 1;
      v191 = 1;
      goto LABEL_303;
    }
    v8 = v186;
  }
  v20 = 0i64;
  v34 = *(_WORD *)(v8 + 240);
  v195 = (unsigned __int16 *)(v8 + 240);
  if( v34 )
  {
    while( !*(_QWORD *)(v8 + 240 + 8i64 * (unsigned __int16)v20 + 8) )
    {
      LOWORD(v20) = (_WORD)v20 + 1;
      if( (unsigned __int16)v20 >= v34 )
        goto LABEL_37;
    }
    *(_WORD *)(v8 + 48) |= 0x20u;
  }
LABEL_37:
  v35 = 0;
  v36 = 0;
  v37 = 0;
  v38 = 0i64;
  v208 = 2i64;
  if( PpmPerfQosEnabled && PpmPerfQosManageIdleProcessors && *(_DWORD *)(BugCheckParameter4 + 33264) != 2 )
  {
    v38 = *(_QWORD *)(BugCheckParameter4 + 33136);
    if( v38 && *(_BYTE *)(v38 + 125) )
    {
      v36 = 1;
      _disable();
      v37 = (v232 & 0x200) != 0;
      KxAcquireSpinLock((UINT64 *)(v38 + 128));
    }
    if( (*(_BYTE *)(BugCheckParameter4 + 33272) & 4) == 0 )
    {
      v39 = __rdtsc();
      v20 = (KSPIN_LOCK *)(v39 - *(_QWORD *)(BugCheckParameter4 + 33248));
      v40 = *(_QWORD *)(BugCheckParameter4 + 33256);
      if( (unsigned __int64)v20 < v40 && !*(_BYTE *)(BugCheckParameter4 + 33213) )
      {
        v41 = *(_DWORD *)(BugCheckParameter4 + 236);
        v35 = 1;
        if( (v41 & 0x300) == 0 )
        {
          LOBYTE(v9) = 1;
          v42 = v41 & 0xFFFFFCFF | 0x200;
LABEL_52:
          *(_DWORD *)(BugCheckParameter4 + 236) = v42;
          KeUpdatePendingQosRequest(BugCheckParameter4);
          goto LABEL_53;
        }
        goto LABEL_53;
      }
      *(_QWORD *)(BugCheckParameter4 + 33248) = v39;
      *(_BYTE *)(BugCheckParameter4 + 33213) = (unsigned __int64)v20 >= 2 * v40;
    }
    *(_DWORD *)(BugCheckParameter4 + 33264) = 2;
    PpmPerfArbitratorApplyProcessorState(BugCheckParameter4, 1u, 0, 512i64);
    *(_BYTE *)(BugCheckParameter4 + 236) = 2;
  }
  v43 = *(_DWORD *)(BugCheckParameter4 + 236);
  if( (v43 & 0x300) != 0 )
  {
    v42 = v43 & 0xFFFFFCFF;
    goto LABEL_52;
  }
LABEL_53:
  if( v36 )
  {
    KxReleaseSpinLock((UINT64 *)(v38 + 128));
    if( v37 )
      _enable();
  }
  if( (_BYTE)v9 )
  {
    v9 = 0;
    v12 = -1073741802;
    v33 = 0;
    v191 = 0;
    LODWORD(v187) = -1073741802;
    if( a8 )
      PpmIdleSetSynchronizationState((UINT32 *)(BugCheckParameter4 + 32832), 0);
    v11 = 0i64;
    v32 = 0;
    goto LABEL_302;
  }
  v44 = v179;
  v45 = BugCheckParameter2;
  v46 = v205;
  *(_BYTE *)(BugCheckParameter4 + 32816) = v179;
  *(_DWORD *)(BugCheckParameter4 + 32820) = v45;
  if( a8 )
  {
    *(_BYTE *)(BugCheckParameter4 + 32817) = *(_BYTE *)(v46 + 1058) == 0;
    PpmIdleSetSynchronizationState((UINT32 *)(BugCheckParameter4 + 32832), 2u);
  }
  v47 = v186;
  if( v35 || *(_BYTE *)(v186 + 6) || *(_BYTE *)(v186 + 7) )
  {
    v48 = -1i64;
    v183 = 1;
    if( *(_BYTE *)(v186 + 6) )
    {
      v49 = *(_QWORD *)(v186 + 520);
      if( v49 <= KeMaximumIncrement )
        v49 = KeMaximumIncrement;
      v48 = a7 + KeMaximumIncrement + v49;
    }
    if( *(_BYTE *)(v186 + 7) )
    {
      v50 = *((_DWORD *)PpmCurrentProfile + 684 * dword_140C23D0C + 48);
      if( v48 >= a7 + (unsigned __int64)(unsigned int)(10 * v50) )
        v48 = a7 + (unsigned int)(10 * v50);
    }
    if( v35 && v48 >= a7 + PpmPerfQosIdleExpirationTimeout )
      v48 = a7 + PpmPerfQosIdleExpirationTimeout;
    *(_QWORD *)(BugCheckParameter4 + 32808) = v48;
    _interlockedbittestandset64(
      (volatile signed __int32 *)(*(_QWORD *)(BugCheckParameter4 + 192) + 72i64),
      *(unsigned __int8 *)(BugCheckParameter4 + 209));
  }
  if( *(_BYTE *)(v46 + 1057) || v35 )
    goto LABEL_135;
  v51 = *(_QWORD *)(BugCheckParameter4 + 200);
  v52 = *(_QWORD *)(BugCheckParameter4 + 192);
  v180 = 1;
  _m_prefetchw((const void *)(v52 + 64));
  v53 = _InterlockedOr64((volatile signed __int64 *)(v52 + 64), v51);
  v54 = *(_QWORD *)(BugCheckParameter4 + 0x8000);
  v55 = 0;
  v56 = StateIndex;
  v57 = v53;
  v187 = v53;
  HIDWORD(v190) = 0;
  if( v44 )
  {
    HIDWORD(v190) = 1;
  }
  else if( StateIndex == -1 )
  {
    v58 = 0;
    if( *(_WORD *)(v54 + 240) )
    {
      v59 = (unsigned __int64 *)(v54 + 248);
      v60 = *(unsigned __int16 *)(v54 + 240);
      do
      {
        v61 = *v59++;
        v58 += (unsigned int)((0x101010101010101i64
                             * ((((v61 - ((v61 >> 1) & 0x5555555555555555i64)) & 0x3333333333333333i64)
                               + (((v61 - ((v61 >> 1) & 0x5555555555555555i64)) >> 2) & 0x3333333333333333i64)
                               + ((((v61 - ((v61 >> 1) & 0x5555555555555555i64)) & 0x3333333333333333i64)
                                 + (((v61 - ((v61 >> 1) & 0x5555555555555555i64)) >> 2) & 0x3333333333333333i64)) >> 4)) & 0xF0F0F0F0F0F0F0Fi64)) >> 32) >> 24;
        --v60;
      }
      while( v60 );
      v57 = v187;
      v56 = StateIndex;
      v47 = v186;
    }
    if( v58 != (_DWORD)KeNumberProcessors_0 - 1 )
      goto LABEL_95;
    v44 = v179;
    HIDWORD(v190) = 2;
  }
  v62 = *(_DWORD *)(v54 + 12);
  if( !v62 || (v63 = v62 - 1, (*(_DWORD *)(v54 + 12) = v63) == 0) )
  {
    ExitSamplingCountdown = PpmGetExitSamplingCountdown();
    v55 = 0;
    *(_DWORD *)(v54 + 12) = ExitSamplingCountdown;
    if( ExitSamplingCountdown )
      v55 = v65;
  }
  if( v55 )
  {
    *(_BYTE *)(v54 + 3) = 1;
    if( !v44 )
    {
LABEL_95:
      LODWORD(SpinLock) = 1;
      goto LABEL_96;
    }
    *(_QWORD *)(v54 + 56) = -1i64;
  }
  if( !v44 )
    goto LABEL_95;
LABEL_96:
  v66 = ((__int64(__fastcall *)(_QWORD))off_140C00740[0])((unsigned int)SpinLock);
  v67 = *(_DWORD *)(BugCheckParameter4 + 12504);
  v12 = v66;
  LODWORD(v187) = v66;
  if( v67 )
  {
    v12 = -2147483631;
    goto LABEL_98;
  }
  if( v66 < 0 )
  {
LABEL_99:
    if( a8 )
      PpmIdleSetSynchronizationState((UINT32 *)(BugCheckParameter4 + 32832), 0);
    v9 = 0;
    v33 = 0;
    v191 = 0;
    v32 = 0;
LABEL_292:
    _interlockedbittestandreset64(
      (volatile signed __int32 *)(*(_QWORD *)(BugCheckParameter4 + 192) + 64i64),
      *(unsigned __int8 *)(BugCheckParameter4 + 209));
    if( v178 && *(_BYTE *)(BugCheckParameter4 + 32410) )
      KeWakeProcessor();
    if( (_BYTE)StateIndex_4 && v12 >= 0 )
      v152 = (UINT64 *)&v196;
    else
      v152 = 0i64;
    KeResumeClockTimerFromIdle(v152);
    off_140C00750();
    KeAccumulateTicks(
      (_KPRCB *)BugCheckParameter4,
      *(unsigned int *)(BugCheckParameter4 + 12596),
      KUSER_SHARED_DATA.TickCount.LowPart,
      0,
      0);
    goto LABEL_301;
  }
  if( *(_BYTE *)v47 == 1 )
  {
    v68 = *(_QWORD *)(BugCheckParameter4 + 200) | v57;
    v69 = *(unsigned __int8 *)(BugCheckParameter4 + 208);
    memset((INT64)&result, 0i64);
    v70 = PpmPlatformStates;
    if( PpmPlatformStates )
    {
      *(_DWORD *)&result.Count = 1310721;
      memset((INT64)&result.Reserved, 0i64);
      if( result.Count <= (unsigned __int16)v69 )
        result.Count = v69 + 1;
      result.Bitmap[v69] |= v68;
      v71 = 0;
      v72 = v186;
      v73 = *(_QWORD *)(v186 + 752);
      if( *(_DWORD *)(v73 + 4) )
      {
        while( 1 )
        {
          if( *(_DWORD *)(v73 + 4i64 * v71 + 8) == -1 )
          {
            if( (unsigned int)KeIsSubsetAffinityEx(
                                 (_KAFFINITY_EX *)(v70
                                                 + 384i64 * *(unsigned int *)(*(_QWORD *)(v72 + 784) + 24i64 * v71 + 4)
                                                 + 128),
                                 &result) )
            {
              v12 = -1073741802;
LABEL_98:
              LODWORD(v187) = v12;
              goto LABEL_99;
            }
            v72 = v186;
          }
          if( ++v71 >= *(_DWORD *)(v73 + 4) )
            goto LABEL_112;
        }
      }
      v47 = v186;
    }
    else
    {
LABEL_112:
      v47 = v186;
    }
  }
  if( v55 )
    *(_WORD *)(v47 + 48) |= 0x200u;
  v74 = v179;
  if( v179 )
  {
    v184 = 1;
    _InterlockedIncrement(&PpmNonInterruptibleCount);
    CurrentPrcb = KeGetCurrentPrcb();
    v76 = KiClockTimerOwner;
    if( (*((_BYTE *)CurrentPrcb + 34) & 1) != 0 )
    {
      off_140C00888[0]();
      *((_BYTE *)CurrentPrcb + 34) &= ~1u;
      v74 = v179;
    }
    if( *((_DWORD *)CurrentPrcb + 9) == v76 )
      ++dword_140C31348;
    if( *((_BYTE *)CurrentPrcb + 33) )
      *((_BYTE *)CurrentPrcb + 33) = 0;
  }
  if( *(_BYTE *)(v47 + 540) )
  {
    if( v55 )
    {
      v77 = (unsigned __int8)StateIndex_4;
      if( !v74 )
        v77 = 1;
      StateIndex_4 = v77;
    }
    if( a5 && v56 != -1 && PpmDripsStateIndex != -1 )
    {
      v78 = (unsigned __int8)v193;
      if( *(_BYTE *)v47 == 1 )
        v78 = 1;
      v193 = v78;
    }
    KePrepareClockTimerForIdle(a5, (unsigned __int8)v193, *(_QWORD *)(v47 + 520));
  }
  v45 = BugCheckParameter2;
LABEL_135:
  v79 = *(KSPIN_LOCK **)(BugCheckParameter4 + 33192);
  SpinLock = v79;
  if( v79 )
  {
    PpmIdleUpdateConcurrency(v79, a6, 1, 1);
    v80 = *(KSPIN_LOCK **)(BugCheckParameter4 + 33200);
    if( v80 )
      PpmIdleUpdateConcurrency(v80, a6, 1, 1);
  }
  *(_DWORD *)(v47 + 20) = v45;
  v81 = __rdtsc();
  if( (*(_QWORD *)(BugCheckParameter4 + 34208) & 0x8000000000i64) != 0 )
  {
    v82 = __readmsr(0xDB2u);
    v9 = 0;
  }
  else
  {
    v9 = 0;
    v82 = 0i64;
  }
  v83 = a6 - *(_QWORD *)(BugCheckParameter4 + 32880);
  _InterlockedExchangeAdd64((volatile signed __int64 *)(BugCheckParameter4 + 32896), v83);
  if( (*(_QWORD *)(BugCheckParameter4 + 34208) & 0x8000000000i64) != 0 )
    *(_QWORD *)(BugCheckParameter4 + 32968) += PpmConvertTime(
                                                 v83,
                                                 v81 - *(_QWORD *)(BugCheckParameter4 + 32848),
                                                 v82 - *(_QWORD *)(BugCheckParameter4 + 32960));
  v84 = *(_QWORD *)(BugCheckParameter4 + 32848);
  *(_QWORD *)(BugCheckParameter4 + 32880) = a6;
  if( v81 > v84 )
    *(_QWORD *)(BugCheckParameter4 + 32856) += v81 - v84;
  *(_QWORD *)(BugCheckParameter4 + 32848) = v81;
  if( (*(_QWORD *)(BugCheckParameter4 + 34208) & 0x8000000000i64) != 0 )
    *(_QWORD *)(BugCheckParameter4 + 32960) = v82;
  PpmUpdatePerformanceFeedback(BugCheckParameter4, 0, 0, 1, 0i64);
  if( PopSnapEnergyCounters )
    PopSnapEnergyCounters(*(unsigned int *)(BugCheckParameter4 + 36), 0i64, 0i64);
  v88 = v186;
  _InterlockedExchange64((volatile __int64 *)(BugCheckParameter4 + 32800), a6);
  v89 = *(__int64(__fastcall **)(__int64, _QWORD, _QWORD, _QWORD, _QWORD))(v186 + 416);
  if( v89 )
  {
    v12 = v89(
            v197,
            (unsigned int)BugCheckParameter2,
            StateIndex,
            *(unsigned int *)(v186 + 796),
            *(_QWORD *)(v186 + 808));
    LODWORD(v187) = v12;
  }
  if( v12 >= 0 )
  {
    v90 = StateIndex;
    v91 = *(_QWORD *)(v186 + 808);
    LODWORD(v92) = *(_DWORD *)(v186 + 796);
    v181 = 1;
    if( StateIndex != -1 )
    {
      v93 = PpmPlatformStates + 384i64 * StateIndex;
      PpmEventEnterPlatformIdleState(StateIndex);
      if( !qword_140C4FD80 && StateIndex == (_DWORD)PlatformIdleStateIndex )
        _InterlockedCompareExchange64(
          &qword_140C4FD80,
          *(signed __int64 *)&KUSER_SHARED_DATA.InterruptTime.LowPart,
          0i64);
      if( a5 )
      {
        *(_BYTE *)(PpmPlatformStates + 56) = 1;
        ++*(_DWORD *)(*(_QWORD *)(PpmPlatformStates + 48) + 8i64);
      }
      if( *(_BYTE *)(v93 + 120) )
      {
        KdPowerTransitionEx(2147483652i64, 1);
        KdCallPowerHandlers(PowerDeviceD3);
      }
      v88 = v186;
    }
    for( ; (_DWORD)v92; *(_DWORD *)(v94 + 320) = v95 & 0xF8FFFFFF | 0x4000000 )
    {
      v92 = (unsigned int)(v92 - 1);
      v94 = PpmPlatformStates + 384i64 * *(unsigned int *)(v91 + 4 * v92);
      *(_QWORD *)(v94 + 328) = a6;
      v95 = *(_DWORD *)(v94 + 320);
      if( !*(_DWORD *)(PpmPlatformStates + 4) )
        v95 ^= ((unsigned __int16)v95 ^ (unsigned __int16)*((_DWORD *)KeGetPcr() + 105)) & 0xFFF;
    }
    if( v90 != -1 )
      *(_WORD *)(v88 + 48) |= 0x10u;
    v218 = 0i64;
    if( a8 )
      PpmIdleSetSynchronizationState((UINT32 *)(BugCheckParameter4 + 32832), v182);
    if( v180 )
    {
      v178 = 0;
      if( *(_BYTE *)(v205 + 1056) >= 2u )
      {
        v96 = byte_140C10DE0;
        v217 = 0i64;
        if( byte_140C10DE0 == -1 )
        {
          v97 = __cpuid(1, 0);
          v96 = 0;
          *(_QWORD *)&v217 = __PAIR64__(EBX(v97), EAX(v97));
          *((_QWORD *)&v217 + 1) = __PAIR64__(EDX(v97), ECX(v97));
          if( (SDWORD2(v217) & 0x80000000) != 0 )
          {
            v96 = 0;
            v100 = __cpuid(1073741825, 0);
            v99 = ECX(v100);
            v98 = EDX(v100);
            *(_QWORD *)&v217 = __PAIR64__(EBX(v100), EAX(v100));
            if( (_DWORD)v217 == 1986945624 )
              v96 = 1;
            *((_QWORD *)&v217 + 1) = __PAIR64__(v98, v99);
          }
          byte_140C10DE0 = v96;
        }
        if( !v96 )
        {
          v101 = KeGetCurrentPrcb();
          if( *((_BYTE *)v101 + 141) == 1 )
          {
            v178 = 0;
          }
          else
          {
            v102 = *((unsigned int *)v101 + 9);
            *((_BYTE *)v101 + 32410) = 1;
            _InterlockedOr64(
              (volatile signed __int64 *)(8i64 * ((unsigned int)KiProcessorIndexToNumberMappingTable[v102] >> 6)
                                        + 12759400
                                        + 0x140000000i64),
              1i64 << (KiProcessorIndexToNumberMappingTable[v102] & 0x3F));
            if( !*((_BYTE *)v101 + 32410) )
            {
              _InterlockedAnd64(
                (volatile signed __int64 *)(8i64
                                          * ((unsigned int)KiProcessorIndexToNumberMappingTable[*((unsigned int *)v101
                                                                                                + 9)] >> 6)
                                          + 12759400
                                          + 0x140000000i64),
                ~(1i64 << (KiProcessorIndexToNumberMappingTable[*((unsigned int *)v101 + 9)] & 0x3F)));
              if( KiFlushPcid )
              {
                v103 = __readcr3();
                __writecr3(v103);
                if( !*(_BYTE *)(*((_QWORD *)KeGetCurrentThread() + 23) + 912i64) )
                  KiSetUserTbFlushPending();
              }
              else
              {
                v104 = __readcr4();
                if( (v104 & 0x20080) != 0 )
                {
                  __writecr4(v104 ^ 0x80);
                  __writecr4(v104);
                }
                else
                {
                  v105 = __readcr3();
                  __writecr3(v105);
                }
              }
            }
            v178 = *((_BYTE *)v101 + 32410);
          }
        }
      }
    }
    if( (*(_BYTE *)(BugCheckParameter4 + 249) & 1) != 0 && (v106 = *(_BYTE *)(BugCheckParameter4 + 250)) != 0 )
    {
      *(_BYTE *)(BugCheckParameter4 + 248) |= 1u;
      v107 = v106;
    }
    else
    {
      v107 = 0;
    }
    _m_prefetchw((const void *)(BugCheckParameter4 + 254));
    v108 = *(_WORD *)(BugCheckParameter4 + 254) & 4;
    if( v108 )
    {
      if( (*(_BYTE *)(BugCheckParameter4 + 248) & 1) != 0 )
      {
        v109 = *(_BYTE *)(BugCheckParameter4 + 250);
        if( (v109 & 3) == 0 )
        {
          v107 |= 2u;
          *(_BYTE *)(BugCheckParameter4 + 250) = v109 | 2;
          __writemsr(0x48u, v109 | 2u);
        }
      }
      _InterlockedOr16((volatile signed __int16 *)(BugCheckParameter4 + 254), 2u);
      v110 = *(_QWORD *)(BugCheckParameter4 + 11696);
      _m_prefetchw((const void *)(v110 + 254));
      do
        v111 = *(_WORD *)(v110 + 254);
      while( v111 != _InterlockedCompareExchange16((volatile signed __int16 *)(v110 + 254), v111 & 0xFFE4 | 0xA, v111) );
    }
    v112 = v186;
    LODWORD(v187) = (*(__int64(__fastcall **)(__int64, __int64, _QWORD, _QWORD, _DWORD, _DWORD, _QWORD))(v186 + 424))(
                      v197,
                      v209,
                      (unsigned int)BugCheckParameter2,
                      v90,
                      v107,
                      *(_DWORD *)(v186 + 796),
                      *(_QWORD *)(v186 + 808));
    v12 = v187;
    if( v108 )
    {
      *((_QWORD *)&v85 + 1) = *(_QWORD *)(BugCheckParameter4 + 11696);
      _m_prefetchw((const void *)(*((_QWORD *)&v85 + 1) + 254i64));
      do
        v113 = *(_WORD *)(*((_QWORD *)&v85 + 1) + 254i64);
      while( v113 != _InterlockedCompareExchange16(
                        (volatile signed __int16 *)(*((_QWORD *)&v85 + 1) + 254i64),
                        v113 & 0xFFF5 | 2,
                        v113) );
      if( (*(_WORD *)(BugCheckParameter4 + 254) & 0x10) == 0 )
      {
        v114 = *(_BYTE *)(BugCheckParameter4 + 250);
        if( (v114 & 2) != 0 )
        {
          *(_BYTE *)(BugCheckParameter4 + 250) = v114 & 0xFD;
          *((_QWORD *)&v85 + 1) = 0i64;
          __writemsr(0x48u, v114 & 0xFD);
        }
      }
    }
    *(_BYTE *)(BugCheckParameter4 + 248) &= ~1u;
    if( v178 )
    {
      v115 = *(_BYTE *)(BugCheckParameter4 + 32410);
      v178 = 0;
      if( v115 )
      {
        *(_QWORD *)&v85 = KeGetCurrentPrcb();
        v86 = 0x140000000ui64;
        v116 = *(unsigned int *)(v85 + 36);
        *(_BYTE *)(v85 + 32410) = 0;
        *((_QWORD *)&v85 + 1) = (unsigned int)KiProcessorIndexToNumberMappingTable[v116];
        _InterlockedAnd64(
          (volatile signed __int64 *)&KeSleepingProcessors.Bitmap[(unsigned __int64)DWORD2(v85) >> 6],
          ~(1i64 << (KiProcessorIndexToNumberMappingTable[v116] & 0x3F)));
        v117 = __readcr4();
        if( (v117 & 0x20080) != 0 )
        {
          __writecr4(v117 ^ 0x80);
          __writecr4(v117);
        }
        else
        {
          v118 = __readcr3();
          __writecr3(v118);
        }
      }
    }
    if( *(int *)(v112 + 64) < 0 )
    {
      if( v12 >= 0 )
        v12 = *(_DWORD *)(v112 + 64);
      LODWORD(v187) = v12;
    }
    v206 = 0i64;
  }
  v119 = HalpPerformanceCounter;
  if( *(_DWORD *)(HalpPerformanceCounter + 228) != 5 )
  {
    v133 = *(_DWORD *)(HalpPerformanceCounter + 220) == 64;
    FromFrequency = *(_QWORD *)(HalpPerformanceCounter + 192);
    if( v133 )
    {
      if( (*(_DWORD *)(HalpPerformanceCounter + 224) & 0x10000) != 0 )
        v141 = *(_QWORD *)(HalpPerformanceCounter + 72)
             + (unsigned int)(*(_DWORD *)(HalpPerformanceCounter + 80) * *((_DWORD *)KeGetPcr() + 105));
      else
        v141 = *(_QWORD *)(HalpPerformanceCounter + 72);
      *(_QWORD *)&v85 = (*(__int64(__fastcall **)(__int64))(HalpPerformanceCounter + 112))(v141);
      QpcBias = *(_QWORD *)(v119 + 208);
      *((_QWORD *)&v85 + 1) = v85;
    }
    else
    {
      do
      {
        QpcBias = *(_QWORD *)(v119 + 208);
        do
        {
          v134 = *(_QWORD *)(v119 + 200);
          HalpTimerGetInternalData((KDPC *)v119, *((PVOID *)&v85 + 1), (PVOID)v86, v87);
          v86 = (*(__int64(__fastcall **)(__int64))(v119 + 112))(v135);
          _InterlockedOr(v172, 0);
          *(_QWORD *)&v85 = *(_QWORD *)(v119 + 200);
        }
        while( v134 != (_QWORD)v85 );
      }
      while( QpcBias != *(_QWORD *)(v119 + 208) );
      v136 = *(_DWORD *)(v119 + 220);
      v137 = v134 ^ v86;
      if( _bittest64((const __int64 *)&v137, (unsigned __int8)(v136 - 1)) )
      {
        v138 = 1i64 << v136;
        v139 = -1i64;
        if( v136 != 64 )
          v139 = v138 - 1;
        v140 = v134 & v139;
        *((_QWORD *)&v85 + 1) = v86 | v134 ^ v140;
        if( v86 < v140 )
          *((_QWORD *)&v85 + 1) += v138;
        _InterlockedCompareExchange64((volatile signed __int64 *)(v119 + 200), *((signed __int64 *)&v85 + 1), v85);
      }
      else if( v136 == 64 )
      {
        *((_QWORD *)&v85 + 1) = v86;
      }
      else
      {
        *((_QWORD *)&v85 + 1) = v86 | v134 & ~((1i64 << v136) - 1);
      }
    }
    goto LABEL_254;
  }
  FromFrequency = 10000000i64;
  if( HalpTimerReferencePage )
  {
    if( (*(_DWORD *)(HalpPerformanceCounter + 224) & 0x10000) != 0 )
      v130 = *(_QWORD *)(HalpPerformanceCounter + 72)
           + (unsigned int)(*(_DWORD *)(HalpPerformanceCounter + 80) * *((_DWORD *)KeGetPcr() + 105));
    else
      v130 = *(_QWORD *)(HalpPerformanceCounter + 72);
    v131 = (*(__int64(__fastcall **)(__int64))(HalpPerformanceCounter + 112))(v130);
    QpcBias = KUSER_SHARED_DATA.QpcBias;
    v85 = (unsigned __int64)v131 * (unsigned __int128)*((unsigned __int64 *)HalpTimerReferencePage + 1);
LABEL_254:
    v129 = *((_QWORD *)&v85 + 1) + QpcBias;
    v192 = v129;
    goto LABEL_255;
  }
  if( *(_DWORD *)(HalpPerformanceCounter + 220) == 64 )
  {
    HalpTimerGetInternalData((KDPC *)HalpPerformanceCounter, *((PVOID *)&v85 + 1), (PVOID)v86, v87);
    *(_QWORD *)&v85 = (*(__int64(__fastcall **)(__int64))(v119 + 112))(v128);
    v120 = *(_QWORD *)(v119 + 208);
    *((_QWORD *)&v85 + 1) = v85;
  }
  else
  {
    do
    {
      v120 = *(_QWORD *)(v119 + 208);
      do
      {
        v121 = *(_QWORD *)(v119 + 200);
        HalpTimerGetInternalData((KDPC *)v119, *((PVOID *)&v85 + 1), (PVOID)v86, v87);
        v86 = (*(__int64(__fastcall **)(__int64))(v119 + 112))(v122);
        _InterlockedOr(v172, 0);
        *(_QWORD *)&v85 = *(_QWORD *)(v119 + 200);
      }
      while( v121 != (_QWORD)v85 );
    }
    while( v120 != *(_QWORD *)(v119 + 208) );
    v123 = *(_DWORD *)(v119 + 220);
    v124 = v121 ^ v86;
    if( _bittest64((const __int64 *)&v124, (unsigned __int8)(v123 - 1)) )
    {
      v125 = 1i64 << v123;
      v126 = -1i64;
      if( v123 != 64 )
        v126 = v125 - 1;
      v127 = v126 & v121;
      *((_QWORD *)&v85 + 1) = v86 | v121 ^ v126 & v121;
      if( v86 < v127 )
        *((_QWORD *)&v85 + 1) += v125;
      _InterlockedCompareExchange64((volatile signed __int64 *)(v119 + 200), *((signed __int64 *)&v85 + 1), v85);
    }
    else if( v123 == 64 )
    {
      *((_QWORD *)&v85 + 1) = v86;
    }
    else
    {
      *((_QWORD *)&v85 + 1) = v86 | v121 & ~((1i64 << v123) - 1);
    }
  }
  v129 = HalpTimerScaleCounter(v120 + *((_QWORD *)&v85 + 1), *(_QWORD *)(v119 + 192), 0x989680ui64);
  v192 = v129;
LABEL_255:
  if( v119 != HalpOriginalPerformanceCounter && HalpOriginalPerformanceCounter )
  {
    v142 = *(_QWORD *)(HalpOriginalPerformanceCounter + 192);
    if( *(_DWORD *)(HalpOriginalPerformanceCounter + 228) == 5 )
      v142 = 10000000i64;
    v129 = HalpTimerScaleCounter(v129, FromFrequency, v142);
    v192 = v129;
  }
  _InterlockedExchange64((volatile __int64 *)(BugCheckParameter4 + 32800), 0i64);
  if( *(_BYTE *)(BugCheckParameter4 + 32977) )
  {
    _disable();
    v143 = (v232 & 0x200) != 0;
    KxAcquireSpinLock((UINT64 *)(BugCheckParameter4 + 32840));
    v144 = 2i64;
    v145 = (INT64 *)(BugCheckParameter4 + 32864);
    do
    {
      v146 = *v145;
      if( *v145 && *(_BYTE *)(v146 + 34) )
      {
        PpmPerfFeedbackCounterUpdate(v146);
        v144 = v208;
      }
      ++v145;
      v208 = --v144;
    }
    while( v144 );
    KxReleaseSpinLock((UINT64 *)(BugCheckParameter4 + 32840));
    if( v143 )
      _enable();
  }
  v147 = __rdtsc();
  if( (*(_QWORD *)(BugCheckParameter4 + 34208) & 0x8000000000i64) != 0 )
    v148 = __readmsr(0xDB2u);
  else
    v148 = 0i64;
  *(_QWORD *)(BugCheckParameter4 + 32880) = v129;
  *(_QWORD *)(BugCheckParameter4 + 32848) = v147;
  if( (*(_QWORD *)(BugCheckParameter4 + 34208) & 0x8000000000i64) != 0 )
    *(_QWORD *)(BugCheckParameter4 + 32960) = v148;
  v20 = SpinLock;
  if( SpinLock )
  {
    PpmIdleUpdateConcurrency(SpinLock, v129, 0, 1);
    v20 = *(KSPIN_LOCK **)(BugCheckParameter4 + 33200);
    if( v20 )
      PpmIdleUpdateConcurrency(v20, v129, 0, 1);
  }
  *(_QWORD *)(BugCheckParameter4 + 32784) = v129 - a6;
  if( a8 )
  {
    v149 = PpmIdleSetSynchronizationState((UINT32 *)(BugCheckParameter4 + 32832), 0);
    if( v12 >= 0 && v149 != 8 && v179 )
      KeBugCheckEx(0xA0u, 0x702ui64, (unsigned int)BugCheckParameter2, v149, BugCheckParameter4);
    *(_BYTE *)(BugCheckParameter4 + 32817) = 0;
  }
  v32 = v181;
  if( v180 )
  {
    if( v181
      && v12 >= 0
      && PpmPlatformStates
      && *(_BYTE *)(PpmPlatformStates + 56)
      && PpmDripsStateIndex != -1
      && *(_DWORD *)(384i64 * (unsigned int)PpmDripsStateIndex + PpmPlatformStates + 320) )
    {
      v150 = KeQueryWakeSource(&v190, v219);
      v151 = v190;
      v33 = 3;
      if( v150 < 0 )
        v151 = 3;
      LODWORD(v190) = v151;
    }
    else
    {
      v33 = 3;
    }
    goto LABEL_292;
  }
  v33 = 3;
LABEL_301:
  v11 = v192;
LABEL_302:
  v13 = v195;
LABEL_303:
  LOBYTE(v20) = 1;
  ((void(__fastcall *)(KSPIN_LOCK *))off_140C009A8[0])(v20);
  if( v183 )
  {
    _interlockedbittestandreset64(
      (volatile signed __int32 *)(*(_QWORD *)(BugCheckParameter4 + 192) + 72i64),
      *(unsigned __int8 *)(BugCheckParameter4 + 209));
    *(_QWORD *)(BugCheckParameter4 + 32808) = -1i64;
  }
  v153 = v32;
  v154 = CoordinatedSelection;
  v177 = v190;
  v176 = v219;
  LOBYTE(BugCheckParameter4a) = v33 != 3;
  LODWORD(SpinLock) = PpmExitCoordinatedIdle(
                        (_KPRCB *)BugCheckParameter4,
                        CoordinatedSelection,
                        v153,
                        (unsigned int)v12,
                        BugCheckParameter4a,
                        v11,
                        a5);
  if( v33 == 3 )
  {
    (*(void(__fastcall **)(__int64, _QWORD, _QWORD, _QWORD, unsigned int *))(v186 + 456))(
      v197,
      (unsigned int)BugCheckParameter2,
      (unsigned int)SpinLock,
      v154->SelectedStates,
      v154->Selection);
  }
  else if( !*(_BYTE *)v186 )
  {
    (*(void(__fastcall **)(__int64, _QWORD))(v186 + 464))(v197, v33);
  }
  Selection = v154->Selection;
  for( LODWORD(v154) = v154->SelectedStates;
        (_DWORD)v154;
        *(_DWORD *)(384i64 * Selection[(_QWORD)v154] + PpmPlatformStates + 320) = 0 )
  {
    v154 = (_PPM_COORDINATED_SELECTION *)(unsigned int)((_DWORD)v154 - 1);
  }
  if( v184 )
    _InterlockedDecrement(&PpmNonInterruptibleCount);
  memset((INT64)v231, 0i64);
  v229 = 1310721;
  memset((INT64)&v230, 0i64);
  LODWORD(v11) = *((_DWORD *)KeGetPcr() + 105);
  v156 = *((_QWORD *)v13 + 1);
  v157 = 0;
  while( 1 )
  {
    v204 = 0;
    v158 = v13 ? *v13 : v157 + 1;
    if( !v156 )
      break;
LABEL_320:
    _BitScanForward64(&v159, v156);
    v156 &= ~(1i64 << v159);
    v204 = v159;
    v160 = KiProcessorNumberToIndexMappingTable[64 * v157 + (unsigned __int8)v159];
    KeGetPrcb(v160);
    v162 = v161;
    v163 = *(_QWORD *)(v161 + 0x8000);
    _m_prefetchw((const void *)(v161 + 32832));
    v164 = *(_DWORD *)(v161 + 32832);
    do
    {
      v165 = v164;
      v166 = v164 ^ (v164 ^ (v164 - 1)) & 0xFFFFFF;
      if( (v166 & 0xFFFFFF) == 0 )
      {
        if( HIBYTE(v164) == 5 )
        {
          v166 = v166 & 0xFFFFFF | 0x4000000;
        }
        else if( HIBYTE(v164) == 7 )
        {
          v166 = v166 & 0xFFFFFF | 0x6000000;
        }
      }
      v164 = _InterlockedCompareExchange((volatile signed __int32 *)(v162 + 32832), v166, v164);
    }
    while( v164 != v165 );
    if( HIBYTE(v166) == 6 )
      KeAddProcessorAffinityEx(&v229, v160);
    _InterlockedAnd64(
      (volatile signed __int64 *)(v163
                                + 8 * ((unsigned __int64)(unsigned int)KiProcessorIndexToNumberMappingTable[v11] >> 6)
                                + 80),
      ~(1i64 << (KiProcessorIndexToNumberMappingTable[v11] & 0x3F)));
    v13 = v195;
    KeRemoveProcessorAffinityEx(v195, v160);
    v9 = 0;
  }
  while( ++v157 < v158 )
  {
    v156 = *(_QWORD *)&v13[4 * v157 + 4];
    if( v156 )
      goto LABEL_320;
  }
  v167 = (int)SpinLock;
  v168 = v211;
  if( (_WORD)v229 )
  {
    while( !v231[v9] )
    {
      if( ++v9 >= (unsigned __int16)v229 )
        goto LABEL_335;
    }
    HalRequestIpi(0, &v229);
  }
LABEL_335:
  v169 = v186;
  v170 = v187;
  if( *(_BYTE *)(v186 + 3) )
  {
    LODWORD(v176) = v167;
    *(_DWORD *)DeepSleepEnabled = BugCheckParameter2;
    LODWORD(ExitTime) = HIDWORD(v190);
    LODWORD(BugCheckParameter4a) = v196;
    PpmIdleCompleteExitLatencyTrace(
      v168,
      v187,
      v179,
      v192,
      BugCheckParameter4a,
      ExitTime,
      *(_QWORD *)DeepSleepEnabled,
      v176);
  }
  v171 = v191;
  *(_DWORD *)(v169 + 68) = v191;
  *(_DWORD *)(v169 + 64) = v170;
  return v171;
}

Referenced by:

PoIdle