KiSwapThread

VOID __fastcall KiSwapThread(_ETHREAD *OldThread, _KPRCB *CurrentPrcb){
  _QWORD *v2; 
  unsigned __int64 v5; 
  unsigned __int64 v6; 
  unsigned __int64 v7; 
  char v8; 
  __int64 v9; 
  __int64 v10; 
  __int64 v11; 
  unsigned int v12; 
  unsigned int v13; 
  __int64 v14; 
  __int64 v15; 
  __int64 v16; 
  __int64 v17; 
  _QWORD *v18; 
  unsigned int v19; 
  unsigned int v20; 
  unsigned int v21; 
  int v22; 
  struct _KPRCB *v23; 
  __int64 v24; 
  _KSCHEDULING_GROUP *v25; 
  _ETHREAD *v26; 
  __int64 v27; 
  unsigned __int64 v28; 
  int v29; 
  __int64 v30; 
  int v31; 
  int v32; 
  __int64 v33; 
  int v34; 
  unsigned __int64 v35; 
  __int64 v36; 
  char v37; 
  int v39; 
  __int64 v40; 
  unsigned __int64 v41; 
  char v42; 
  int v43; 
  __int64 v44; 
  __int64 v45; 
  __int64 v46; 
  __int64 v47; 
  struct _KPRCB *v48; 
  char v49; 
  unsigned __int64 v50; 
  char v51; 
  bool v52; 
  unsigned __int64 v53; 
  int v54; 
  unsigned __int64 v55; 
  __int64 v56; 
  __int64 v57; 
  unsigned __int64 v58; 
  int v59; 
  unsigned __int64 v60; 
  int v61; 
  unsigned __int64 v62; 
  __int64 v63; 
  char v64; 
  __int64 v65; 
  unsigned __int64 v66; 
  __int64 v67; 
  _QWORD *i; 
  char v69; 
  unsigned int v70; 
  INT64 v71; 
  int v72; 
  __int64 v73; 
  char v74; 
  unsigned __int64 v75; 
  __int64 v76; 
  char v77; 
  struct _KPRCB *v78; 
  char v79; 
  __int64 v80; 
  unsigned __int64 v81; 
  __int64 v82; 
  __int64 v83; 
  unsigned __int64 v84; 
  unsigned __int64 v85; 
  __int64 v86; 
  __int64 v87; 
  __int64 v88; 
  int v89; 
  char v90; 
  INT64 v91; 
  INT64 v92; 
  int v93; 
  struct _KPRCB *v94; 
  __int64 v95; 
  int v96; 
  INT64 v97; 
  INT64 v98; 
  PVOID v99; 
  int v100; 
  int v101; 
  int v102; 
  __int64 v103; 
  UINT64 v104; 
  UINT64 v105; 
  UINT64 SpinCount; 
  UINT64 v107; 
  __int64 v108; 
  __int64 v109; 
  char v110; 
  __int64 v111; 
  _QWORD *v112; 
  int v113; 
  v112 = v2;
  if( *((_QWORD *)CurrentPrcb + 1441) )
    KiProcessThreadWaitList((struct KPRCB *)CurrentPrcb, 1, 0);
  KiAbProcessContextSwitch((_KTHREAD *)OldThread, 0i64);
  _disable();
  *((_BYTE *)CurrentPrcb + 32) = 1;
  v5 = __rdtsc();
  v6 = v5 - *((_QWORD *)CurrentPrcb + 4056);
  v7 = v6 + *((unsigned int *)OldThread + 20);
  *((_QWORD *)OldThread + 9) += v6;
  if( v7 > 0xFFFFFFFF )
    LODWORD(v7) = -1;
  *((_QWORD *)CurrentPrcb + 4056) = v5;
  v8 = *((_BYTE *)OldThread + 2);
  *((_DWORD *)OldThread + 20) = v7;
  if( (v8 & 0x3E) != 0 )
  {
    if( (v8 & 0x10) != 0 )
    {
      *((_QWORD *)CurrentPrcb + *((unsigned __int8 *)OldThread + 124) + 4058) += *((_QWORD *)CurrentPrcb + 4056)
                                                                               - *((_QWORD *)CurrentPrcb + 4057);
      v8 &= ~0x10u;
      *((_QWORD *)CurrentPrcb + 4057) = 0i64;
    }
    if( (v8 & 0x20) != 0 )
    {
      v9 = *((_QWORD *)OldThread + 191);
      if( v9 )
      {
        v10 = *((_QWORD *)CurrentPrcb + 4141);
        v11 = *((_QWORD *)CurrentPrcb + 4142);
        if( v10 && v11 )
        {
          if( *(_BYTE *)(v11 + 100) )
          {
            v12 = *(_DWORD *)(v11 + 116);
          }
          else
          {
            v12 = *(_DWORD *)(v11 + 72);
            if( v12 >= *(_DWORD *)(v10 + 368) )
              v12 = *(_DWORD *)(v10 + 368);
          }
        }
        else
        {
          v12 = 100;
        }
        if( v12 < 0x4B )
          v13 = v12 / 0x19;
        else
          v13 = 3;
        v14 = *((unsigned __int8 *)CurrentPrcb + 33208);
        v15 = v13;
        v16 = v14 + 2i64 * v13;
        v17 = *(_QWORD *)(v9 + 8 * v16);
        v18 = (_QWORD *)(v9 + 8 * v16);
        v19 = KiTimelineBitmapTime;
        *v18 = v6 + v17;
        v20 = *(_DWORD *)(v9 + 192);
        if( v19 > v20 )
        {
          LODWORD(v111) = v19;
          if( v19 - v20 >= 0x20 )
            HIDWORD(v111) = 1;
          else
            HIDWORD(v111) = (*(_DWORD *)(v9 + 196) << (v19 - v20)) | 1;
          *(_QWORD *)(v9 + 192) = v111;
        }
        else
        {
          v21 = v20 - v19;
          if( v21 < 0x20 )
            *(_DWORD *)(v9 + 196) |= 1 << v21;
        }
        if( !KiEfficiencyClassSystem && (unsigned __int8)*((_DWORD *)OldThread + 128) == 2 )
          *(_QWORD *)(v9 + 16 * v15 + 8) += v6;
        if( *((_QWORD *)OldThread + 184) )
        {
          *(_QWORD *)(v9 + 8 * (v14 + 16 + 2 * v15)) += v6;
          _InterlockedExchangeAdd64(
            (volatile signed __int64 *)(*(_QWORD *)(*((_QWORD *)OldThread + 184) + 1528i64) + 8 * (v14 + 8 + 2 * v15)),
            v6);
        }
      }
      v8 &= ~0x20u;
    }
    if( (v8 & 0x40) != 0 )
    {
      v80 = *((_QWORD *)OldThread + 121);
      if( v80 )
        *(_BYTE *)(v80 + 64) = 0;
      v8 &= ~0x40u;
    }
    if( (v8 & 0x3E) != 0 )
    {
      v67 = *((_QWORD *)OldThread + 13);
      if( v67 )
      {
        for( i = (_QWORD *)(*((unsigned int *)CurrentPrcb + 54) + v67); i; i = (_QWORD *)i[51] )
          *i += v6;
      }
      if( (*((_BYTE *)OldThread + 2) & 8) != 0
        && (*((_QWORD *)OldThread + 72) & *(_QWORD *)(*((_QWORD *)CurrentPrcb + 24) + 136i64)) != *(_QWORD *)(*((_QWORD *)CurrentPrcb + 24) + 136i64) )
      {
        *((_QWORD *)CurrentPrcb + 4061) += v6;
      }
      if( *((_BYTE *)OldThread + 125) )
      {
        if( (unsigned __int8)*((_DWORD *)OldThread + 128) == 2 )
          *((_QWORD *)CurrentPrcb + 4063) += v6;
        else
          *((_QWORD *)CurrentPrcb + 4062) += v6;
      }
      if( *((_QWORD *)OldThread + 45) )
        KiEndCounterAccumulation((__int64)OldThread);
    }
  }
  _enable();
  v22 = (*((_DWORD *)OldThread + 20) >> 1) + (*((_DWORD *)OldThread + 21) >> 1);
  *((_DWORD *)OldThread + 20) = 0;
  *((_DWORD *)OldThread + 21) = v22;
  v23 = KeGetCurrentPrcb();
  LODWORD(v104) = 0;
  while( _interlockedbittestandset64((volatile signed __int32 *)CurrentPrcb + 12, 0i64) )
  {
    do
      KeYieldProcessorEx(&v104);
    while( *((_QWORD *)CurrentPrcb + 6) );
    v76 = *((_QWORD *)v23 + 4247);
    if( v76 && *((_BYTE *)v23 + 32) <= 1u )
      ++*(_DWORD *)(v76 + 24);
  }
  v24 = *((_QWORD *)OldThread + 13);
  v108 = v24;
  v25 = (_KSCHEDULING_GROUP *)v24;
  if( v24 )
  {
    v71 = *((unsigned int *)CurrentPrcb + 54) + v24;
    if( v71 )
    {
      v72 = 0;
      while( 1 )
      {
        if( (*(_BYTE *)(v71 + 112) & 4) != 0 )
        {
          if( KiCheckMaxOverQuotaTransition(v71, (volatile INT64 *)v25) )
          {
            if( (*(_BYTE *)(v71 + 112) & 1) != 0 )
              KiRemoveSchedulingGroupQueue(CurrentPrcb, (_KSCB *)v71, 1u);
          }
          else if( *(_QWORD *)v71 >= *(_QWORD *)(v71 + 24) && (*(_BYTE *)(v71 + 112) & 2) == 0 )
          {
            KiRecomputeGroupSchedulingRank(v25, (_KSCB *)v71, CurrentPrcb);
          }
        }
        else
        {
          KiComputeGroupSchedulingRank(v25, CurrentPrcb, (_KSCB *)v71);
        }
        v72 += *(_DWORD *)(v71 + 116);
        v71 = *(_QWORD *)(v71 + 408);
        if( !v71 )
          break;
        v25 = (_KSCHEDULING_GROUP *)(v71 - *((unsigned int *)CurrentPrcb + 54));
        v108 = (__int64)v25;
      }
    }
  }
  v26 = (_ETHREAD *)*((_QWORD *)CurrentPrcb + 2);
  if( v26 )
  {
LABEL_125:
    *((_QWORD *)CurrentPrcb + 2) = 0i64;
    *((_QWORD *)CurrentPrcb + 1) = v26;
    if( *((_BYTE *)v26 + 388) == 1 )
      goto LABEL_132;
    goto LABEL_126;
  }
  while( 1 )
  {
    v26 = (_ETHREAD *)KiSelectReadyThread(1i64, CurrentPrcb);
    if( v26 )
      goto LABEL_127;
    HIDWORD(v104) = 0;
    if( !KiPerfIsoEnabled
      || (v81 = **((_QWORD **)CurrentPrcb + 24) - ((**((_QWORD **)CurrentPrcb + 24) >> 1) & 0x5555555555555555i64),
          (unsigned int)((0x101010101010101i64
                        * (((v81 & 0x3333333333333333i64)
                          + ((v81 >> 2) & 0x3333333333333333i64)
                          + (((v81 & 0x3333333333333333i64) + ((v81 >> 2) & 0x3333333333333333i64)) >> 4)) & 0xF0F0F0F0F0F0F0Fi64)) >> 32) >> 24 >= KiPerfIsoEnabled)
      && ((v82 = *((_QWORD *)CurrentPrcb + 25), v83 = *((_QWORD *)CurrentPrcb + 4235), v82 == v83)
       || (v84 = v83 & ~v82, (*(_QWORD *)(*((_QWORD *)CurrentPrcb + 24) + 24i64) & v84) != 0)
       || (_BitScanForward64(&v85, v84),
           v86 = (unsigned int)KiProcessorNumberToIndexMappingTable[64 * *((unsigned __int8 *)CurrentPrcb + 208)
                                                                  + (int)v85],
           HIDWORD(v104) = v86,
           (*((_DWORD *)*(&KiProcessorBlock + v86) + 59) & 0x400) != 0)) )
    {
      v26 = 0i64;
      v27 = *((_QWORD *)CurrentPrcb + 3983);
      if( (v27 & 1) == 0 )
      {
        v28 = *((_QWORD *)CurrentPrcb + 3983);
        goto LABEL_36;
      }
      if( v27 != 1 )
      {
        v28 = v27 ^ (((unsigned __int64)CurrentPrcb + 31856) | 1);
LABEL_36:
        while( v28 )
        {
          v75 = v28 - 88;
          v26 = (_ETHREAD *)KiSelectThreadFromSchedulingGroup(CurrentPrcb, (_KSCB *)(v28 - 88), 0i64);
          if( v26 )
            break;
          v87 = *(_QWORD *)(v75 + 400);
          if( (v87 & 1) != 0 )
          {
            if( v87 == 1 )
              goto LABEL_38;
            v28 = v87 ^ ((v75 + 392) | 1);
          }
          else
          {
            v28 = *(_QWORD *)(v75 + 400);
          }
        }
        if( v26 )
          goto LABEL_127;
      }
    }
LABEL_38:
    v26 = (_ETHREAD *)KiSelectReadyThread(0i64, CurrentPrcb);
    if( !v26 )
    {
      v29 = 0;
      v30 = *((_QWORD *)CurrentPrcb + 24);
      v31 = 1;
      v32 = *((unsigned __int8 *)CurrentPrcb + 35);
      v33 = *((_QWORD *)CurrentPrcb + 4247);
      if( *((_BYTE *)CurrentPrcb + 35) == 7 )
        v29 = 1;
      if( v33 )
        *(_BYTE *)(v33 + 16) = 1;
      *((_BYTE *)CurrentPrcb + 12587) = 0;
      if( (v32 & 1) != 0 )
      {
        v34 = v32 - 1;
        *((_BYTE *)CurrentPrcb + 35) = v34;
        if( !v34 )
          _interlockedbittestandset64((volatile signed __int32 *)v30, *((unsigned __int8 *)CurrentPrcb + 209));
        _interlockedbittestandset64((volatile signed __int32 *)(v30 + 24), *((unsigned __int8 *)CurrentPrcb + 209));
        v35 = *((_QWORD *)CurrentPrcb + 4235);
        if( (v35 & *(_QWORD *)(v30 + 24)) == v35 )
        {
          _InterlockedOr64((volatile signed __int64 *)(v30 + 8), v35);
        }
        else
        {
          v66 = *((_QWORD *)CurrentPrcb + 4235) & ~*(_QWORD *)(v30 + 24);
          if( ((v66 - 1) & v66) == 0 )
            _InterlockedOr64((volatile signed __int64 *)(v30 + 16), v66);
        }
        _interlockedbittestandreset64((volatile signed __int32 *)(v30 + 16), *((unsigned __int8 *)CurrentPrcb + 209));
      }
      v36 = *((_QWORD *)CurrentPrcb + 3);
      if( (*(_BYTE *)(v36 + 2) & 4) != 0 )
      {
        KiIsThreadRankNonZero(*((_ETHREAD **)CurrentPrcb + 3), CurrentPrcb);
        v37 = 1;
        if( !v90 )
          v37 = *(_BYTE *)(v36 + 195);
        v31 = 1;
      }
      else
      {
        v37 = *(_BYTE *)(v36 + 195);
      }
      **((_BYTE **)CurrentPrcb + 7) = v37;
      if( *((_QWORD *)CurrentPrcb + 4247) )
      {
        v91 = (unsigned int)KiVpThreadSystemWorkPriority;
        if( v36 != *((_QWORD *)CurrentPrcb + 3) )
          v91 = (unsigned int)v37;
        KiSetSchedulerAssistPriority(*((volatile INT32 **)CurrentPrcb + 4247), v91, 0);
      }
      v39 = 0;
      if( (*((_BYTE *)CurrentPrcb + 35) & 2) != 0 )
        v39 = v31;
      _InterlockedAnd64((volatile signed __int64 *)CurrentPrcb + 6, 0i64);
      if( !v39 || v29 )
      {
        v40 = *((_QWORD *)CurrentPrcb + 24);
        v102 = 0;
        LODWORD(v41) = *(_DWORD *)(v40 + 128);
        HIDWORD(v105) = *(unsigned __int16 *)(v40 + 146);
LABEL_56:
        v42 = *((_BYTE *)CurrentPrcb + 209);
        v43 = *((unsigned __int8 *)CurrentPrcb + 208);
        v44 = *(_QWORD *)(v40 + 136);
        v45 = *(_QWORD *)(v40 + 152);
        v46 = v44;
        v110 = v42;
        v113 = v43;
        v103 = v45;
        if( v40 == *((_QWORD *)CurrentPrcb + 24) )
        {
          v45 ^= *((_QWORD *)CurrentPrcb + 4232);
          v44 ^= *((_QWORD *)CurrentPrcb + 25);
          v103 = v45;
          if( (KiCacheAwareScheduling & 2) != 0 )
            v46 &= *((_QWORD *)CurrentPrcb + 4237);
        }
        v47 = ~*(_QWORD *)(v40 + 24) & v44;
        while( 1 )
        {
          if( !v47 && !v45 )
          {
            v41 = (unsigned int)v41 & (unsigned __int64)~(1i64 << *(_WORD *)(v40 + 146));
            if( (_DWORD)v41 )
            {
              while( 1 )
              {
                v61 = v102 + 1;
                v102 = v61;
                if( v61 == (unsigned __int16)KeNumberNodes )
                  break;
                v62 = *(unsigned int *)(qword_140C4DBD8
                                      + 4i64 * ((unsigned int)(unsigned __int16)KeNumberNodes * HIDWORD(v105) + v61));
                if( (_DWORD)v62 == -1 )
                  break;
                v63 = (unsigned int)v41;
                if( _bittest64(&v63, v62) )
                {
                  v40 = *((_QWORD *)&KeNodeBlock + v62);
                  goto LABEL_56;
                }
              }
            }
            goto LABEL_63;
          }
          if( (v45 & v46) != 0 )
            break;
LABEL_89:
          if( (v47 & v46) != 0 )
          {
            v58 = __ROR8__(v47 & v46, v42);
            v59 = v43 << 6;
            v101 = v59;
            do
            {
              _BitScanForward64(&v60, v58);
              v58 ^= 1i64 << v60;
              v26 = (_ETHREAD *)KiSearchForNewThreadOnProcessor(
                                  CurrentPrcb,
                                  *(&KiProcessorBlock
                                  + (unsigned int)KiProcessorNumberToIndexMappingTable[v59 + (((_BYTE)v60 + v42) & 0x3F)]),
                                  0i64);
              if( v26 )
                goto LABEL_73;
              v59 = v101;
              v42 = v110;
            }
            while( v58 );
          }
          v45 = v103;
          v42 = v110;
          v47 &= ~v46;
          v46 = *(_QWORD *)(v40 + 136);
          v43 = v113;
        }
        v53 = __ROR8__(v45 & v46, v42);
        v54 = v43 << 6;
        v100 = v54;
        while( 1 )
        {
          _BitScanForward64(&v55, v53);
          v56 = (__int64)*(&KiProcessorBlock
                         + (unsigned int)KiProcessorNumberToIndexMappingTable[v54 + ((v42 + (_BYTE)v55) & 0x3F)]);
          v57 = *(_QWORD *)(v56 + 33856);
          v103 = ~v57 & v45;
          v53 &= __ROR8__(~v57, v42);
          v26 = (_ETHREAD *)KiSearchForNewThreadOnProcessor(CurrentPrcb, 0i64, *(_KSHARED_READY_QUEUE **)(v56 + 33864));
          if( v26 )
            goto LABEL_73;
          v45 = v103;
          v54 = v100;
          v42 = v110;
          if( !v53 )
          {
            v43 = v113;
            goto LABEL_89;
          }
        }
      }
LABEL_63:
      v48 = KeGetCurrentPrcb();
      LODWORD(SpinCount) = 0;
      while( _interlockedbittestandset64((volatile signed __int32 *)CurrentPrcb + 12, 0i64) )
      {
        do
          KeYieldProcessorEx(&SpinCount);
        while( *((_QWORD *)CurrentPrcb + 6) );
        v73 = *((_QWORD *)v48 + 4247);
        if( v73 && *((_BYTE *)v48 + 32) <= 1u )
        {
          v93 = *(_DWORD *)(v73 + 24) + 1;
          *(_DWORD *)(v73 + 24) = v93;
        }
      }
      v26 = (_ETHREAD *)*((_QWORD *)CurrentPrcb + 2);
      if( !v26 )
      {
        v26 = (_ETHREAD *)*((_QWORD *)CurrentPrcb + 3);
        if( !KeHeteroSystem || KeHeteroSystemVirtual )
          goto LABEL_67;
        _InterlockedAnd64((volatile signed __int64 *)CurrentPrcb + 6, 0i64);
        KiSendHeteroRescheduleIntRequest(CurrentPrcb);
        v94 = KeGetCurrentPrcb();
        HIDWORD(SpinCount) = 0;
        while( _interlockedbittestandset64((volatile signed __int32 *)CurrentPrcb + 12, 0i64) )
        {
          do
            KeYieldProcessorEx((UINT64 *)((char *)&SpinCount + 4));
          while( *((_QWORD *)CurrentPrcb + 6) );
          v95 = *((_QWORD *)v94 + 4247);
          if( v95 && *((_BYTE *)v94 + 32) <= 1u )
          {
            v96 = *(_DWORD *)(v95 + 24) + 1;
            *(_DWORD *)(v95 + 24) = v96;
          }
        }
        if( !*((_QWORD *)CurrentPrcb + 2) )
          goto LABEL_67;
        v26 = (_ETHREAD *)*((_QWORD *)CurrentPrcb + 2);
      }
      *((_QWORD *)CurrentPrcb + 2) = 0i64;
LABEL_67:
      if( (*((_BYTE *)v26 + 2) & 4) == 0 || (KiIsThreadRankNonZero(v26, CurrentPrcb), v49 = 1, !v77) )
        v49 = *((_BYTE *)v26 + 195);
      **((_BYTE **)CurrentPrcb + 7) = v49;
      if( *((_QWORD *)CurrentPrcb + 4247) )
      {
        v97 = (unsigned int)KiVpThreadSystemWorkPriority;
        if( v26 != *((_ETHREAD **)CurrentPrcb + 3) )
          v97 = (unsigned int)v49;
        KiSetSchedulerAssistPriority(*((volatile INT32 **)CurrentPrcb + 4247), v97, 0);
      }
      *((_QWORD *)CurrentPrcb + 1) = v26;
      if( *((_BYTE *)v26 + 388) == 1 )
        *((_DWORD *)v26 + 33) = *((_DWORD *)v26 + 33) - *((_DWORD *)v26 + 109) + KUSER_SHARED_DATA.TickCount.LowPart;
      *((_BYTE *)v26 + 388) = 2;
      goto LABEL_73;
    }
LABEL_127:
    if( *((_QWORD *)v26 + 71) == KiCpuSetSequence || (*((_DWORD *)v26 + 29) & 8) != 0 )
      break;
    KiEnterDeferredReadyState((INT64)v26);
    _InterlockedAnd64((volatile signed __int64 *)CurrentPrcb + 6, 0i64);
    *((_QWORD *)v26 + 27) = 0i64;
    v109 = (__int64)v26 + 216;
    KiReadyDeferredReadyList(CurrentPrcb, &v109);
    v78 = KeGetCurrentPrcb();
    LODWORD(v105) = 0;
    while( _interlockedbittestandset64((volatile signed __int32 *)CurrentPrcb + 12, 0i64) )
    {
      do
        KeYieldProcessorEx(&v105);
      while( *((_QWORD *)CurrentPrcb + 6) );
      v88 = *((_QWORD *)v78 + 4247);
      if( v88 && *((_BYTE *)v78 + 32) <= 1u )
      {
        v89 = *(_DWORD *)(v88 + 24) + 1;
        *(_DWORD *)(v88 + 24) = v89;
      }
    }
    v26 = (_ETHREAD *)*((_QWORD *)CurrentPrcb + 2);
    if( v26 )
      goto LABEL_125;
  }
  if( (*((_BYTE *)v26 + 2) & 4) == 0 || (KiIsThreadRankNonZero(v26, CurrentPrcb), v69 = 1, !v74) )
    v69 = *((_BYTE *)v26 + 195);
  **((_BYTE **)CurrentPrcb + 7) = v69;
  if( *((_QWORD *)CurrentPrcb + 4247) )
  {
    v92 = (unsigned int)KiVpThreadSystemWorkPriority;
    if( v26 != *((_ETHREAD **)CurrentPrcb + 3) )
      v92 = (unsigned int)v69;
    KiSetSchedulerAssistPriority(*((volatile INT32 **)CurrentPrcb + 4247), v92, 0);
  }
  *((_QWORD *)CurrentPrcb + 1) = v26;
  if( *((_BYTE *)v26 + 388) == 1 )
  {
LABEL_132:
    v70 = *((_DWORD *)v26 + 33) - *((_DWORD *)v26 + 109) + KUSER_SHARED_DATA.TickCount.LowPart;
    *((_DWORD *)v26 + 33) = v70;
  }
LABEL_126:
  *((_BYTE *)v26 + 388) = 2;
LABEL_73:
  if( v26 != *((_ETHREAD **)CurrentPrcb + 3) && v26 != OldThread && *((_BYTE *)v26 + 113) )
  {
    if( (*((_BYTE *)v26 + 2) & 4) == 0 || (KiIsThreadRankNonZero(v26, CurrentPrcb), v64 = 1, !v79) )
      v64 = *((_BYTE *)v26 + 195);
    **((_BYTE **)CurrentPrcb + 7) = v64;
    v65 = *((_QWORD *)CurrentPrcb + 4247);
    if( v65 )
    {
      v98 = (unsigned int)KiVpThreadSystemWorkPriority;
      if( v26 != *((_ETHREAD **)CurrentPrcb + 3) )
        v98 = (unsigned int)v64;
      KiSetSchedulerAssistPriority(*((volatile INT32 **)CurrentPrcb + 4247), v98, 0);
      v65 = *((_QWORD *)CurrentPrcb + 4247);
    }
    *((_QWORD *)CurrentPrcb + 2) = v26;
    if( v65 )
      *(_BYTE *)(v65 + 16) = v26 == *((_ETHREAD **)CurrentPrcb + 3);
    if( *((_BYTE *)v26 + 388) == 1 )
      *((_DWORD *)v26 + 33) = *((_DWORD *)v26 + 33) - *((_DWORD *)v26 + 109) + KUSER_SHARED_DATA.TickCount.LowPart;
    *((_BYTE *)v26 + 388) = 3;
    v26 = (_ETHREAD *)*((_QWORD *)CurrentPrcb + 3);
    *((_QWORD *)CurrentPrcb + 1) = v26;
    if( *((_BYTE *)v26 + 388) == 1 )
      *((_DWORD *)v26 + 33) = *((_DWORD *)v26 + 33) - *((_DWORD *)v26 + 109) + KUSER_SHARED_DATA.TickCount.LowPart;
    *((_BYTE *)v26 + 388) = 2;
  }
  _InterlockedAnd64((volatile signed __int64 *)CurrentPrcb + 6, 0i64);
  KiSetVpThreadSpinLockCount();
  v50 = *((unsigned __int8 *)OldThread + 390);
  if( OldThread == v26 )
  {
    v52 = *((_BYTE *)v26 + 193) && !*((_WORD *)v26 + 243) && !(_BYTE)v50;
    _disable();
    KiStartThreadCycleAccumulation(CurrentPrcb, (_KTHREAD *)v26, 0);
    _enable();
    if( (*((_DWORD *)v26 + 30) & 0x800) != 0 )
    {
      _interlockedbittestandreset((volatile signed __int32 *)v26 + 30, 0xBu);
      KiInsertDeferredPreemptionApc(CurrentPrcb, (_KTHREAD *)v26, 0);
    }
  }
  else
  {
    v51 = 0;
    if( (*((_DWORD *)OldThread + 30) & 0x400000) != 0
      && *((_BYTE *)OldThread + 388) == 5
      && *((_BYTE *)OldThread + 793) )
    {
      LODWORD(v107) = 0;
      while( 1 )
      {
        KiSetVpThreadSpinLockCount();
        if( !_interlockedbittestandset64((volatile signed __int32 *)OldThread + 16, 0i64) )
          break;
        KiSetVpThreadSpinLockCount();
        do
          KeYieldProcessorEx(&v107);
        while( *((_QWORD *)OldThread + 8) );
      }
      if( (*((_DWORD *)OldThread + 30) & 0x400000) != 0 && *((_BYTE *)OldThread + 388) == 5 )
      {
        KiUpdateVpBackingRequiresPriorityKickState((INT64)OldThread, 1);
        KiUpdateVPBackingThreadPriority(v99);
        v51 = 1;
      }
      KiReleaseThreadLockSafe((INT64)OldThread);
    }
    v52 = KiSwapContext((PKTHREAD)OldThread, (PKTHREAD)v26);
    if( v51 )
      KiUpdateVpBackingRequiresPriorityKickState((INT64)OldThread, 0);
  }
  if( _bittestandreset((signed __int32 *)OldThread + 29, 9u)
    && !KiCancelTimer((_KTIMER *)((char *)OldThread + 256), 1u) )
  {
    *((_BYTE *)OldThread + 481) = 4;
    *((_QWORD *)OldThread + 33) = (char *)OldThread + 464;
    *((_QWORD *)OldThread + 34) = (char *)OldThread + 464;
  }
  if( v112 )
    *v112 = *((_QWORD *)OldThread + 122);
  if( v52 )
  {
    __writecr8(1ui64);
    KiDeliverApc(0, 0i64, 0i64);
  }
  __writecr8(v50);
}

Referenced by:

KeTerminateThread
KiCommitThreadWait
KiInSwapSingleProcess