KiDeferredReadySingleThread

VOID __fastcall KiDeferredReadySingleThread(INT64 a1, INT64 a2, INT64 a3){
  unsigned __int64 v3; 
  bool v4; 
  char v6; 
  struct _KPRCB *CurrentPrcb; 
  char v8; 
  char v9; 
  unsigned __int8 v10; 
  unsigned int v11; 
  int v12; 
  char v13; 
  char v14; 
  int v15; 
  int v16; 
  char v17; 
  unsigned int v18; 
  bool v19; 
  char v20; 
  unsigned __int8 v21; 
  unsigned __int16 Group; 
  unsigned __int64 Mask; 
  _KPRCB *v24; 
  _KPRCB *v25; 
  _KPRCB *v26; 
  __int64 v27; 
  _KSCB *ThreadScb; 
  __int64 v29; 
  char v30; 
  char v31; 
  __int64 v32; 
  int v33; 
  __int64 v34; 
  int v35; 
  unsigned int v36; 
  int v37; 
  __int64 v38; 
  struct _KPRCB *v39; 
  void(__fastcall *v40)(_QWORD, int *, __int128 *, __int64, char *); 
  int *v41; 
  char v42; 
  unsigned __int64 v43; 
  char v44; 
  unsigned __int8 v45; 
  char v46; 
  unsigned int v47; 
  _KPRCB *v48; 
  char v49; 
  char v50; 
  char v51; 
  int v52; 
  _KPRCB *v53; 
  unsigned __int64 v54; 
  INT64 v55; 
  INT64 v56; 
  char v57; 
  char v58; 
  char v59; 
  __int64 v60; 
  int v61; 
  __int64 v62; 
  struct _KPRCB *v63; 
  int *v64; 
  unsigned __int64 v65; 
  char v66; 
  _KPRCB *v67; 
  _KSCB *v68; 
  __int64 v69; 
  char v70; 
  unsigned int v71; 
  _KSCB *v72; 
  char v73; 
  char v74; 
  int v75; 
  char v76; 
  __int64 v77; 
  _KSCB *v78; 
  int v79; 
  int v80; 
  char v81; 
  char v82; 
  __int64 v83; 
  INT64 v84; 
  unsigned int v85; 
  _QWORD *v86; 
  _QWORD *v87; 
  char v88; 
  int GuestSchedulerAssistPriority; 
  int v90; 
  int v91; 
  int v92; 
  INT64 v93; 
  char v94; 
  INT64 v95; 
  char v96; 
  char v97; 
  unsigned __int8 v98; 
  char v99; 
  int v100; 
  unsigned int v101; 
  unsigned __int8 v102; 
  char v103; 
  char v104; 
  char v105; 
  _QWORD *v106; 
  _QWORD *v107; 
  _QWORD *v108; 
  _QWORD *v109; 
  __int64 v110; 
  __int64 v111; 
  unsigned __int64 v112; 
  INT64 v113; 
  int v114; 
  int v115; 
  __int64 v116; 
  __int64 v117; 
  INT64 v118; 
  INT64 v119; 
  int v120; 
  int v121; 
  INT64 v122; 
  INT64 v123; 
  UINT8 ShareRankNonZero[4]; 
  unsigned int a3a; 
  char a3_4; 
  char Idle[12]; 
  UINT64 Preempted; 
  _KSCB *NewScb; 
  _GROUP_AFFINITY Affinity; 
  UINT64 SpinCount; 
  int v132; 
  UINT64 v133; 
  UINT64 v134; 
  int v135; 
  int v136[2]; 
  INT64 v137; 
  __int128 v138; 
  __int64 v139; 
  __int128 v140; 
  __int64 v141; 
  __int128 v142; 
  __int64 v143; 
  INT64 result[22]; 
  int v145; 
  v3 = *(_QWORD *)(a2 + 72);
  v4 = *(_BYTE *)(a2 + 566) == 1;
  v137 = a3;
  *(_QWORD *)&Idle[4] = a1;
  Affinity = 0i64;
  *(_DWORD *)Idle = 0;
  NewScb = 0i64;
  LODWORD(Preempted) = 0;
  if( v4 )
    v6 = *(_BYTE *)(a2 + 567);
  else
    v6 = 0;
  CurrentPrcb = KeGetCurrentPrcb();
  LODWORD(SpinCount) = 0;
  while( _interlockedbittestandset64((volatile signed __int32 *)(a2 + 64), 0i64) )
  {
    do
      KeYieldProcessorEx(&SpinCount);
    while( *(_QWORD *)(a2 + 64) );
    v77 = *((_QWORD *)CurrentPrcb + 4247);
    if( v77 && *((_BYTE *)CurrentPrcb + 32) <= 1u )
      ++*(_DWORD *)(v77 + 24);
  }
  if( (*(_DWORD *)(a2 + 120) & 0x400000) == 0 )
  {
    v8 = 0;
    goto LABEL_7;
  }
  _InterlockedOr(*(volatile signed __int32 **)(a2 + 968), 0x100000u);
  GuestSchedulerAssistPriority = KiReadGuestSchedulerAssistPriority(a2);
  v90 = GuestSchedulerAssistPriority;
  v91 = 32;
  if( GuestSchedulerAssistPriority >= 16 )
  {
    v91 = GuestSchedulerAssistPriority;
    v90 = 15;
  }
  v92 = *(_DWORD *)(a2 + 1024);
  if( v90 != v92 )
  {
    v93 = (char)v90 + a2;
    v94 = *(_BYTE *)(v93 + 824);
    if( v94 == -1 )
      KeBugCheckEx(0x157u, a2, (char)v90, 1ui64, 0i64);
    *(_BYTE *)(v93 + 824) = v94 + 1;
    *(_DWORD *)(a2 + 856) |= 1 << v90;
    if( v92 != 32 )
    {
      v95 = (char)v92 + a2;
      v96 = *(_BYTE *)(v95 + 824);
      if( !v96 )
        KeBugCheckEx(0x157u, a2, (char)v92, 2ui64, 0i64);
      v97 = v96 - 1;
      *(_BYTE *)(v95 + 824) = v97;
      if( !v97 )
        *(_DWORD *)(a2 + 856) ^= 1 << v92;
    }
    *(_DWORD *)(a2 + 1024) = v90;
  }
  v98 = v91;
  if( v91 == 32 )
    v98 = v90;
  v99 = KiComputePriorityFloor(a2, v98);
  v100 = *(char *)(a2 + 195);
  v101 = v99;
  if( (*(_BYTE *)(a2 + 564) & 0xF0) != 0 )
  {
    if( v99 <= v100 )
      goto LABEL_233;
    goto LABEL_232;
  }
  if( v99 != v100 )
  {
LABEL_232:
    KiSetBasePriorityAndClearDecrement((_KTHREAD *)a2, 0i64, 0i64);
    KiUpdateThreadPriority(0i64, (_KTHREAD *)a2, v101, 0);
  }
LABEL_233:
  if( (*(_DWORD *)(a2 + 120) & 0x400000) != 0 )
    _InterlockedAnd(*(volatile signed __int32 **)(a2 + 968), 0xFFEFFFFF);
  v8 = 1;
LABEL_7:
  v9 = *(_BYTE *)(a2 + 566);
  if( !v9 )
  {
    if( v3 < *(_QWORD *)(a2 + 32) )
    {
      LODWORD(Preempted) = *(unsigned __int8 *)(a2 + 565);
      goto LABEL_27;
    }
    v42 = KiComputeNewPriority(a2, 1);
    if( !v8 )
      KiUpdateThreadPriority(0i64, (_KTHREAD *)a2, (unsigned int)v42, 0);
    KiTryScheduleNextForegroundBoost(a2);
    goto LABEL_71;
  }
  if( *(char *)(a2 + 195) < 16 )
  {
    v10 = 0;
    v11 = KUSER_SHARED_DATA.TickCount.LowPart - *(_DWORD *)(a2 + 436);
    if( v3 >= *(_QWORD *)(a2 + 32) )
    {
      v10 = 4;
      if( v11 < 2 )
        v10 = 5;
    }
    if( v10 >= 4u || *(char *)(a2 + 563) >= 14 || v11 >= 2 && !*(_BYTE *)(a2 + 564) )
    {
      v44 = *(_BYTE *)(a2 + 195);
      v10 |= 8u;
      if( v44 < 16 )
      {
        if( KiForegrounBoostVelocityFlag
          && *(_BYTE *)(*(_QWORD *)(a2 + 544) + 1850i64) == 2
          && (v102 = *(_BYTE *)(a2 + 564), v103 = v102 & 0xF, (v102 & 0xF) != 0 && (*(_DWORD *)(a2 + 120) & 8) == 0) )
        {
          v104 = v103 + *(_BYTE *)(a2 + 563);
          *(_BYTE *)(a2 + 564) = v103;
          v105 = v44 - (v102 >> 4) - 1;
          v44 = v104;
          if( v105 >= v104 )
            v44 = v105;
        }
        else
        {
          v45 = *(_BYTE *)(a2 + 564);
          v46 = *(_BYTE *)(a2 + 563);
          if( (char)(v44 - (v45 >> 4) - (v45 & 0xF) - 1) >= v46 )
            v46 = v44 - (*(_BYTE *)(a2 + 564) >> 4) - (v45 & 0xF) - 1;
          v44 = v46;
          if( v45 )
          {
            if( (v45 & 0xF) != 0 )
              *(_DWORD *)(a2 + 872) = KUSER_SHARED_DATA.TickCount.LowPart;
            *(_BYTE *)(a2 + 564) = 0;
          }
        }
        v47 = *(_DWORD *)(a2 + 856);
        HIDWORD(SpinCount) = 0;
        if( v47 )
        {
          _BitScanReverse((unsigned int *)&v80, v47);
          if( v44 < v80 )
            v44 = v80;
          HIDWORD(SpinCount) = v80;
        }
      }
      if( !v8 )
      {
        v48 = KeGetCurrentPrcb();
        if( v44 > *(char *)(a2 + 195) )
        {
          if( *(_BYTE *)(a2 + 793) )
          {
            v106 = (_QWORD *)(a2 + 808);
            if( *(_QWORD *)(a2 + 808) == 1i64 )
            {
              v107 = (_QWORD *)((char *)v48 + 34680);
              if( v48 != (_KPRCB *)-34680i64 )
              {
                *v106 = *v107;
                *v107 = v106;
                _InterlockedIncrement16((volatile signed __int16 *)(a2 + 868));
                KiAbQueueAutoBoostDpc(v48);
              }
            }
          }
        }
        v4 = (*(_DWORD *)(a2 + 120) & 0x400000) == 0;
        *(_BYTE *)(a2 + 195) = v44;
        if( !v4 )
          KiSetSchedulerAssistPriority(*(volatile INT32 **)(a2 + 968), (unsigned int)v44, 1);
      }
    }
    if( *(_BYTE *)(*(_QWORD *)(a2 + 544) + 1850i64) == 2 )
      v10 |= 2u;
    if( ((unsigned __int8)~v10 & ((*(_DWORD *)(a2 + 120) & 8) == 0)) != 0 )
    {
      v12 = *(char *)(a2 + 195);
      if( *(char *)(a2 + 195) > 0 )
      {
        v13 = *(_BYTE *)(a2 + 564);
        if( !v13 )
        {
          v14 = v10 >> 1;
LABEL_19:
          v15 = *(char *)(a2 + 563);
          v16 = v15 + v6;
          if( (v14 & 1) != 0 )
            v16 += (char)PsPrioritySeparation;
          if( v16 >= 16 )
            v16 = 15;
          if( v16 > v12 )
          {
            v66 = 0;
            if( v16 > v15 + v6 )
              v66 = v16 - v15 - v6;
            *(_BYTE *)(a2 + 564) = v13 ^ (v66 ^ v13) & 0xF;
            v67 = KeGetCurrentPrcb();
            if( (char)v16 > (char)v12 )
            {
              if( *(_BYTE *)(a2 + 793) )
              {
                v86 = (_QWORD *)(a2 + 808);
                if( *(_QWORD *)(a2 + 808) == 1i64 )
                {
                  v87 = (_QWORD *)((char *)v67 + 34680);
                  if( v67 != (_KPRCB *)-34680i64 )
                  {
                    *v86 = *v87;
                    *v87 = v86;
                    _InterlockedIncrement16((volatile signed __int16 *)(a2 + 868));
                    KiAbQueueAutoBoostDpc(v67);
                  }
                }
              }
            }
            v4 = (*(_DWORD *)(a2 + 120) & 0x400000) == 0;
            *(_BYTE *)(a2 + 195) = v16;
            if( !v4 )
              KiSetSchedulerAssistPriority(*(volatile INT32 **)(a2 + 968), (unsigned int)(char)v16, 1);
          }
LABEL_24:
          v9 = *(_BYTE *)(a2 + 566);
          v17 = v10 >> 3;
          goto LABEL_25;
        }
        if( (v13 & 0xF0) == 0 )
        {
          v14 = v10 >> 1;
          if( (v10 & 2) != 0 )
            goto LABEL_19;
        }
      }
    }
    if( !KiForegrounBoostVelocityFlag && (v10 & 6) == 6 && (*(_DWORD *)(a2 + 120) & 8) == 0 && *(char *)(a2 + 195) > 0 )
      KiScheduleNextForegroundBoost(a2);
    goto LABEL_24;
  }
  v17 = 1;
LABEL_25:
  if( v9 != 2 )
    goto LABEL_26;
  v49 = *(_BYTE *)(a2 + 195);
  if( v49 > 0 )
  {
    v50 = *(_BYTE *)(a2 + 567);
    if( v49 < v50 && v49 < 13 && (*(_DWORD *)(a2 + 120) & 8) == 0 )
    {
      v51 = 13;
      v52 = *(_DWORD *)(a2 + 120);
      if( v50 < 13 )
        v51 = *(_BYTE *)(a2 + 567);
      *(_BYTE *)(a2 + 564) += 16 * (v51 - v49);
      v53 = KeGetCurrentPrcb();
      if( v51 > v49 )
      {
        if( *(_BYTE *)(a2 + 793) )
        {
          v108 = (_QWORD *)(a2 + 808);
          if( *(_QWORD *)(a2 + 808) == 1i64 )
          {
            v109 = (_QWORD *)((char *)v53 + 34680);
            if( v53 != (_KPRCB *)-34680i64 )
            {
              *v108 = *v109;
              *v109 = v108;
              _InterlockedIncrement16((volatile signed __int16 *)(a2 + 868));
              KiAbQueueAutoBoostDpc(v53);
              v52 = *(_DWORD *)(a2 + 120);
            }
          }
        }
      }
      *(_BYTE *)(a2 + 195) = v51;
      if( (v52 & 0x400000) != 0 )
        KiSetSchedulerAssistPriority(*(volatile INT32 **)(a2 + 968), (unsigned int)v51, 1);
      v54 = *(_QWORD *)(a2 + 32);
      if( v3 > v54 || v54 - v3 < (unsigned int)KiLockQuantumTarget )
        *(_QWORD *)(a2 + 32) = v3 + (unsigned int)KiLockQuantumTarget;
LABEL_26:
      if( !v17 )
        goto LABEL_27;
      goto LABEL_71;
    }
  }
  if( v17 )
  {
LABEL_71:
    v43 = v3 + KiCyclesPerClockQuantum * (unsigned int)*(unsigned __int8 *)(a2 + 651);
    if( (*(_DWORD *)(a2 + 120) & 0x20) != 0 )
      _interlockedbittestandreset((volatile signed __int32 *)(a2 + 120), 5u);
    *(_QWORD *)(a2 + 32) = v43;
    goto LABEL_27;
  }
  v65 = *(_QWORD *)(a2 + 32);
  if( v3 > v65 || v65 - v3 < (unsigned int)KiLockQuantumTarget )
    *(_QWORD *)(a2 + 32) = v3 + (unsigned int)KiLockQuantumTarget;
LABEL_27:
  v18 = *(_DWORD *)(a2 + 588);
  a3a = v18;
  *(_WORD *)(a2 + 565) = 0;
  v19 = *(_DWORD *)(a2 + 484) || *(_BYTE *)(a2 + 390) == 1;
  v20 = 0;
  v21 = _bittestandreset((signed __int32 *)(a2 + 116), 1u);
  if( *(_QWORD *)(a2 + 568) != KiCpuSetSequence && (*(_DWORD *)(a2 + 116) & 8) == 0 )
    KiComputeThreadAffinity((_KTHREAD *)a2);
  Group = *(_WORD *)(a2 + 584);
  Mask = *(_QWORD *)(a2 + 576);
  Affinity.Group = Group;
  Affinity.Mask = Mask;
  if( KiForceIdleDisabled )
    goto LABEL_34;
  if( (_DWORD)KiForceIdleState != 4 )
  {
    Group = Affinity.Group;
    Mask = Affinity.Mask;
LABEL_34:
    if( ((Mask - 1) & Mask) != 0 )
    {
      if( *(_BYTE *)(a2 + 125) )
      {
        v25 = KiHeteroChooseTargetProcessor(*(_KPRCB **)&Idle[4], (_KTHREAD *)a2, &Affinity, (UINT64 *)Idle);
      }
      else
      {
        v24 = *(_KPRCB **)&Idle[4];
        if( KiPerfIsoEnabled && KiIsThreadRankBiased(a2, *(struct _KPRCB **)&Idle[4]) && !v19 )
          v20 = 1;
        v25 = KiChooseTargetProcessor(v24, (_KTHREAD *)a2, &Affinity, (UINT64 *)Idle);
      }
    }
    else
    {
      _BitScanReverse64(&Mask, Mask);
      HIDWORD(v133) = Mask;
      LODWORD(v134) = 0;
      v25 = *(&KiProcessorBlock + (unsigned int)KiProcessorNumberToIndexMappingTable[64 * Group + (unsigned int)Mask]);
      while( 1 )
      {
        KiSetVpThreadSpinLockCount();
        if( !_interlockedbittestandset64((volatile signed __int32 *)v25 + 12, 0i64) )
          break;
        KiSetVpThreadSpinLockCount();
        do
          KeYieldProcessorEx(&v134);
        while( *((_QWORD *)v25 + 6) );
      }
      v75 = *(_DWORD *)Idle;
      if( (*((_BYTE *)v25 + 35) & 1) == 0 )
        v75 = 1;
      *(_DWORD *)Idle = v75;
    }
    v27 = *((unsigned int *)v25 + 9);
    *(_DWORD *)(a2 + 536) = v27;
    ThreadScb = *(_KSCB **)(a2 + 104);
    if( ThreadScb )
      ThreadScb = (_KSCB *)((char *)ThreadScb + *((unsigned int *)v25 + 54));
    NewScb = ThreadScb;
    if( ThreadScb )
    {
      v72 = ThreadScb;
      while( (*((_BYTE *)v72 + 112) & 2) == 0 )
      {
        v72 = v72->Parent;
        if( !v72 )
          goto LABEL_41;
      }
      if( !v19 )
        goto LABEL_139;
    }
LABEL_41:
    if( *(_DWORD *)Idle )
    {
      v29 = *((_QWORD *)v25 + 2);
      if( v29 && v29 != *((_QWORD *)v25 + 3) )
        __fastfail(0x1Eu);
      v30 = 2;
      if( v21 )
        v30 = 6;
      if( (*(_BYTE *)(a2 + 2) & 4) == 0 || (KiIsThreadRankNonZero((_ETHREAD *)a2, v25), v31 = 1, !v74) )
        v31 = *(_BYTE *)(a2 + 195);
      **((_BYTE **)v25 + 7) = v31;
      if( *((_QWORD *)v25 + 4247) )
      {
        v113 = (unsigned int)KiVpThreadSystemWorkPriority;
        if( a2 != *((_QWORD *)v25 + 3) )
          v113 = (unsigned int)v31;
        KiSetSchedulerAssistPriority(*((volatile INT32 **)v25 + 4247), v113, 0);
      }
      *((_QWORD *)v25 + 2) = a2;
      v32 = *((_QWORD *)v25 + 4247);
      if( v32 )
        *(_BYTE *)(v32 + 16) = a2 == *((_QWORD *)v25 + 3);
      if( *(_BYTE *)(a2 + 388) == 1 || (v30 & 4) != 0 )
        *(_DWORD *)(a2 + 132) = *(_DWORD *)(a2 + 132) - *(_DWORD *)(a2 + 436) + KUSER_SHARED_DATA.TickCount.LowPart;
      *(_BYTE *)(a2 + 388) = 3;
      v33 = *((unsigned __int8 *)v25 + 35);
      v34 = *((_QWORD *)v25 + 24);
      *((_BYTE *)v25 + 12587) = 0;
      if( (v33 & 1) != 0 )
        __fastfail(0x21u);
      v35 = v33 + 1;
      *((_BYTE *)v25 + 35) = v35;
      if( v35 == 1 )
        _interlockedbittestandreset64((volatile signed __int32 *)v34, *((unsigned __int8 *)v25 + 209));
      _interlockedbittestandreset64((volatile signed __int32 *)(v34 + 24), *((unsigned __int8 *)v25 + 209));
      _InterlockedAnd64((volatile signed __int64 *)(v34 + 8), ~*((_QWORD *)v25 + 4235));
      _InterlockedAnd64((volatile signed __int64 *)(v34 + 16), ~*((_QWORD *)v25 + 4235));
      if( (*((_QWORD *)v25 + 4235) & ~*(_QWORD *)(v34 + 24)) == *((_QWORD *)v25 + 25) )
        _interlockedbittestandset64((volatile signed __int32 *)(v34 + 16), *((unsigned __int8 *)v25 + 209));
      _InterlockedAnd64((volatile signed __int64 *)v25 + 6, 0i64);
      KiSetVpThreadSpinLockCount();
      v36 = *(_DWORD *)(a2 + 588);
      v37 = *(char *)(a2 + 195);
      *(_QWORD *)(a2 + 64) = 0i64;
      v38 = *(_QWORD *)&Idle[4];
      if( v25 != *(_KPRCB **)&Idle[4] && *((_BYTE *)v25 + 7) )
      {
        v39 = KeGetCurrentPrcb();
        v140 = 0i64;
        LODWORD(v140) = 6;
        ++*((_DWORD *)v39 + 8501);
        v141 = 0i64;
        DWORD2(v140) = v27;
        memset((INT64)result, 0i64);
        v142 = *(_OWORD *)(HalpInterruptTargets + 24 * v27);
        v143 = *(_QWORD *)(HalpInterruptTargets + 24 * v27 + 16);
        HIDWORD(v134) = -1;
        v135 = 1;
        v136[1] = *(_DWORD *)(HalpInterruptIpiLines + 20);
        v136[0] = *(_DWORD *)(HalpInterruptIpiLines + 16);
        v40 = *(void(__fastcall **)(_QWORD, int *, __int128 *, __int64, char *))(HalpInterruptController + 120);
        _disable();
        v40(*(_QWORD *)(HalpInterruptController + 16), v136, &v142, 47i64, (char *)&v134 + 4);
        if( (v145 & 0x200) != 0 )
          _enable();
        v38 = *(_QWORD *)&Idle[4];
      }
      if( (KiVelocityFlags & 2) == 0 )
        goto LABEL_64;
      v41 = (int *)*((_QWORD *)v25 + 4247);
      if( !v41 )
        goto LABEL_64;
      if( !*(_QWORD *)(v38 + 33976) )
        goto LABEL_64;
      if( (_KPRCB *)v38 == v25 )
        goto LABEL_64;
      if( v37 < 8 )
        goto LABEL_64;
      v114 = *v41;
      v115 = *v41 & 0x40000;
      if( (v114 & 0x100000) == 0 && (!v115 || (unsigned __int8)v114 >= v37) )
        goto LABEL_64;
      v4 = HvlpVirtualProcessorsIdentityMapped == 0;
      v116 = *(_QWORD *)(v38 + 33976);
      *(_DWORD *)(v116 + 12) = 2;
      v117 = *((unsigned int *)v25 + 9);
      if( !v4 )
      {
LABEL_273:
        *(_DWORD *)(v116 + 8) = v117;
        __writemsr(0x400000C2u, (unsigned int)v117);
LABEL_64:
        if( (xmmword_140CFB490 & 0x8000000) == 0 )
          return;
        v123 = a3a;
        v122 = v36;
LABEL_292:
        EtwTraceIdealProcessor(a2, 0x546u, v123, v122);
        return;
      }
LABEL_272:
      LODWORD(v117) = (unsigned __int8)byte_140CFF6C1[2 * v117] | ((unsigned __int8)HvlpVirtualProcessorMapping[2 * v117] << 6);
      goto LABEL_273;
    }
    if( v20 )
      goto LABEL_139;
    v55 = *((_QWORD *)v25 + 2);
    if( !v55 )
    {
      v56 = *((_QWORD *)v25 + 1);
      if( v56 == a2 )
      {
        KiUpdateVPBackingThreadPriority((PVOID)a2);
      }
      else
      {
        v4 = (*(_DWORD *)(v56 + 120) & 0x400000) == 0;
        a3_4 = 0;
        if( !v4 && KiTryToAcquireThreadLock(v56, &a3_4) )
        {
          if( (*(_DWORD *)(v56 + 120) & 0x400000) != 0 )
            KiUpdateVPBackingThreadPriority((PVOID)v56);
          KiReleaseThreadLockSafe(v56);
        }
      }
      if( !KiGroupSchedulingEnabled )
      {
        if( *(_BYTE *)(a2 + 195) > *(_BYTE *)(v56 + 195) )
        {
LABEL_104:
          if( *(_BYTE *)(v56 + 388) == 2 )
            *(_BYTE *)(v56 + 565) = 1;
          v58 = 2;
          if( v21 )
            v58 = 6;
          if( (*(_BYTE *)(a2 + 2) & 4) == 0 || (KiIsThreadRankNonZero((_ETHREAD *)a2, v25), v59 = 1, !v76) )
            v59 = *(_BYTE *)(a2 + 195);
          **((_BYTE **)v25 + 7) = v59;
          if( *((_QWORD *)v25 + 4247) )
          {
            v119 = (unsigned int)KiVpThreadSystemWorkPriority;
            if( a2 != *((_QWORD *)v25 + 3) )
              v119 = (unsigned int)v59;
            KiSetSchedulerAssistPriority(*((volatile INT32 **)v25 + 4247), v119, 0);
          }
          *((_QWORD *)v25 + 2) = a2;
          v60 = *((_QWORD *)v25 + 4247);
          if( v60 )
            *(_BYTE *)(v60 + 16) = a2 == *((_QWORD *)v25 + 3);
          if( *(_BYTE *)(a2 + 388) == 1 || (v58 & 4) != 0 )
            *(_DWORD *)(a2 + 132) = *(_DWORD *)(a2 + 132) - *(_DWORD *)(a2 + 436) + KUSER_SHARED_DATA.TickCount.LowPart;
          *(_BYTE *)(a2 + 388) = 3;
          _InterlockedAnd64((volatile signed __int64 *)v25 + 6, 0i64);
          KiSetVpThreadSpinLockCount();
          v36 = *(_DWORD *)(a2 + 588);
          v61 = *(char *)(a2 + 195);
          *(_QWORD *)(a2 + 64) = 0i64;
          v62 = *(_QWORD *)&Idle[4];
          if( *(_KPRCB **)&Idle[4] == v25 )
            goto LABEL_64;
          v63 = KeGetCurrentPrcb();
          v138 = 0i64;
          LODWORD(v138) = 6;
          ++*((_DWORD *)v63 + 8501);
          v139 = 0i64;
          DWORD2(v138) = v27;
          HalpInterruptSendIpi(&v138, 0x2Fu);
          if( (KiVelocityFlags & 2) == 0 )
            goto LABEL_64;
          v64 = (int *)*((_QWORD *)v25 + 4247);
          if( !v64 )
            goto LABEL_64;
          if( !*(_QWORD *)(v62 + 33976) )
            goto LABEL_64;
          if( v61 < 8 )
            goto LABEL_64;
          v120 = *v64;
          v121 = *v64 & 0x40000;
          if( (v120 & 0x100000) == 0 && (!v121 || (unsigned __int8)v120 >= v61) )
            goto LABEL_64;
          v4 = HvlpVirtualProcessorsIdentityMapped == 0;
          v116 = *(_QWORD *)(v62 + 33976);
          *(_DWORD *)(v116 + 12) = 2;
          v117 = *((unsigned int *)v25 + 9);
          if( !v4 )
            goto LABEL_273;
          goto LABEL_272;
        }
        goto LABEL_139;
      }
      KiEvaluateGroupSchedulingPreemption(v25, (_ETHREAD *)v56, (_ETHREAD *)a2, &NewScb);
      if( v57 )
        goto LABEL_104;
      goto LABEL_157;
    }
    KiTryToUpdateVPBackingThreadPriority(*((PVOID *)v25 + 2));
    if( KiGroupSchedulingEnabled )
    {
      KiEvaluateGroupSchedulingPreemption(v25, (_ETHREAD *)v55, (_ETHREAD *)a2, &NewScb);
      if( !v73 )
      {
LABEL_157:
        ThreadScb = NewScb;
LABEL_139:
        v18 = a3a;
        goto LABEL_140;
      }
    }
    else if( *(_BYTE *)(a2 + 195) <= *(_BYTE *)(v55 + 195) )
    {
      goto LABEL_139;
    }
    *(_BYTE *)(v55 + 565) = 1;
    v81 = 2;
    if( v21 )
      v81 = 6;
    if( (*(_BYTE *)(a2 + 2) & 4) == 0 || (KiIsThreadRankNonZero((_ETHREAD *)a2, v25), v82 = 1, !v88) )
      v82 = *(_BYTE *)(a2 + 195);
    **((_BYTE **)v25 + 7) = v82;
    if( *((_QWORD *)v25 + 4247) )
    {
      v118 = (unsigned int)KiVpThreadSystemWorkPriority;
      if( a2 != *((_QWORD *)v25 + 3) )
        v118 = (unsigned int)v82;
      KiSetSchedulerAssistPriority(*((volatile INT32 **)v25 + 4247), v118, 0);
    }
    *((_QWORD *)v25 + 2) = a2;
    v83 = *((_QWORD *)v25 + 4247);
    if( v83 )
      *(_BYTE *)(v83 + 16) = a2 == *((_QWORD *)v25 + 3);
    if( *(_BYTE *)(a2 + 388) == 1 || (v81 & 4) != 0 )
      *(_DWORD *)(a2 + 132) = *(_DWORD *)(a2 + 132) - *(_DWORD *)(a2 + 436) + KUSER_SHARED_DATA.TickCount.LowPart;
    v84 = v137;
    *(_BYTE *)(a2 + 388) = 3;
    KiInsertDeferredReadyList(v84, v55);
    _InterlockedAnd64((volatile signed __int64 *)v25 + 6, 0i64);
    KiSetVpThreadSpinLockCount();
    v36 = *(_DWORD *)(a2 + 588);
    v85 = *(char *)(a2 + 195);
    KiReleaseThreadLockSafe(a2);
    KiHvEnlightenedGuestPriorityKick(*(INT64 *)&Idle[4], (INT64)v25, v85);
    goto LABEL_64;
  }
  v110 = *(unsigned int *)(a2 + 536);
  LODWORD(v110) = v110 & 0x7FFFFFFF;
  v25 = *(&KiProcessorBlock + v110);
  if( !KiPrcbInGroupAffinity((__int64)v25, (__int64)&Affinity) )
  {
    _BitScanReverse64(&v112, Affinity.Mask);
    v132 = v112;
    v110 = *(unsigned int *)(v111 + 4i64 * ((unsigned int)v112 + (Affinity.Group << 6)) + 13631696);
    v25 = *(_KPRCB **)(v111 + 8 * v110 + 13618368);
  }
  LODWORD(v133) = 0;
  while( 1 )
  {
    KiSetVpThreadSpinLockCount();
    if( !_interlockedbittestandset64((volatile signed __int32 *)v25 + 12, 0i64) )
      break;
    KiSetVpThreadSpinLockCount();
    do
      KeYieldProcessorEx(&v133);
    while( *((_QWORD *)v25 + 6) );
  }
  *(_DWORD *)(a2 + 536) = v110;
  ThreadScb = (_KSCB *)KiGetThreadScb(a2, (INT64)v25, 0i64);
  NewScb = ThreadScb;
LABEL_140:
  v68 = ThreadScb;
  if( !v21 )
  {
    ThreadScb = NewScb;
    *(_DWORD *)(a2 + 436) = KUSER_SHARED_DATA.TickCount.LowPart;
  }
  if( !ThreadScb )
  {
    v68 = *(_KSCB **)(a2 + 104);
    if( v68 )
      v68 = (_KSCB *)((char *)v68 + *((unsigned int *)v25 + 54));
  }
  v69 = *((_QWORD *)v25 + 4247);
  if( v69 )
    *(_BYTE *)(v69 + 16) = 0;
  v70 = 0;
  *(_BYTE *)(a2 + 388) = 1;
  ShareRankNonZero[0] = 0;
  if( !v68 || (*(_DWORD *)(a2 + 120) & 0xC00) != 0 )
    goto LABEL_148;
  KiGetThreadEffectiveRankNonZero((_ETHREAD *)a2, v68, v26, 0, ShareRankNonZero);
  if( !v79 )
  {
    v70 = ShareRankNonZero[0];
LABEL_148:
    KiAddThreadToPrcbQueue((__int64)v25, a2, *(char *)(a2 + 195), Preempted, v70);
    goto LABEL_149;
  }
  KiAddThreadToScbQueue(v25, v78, (_KTHREAD *)a2, (unsigned int)Preempted);
LABEL_149:
  _InterlockedAnd64((volatile signed __int64 *)v25 + 6, 0i64);
  KiSetVpThreadSpinLockCount();
  v71 = *(_DWORD *)(a2 + 588);
  *(_QWORD *)(a2 + 64) = 0i64;
  if( (xmmword_140CFB490 & 0x8000000) != 0 )
  {
    v122 = v71;
    v123 = v18;
    goto LABEL_292;
  }
}

Referenced by:

KiAbProcessContextSwitch
KiExitDispatcher
KiReadyDeferredReadyList
KiReadyThread