KiDeferredReadySingleThread

VOID __stdcall KiDeferredReadySingleThread(INT64 rcx0, ULONG_PTR a2, INT64 r8_0){
  unsigned __int64 v3; 
  bool v4; 
  INT64 v5; 
  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; 
  int v18; 
  bool v19; 
  char v20; 
  unsigned __int8 v21; 
  unsigned __int16 Group; 
  unsigned __int64 Mask; 
  _KPRCB *v24; 
  _KPRCB *v25; 
  _KPRCB *v26; 
  __int64 Number; 
  _KSCB *ThreadScb; 
  _ETHREAD *NextThread; 
  char v30; 
  char v31; 
  _BYTE *v32; 
  int IdleState; 
  _KNODE *ParentNode; 
  int v35; 
  int v36; 
  int v37; 
  _KPRCB *v38; 
  struct _KPRCB *v39; 
  void(__fastcall *v40)(_QWORD, int *, __int128 *, __int64, char *); 
  int *v41; 
  INT8 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; 
  _ETHREAD *v55; 
  INT64 CurrentThread; 
  char v57; 
  char v58; 
  char v59; 
  _BYTE *v60; 
  int v61; 
  __int64 v62; 
  struct _KPRCB *v63; 
  int *v64; 
  unsigned __int64 v65; 
  char v66; 
  _KPRCB *v67; 
  _KSCB *v68; 
  _BYTE *v69; 
  UINT8 ShareRankNonZero; 
  int v71; 
  _KSCB *v72; 
  char v73; 
  UINT8 IsThreadRankNonZero; 
  int v75; 
  UINT8 v76; 
  _DWORD *SchedulerAssist; 
  _KSCB *v78; 
  int v79; 
  int v80; 
  char v81; 
  char v82; 
  _BYTE *v83; 
  INT64 v84; 
  unsigned int v85; 
  _SINGLE_LIST_ENTRY *v86; 
  _SINGLE_LIST_ENTRY *v87; 
  UINT8 v88; 
  NTSTATUS GuestSchedulerAssistPriority; 
  int v90; 
  int v91; 
  int v92; 
  INT64 v93; 
  char v94; 
  INT64 v95; 
  char v96; 
  char v97; 
  UINT8 v98; 
  INT8 v99; 
  int v100; 
  unsigned int v101; 
  unsigned __int8 v102; 
  char v103; 
  char v104; 
  char v105; 
  _SINGLE_LIST_ENTRY *v106; 
  _SINGLE_LIST_ENTRY *p_AbPropagateBoostsList; 
  _SINGLE_LIST_ENTRY *v108; 
  _SINGLE_LIST_ENTRY *v109; 
  __int64 v110; 
  __int64 v111; 
  unsigned __int64 v112; 
  INT64 v113; 
  int v114; 
  int v115; 
  _DWORD *v116; 
  __int64 v117; 
  INT64 v118; 
  INT64 v119; 
  int v120; 
  int v121; 
  int v122; 
  int v123; 
  char v124[4]; 
  int v125; 
  char CheckLockOrder[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; 
  char v144[168]; 
  int v145; 

  v3 = *(_QWORD *)(*(_QWORD *)&a2 + 72i64);
  v4 = *(_BYTE *)(*(_QWORD *)&a2 + 566i64) == 1;
  v137 = r8_0;
  v5 = *(_QWORD *)&a2;
  *(_QWORD *)&Idle[4] = rcx0;
  Affinity = 0i64;
  *(_DWORD *)Idle = 0;
  NewScb = 0i64;
  LODWORD(Preempted) = 0;
  if( v4 )
    v6 = *(_BYTE *)(*(_QWORD *)&a2 + 567i64);
  else
    v6 = 0;
  CurrentPrcb = KeGetCurrentPrcb();
  LODWORD(SpinCount) = 0;
  while( _interlockedbittestandset64((volatile signed __int32 *)(v5 + 64), 0i64) )
  {
    do
      KeYieldProcessorEx(&SpinCount);
    while( *(_QWORD *)(v5 + 64) );
    SchedulerAssist = CurrentPrcb->SchedulerAssist;
    if( SchedulerAssist && CurrentPrcb->NestingLevel <= 1u )
      ++SchedulerAssist[6];
  }
  if( (*(_DWORD *)(v5 + 120) & 0x400000) == 0 )
  {
    v8 = 0;
    goto LABEL_7;
  }
  _InterlockedOr(*(volatile signed __int32 **)(v5 + 968), 0x100000u);
  GuestSchedulerAssistPriority = KiReadGuestSchedulerAssistPriority(v5);
  v90 = GuestSchedulerAssistPriority;
  v91 = 32;
  if( GuestSchedulerAssistPriority >= 16 )
  {
    v91 = GuestSchedulerAssistPriority;
    v90 = 15;
  }
  v92 = *(_DWORD *)(v5 + 1024);
  if( v90 != v92 )
  {
    v93 = (char)v90 + v5;
    v94 = *(_BYTE *)(v93 + 824);
    if( v94 == -1 )
      KeBugCheckEx(0x157u, (PVOID)v5, (PVOID)(char)v90, (PVOID)1, 0i64);
    *(_BYTE *)(v93 + 824) = v94 + 1;
    *(_DWORD *)(v5 + 856) |= 1 << v90;
    if( v92 != 32 )
    {
      v95 = (char)v92 + v5;
      v96 = *(_BYTE *)(v95 + 824);
      if( !v96 )
        KeBugCheckEx(0x157u, (PVOID)v5, (PVOID)(char)v92, (PVOID)2, 0i64);
      v97 = v96 - 1;
      *(_BYTE *)(v95 + 824) = v97;
      if( !v97 )
        *(_DWORD *)(v5 + 856) ^= 1 << v92;
    }
    *(_DWORD *)(v5 + 1024) = v90;
  }
  v98 = v91;
  if( v91 == 32 )
    v98 = v90;
  v99 = KiComputePriorityFloor((_KTHREAD *)v5, v98);
  v100 = *(char *)(v5 + 195);
  v101 = v99;
  if( (*(_BYTE *)(v5 + 564) & 0xF0) != 0 )
  {
    if( v99 <= v100 )
      goto LABEL_233;
    goto LABEL_232;
  }
  if( v99 != v100 )
  {
LABEL_232:
    KiSetBasePriorityAndClearDecrement((_KTHREAD *)v5, 0i64, 0i64);
    KiUpdateThreadPriority(0i64, (_KTHREAD *)v5, v101, 0);
  }
LABEL_233:
  if( (*(_DWORD *)(v5 + 120) & 0x400000) != 0 )
    _InterlockedAnd(*(volatile signed __int32 **)(v5 + 968), 0xFFEFFFFF);
  v8 = 1;
LABEL_7:
  v9 = *(_BYTE *)(v5 + 566);
  if( !v9 )
  {
    if( v3 < *(_QWORD *)(v5 + 32) )
    {
      LODWORD(Preempted) = *(unsigned __int8 *)(v5 + 565);
      goto LABEL_27;
    }
    v42 = KiComputeNewPriority((_KTHREAD *)v5, 1);
    if( !v8 )
      KiUpdateThreadPriority(0i64, (_KTHREAD *)v5, (unsigned int)v42, 0);
    KiTryScheduleNextForegroundBoost((_KTHREAD *)v5);
    goto LABEL_71;
  }
  if( *(char *)(v5 + 195) < 16 )
  {
    v10 = 0;
    v11 = KUSER_SHARED_DATA.TickCount.LowPart - *(_DWORD *)(v5 + 436);
    if( v3 >= *(_QWORD *)(v5 + 32) )
    {
      v10 = 4;
      if( v11 < 2 )
        v10 = 5;
    }
    if( v10 >= 4u || *(char *)(v5 + 563) >= 14 || v11 >= 2 && !*(_BYTE *)(v5 + 564) )
    {
      v44 = *(_BYTE *)(v5 + 195);
      v10 |= 8u;
      if( v44 < 16 )
      {
        if( KiForegrounBoostVelocityFlag
          && *(_BYTE *)(*(_QWORD *)(v5 + 544) + 1850i64) == 2
          && (v102 = *(_BYTE *)(v5 + 564), v103 = v102 & 0xF, (v102 & 0xF) != 0 && (*(_DWORD *)(v5 + 120) & 8) == 0) )
        {
          v104 = v103 + *(_BYTE *)(v5 + 563);
          *(_BYTE *)(v5 + 564) = v103;
          v105 = v44 - (v102 >> 4) - 1;
          v44 = v104;
          if( v105 >= v104 )
            v44 = v105;
        }
        else
        {
          v45 = *(_BYTE *)(v5 + 564);
          v46 = *(_BYTE *)(v5 + 563);
          if( (char)(v44 - (v45 >> 4) - (v45 & 0xF) - 1) >= v46 )
            v46 = v44 - (*(_BYTE *)(v5 + 564) >> 4) - (v45 & 0xF) - 1;
          v44 = v46;
          if( v45 )
          {
            if( (v45 & 0xF) != 0 )
              *(_DWORD *)(v5 + 872) = KUSER_SHARED_DATA.TickCount.LowPart;
            *(_BYTE *)(v5 + 564) = 0;
          }
        }
        v47 = *(_DWORD *)(v5 + 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 *)(v5 + 195) )
        {
          if( *(_BYTE *)(v5 + 793) )
          {
            v106 = (_SINGLE_LIST_ENTRY *)(v5 + 808);
            if( *(_QWORD *)(v5 + 808) == 1i64 )
            {
              p_AbPropagateBoostsList = &v48->AbPropagateBoostsList;
              if( v48 != (_KPRCB *)-34680i64 )
              {
                v106->Next = p_AbPropagateBoostsList->Next;
                p_AbPropagateBoostsList->Next = v106;
                _InterlockedIncrement16((volatile signed __int16 *)(v5 + 868));
                KiAbQueueAutoBoostDpc(v48);
              }
            }
          }
        }
        v4 = (*(_DWORD *)(v5 + 120) & 0x400000) == 0;
        *(_BYTE *)(v5 + 195) = v44;
        if( !v4 )
          KiSetSchedulerAssistPriority(*(INT32 **)(v5 + 968), (unsigned int)v44, 1);
      }
    }
    if( *(_BYTE *)(*(_QWORD *)(v5 + 544) + 1850i64) == 2 )
      v10 |= 2u;
    if( ((unsigned __int8)~v10 & ((*(_DWORD *)(v5 + 120) & 8) == 0)) != 0 )
    {
      v12 = *(char *)(v5 + 195);
      if( *(char *)(v5 + 195) > 0 )
      {
        v13 = *(_BYTE *)(v5 + 564);
        if( !v13 )
        {
          v14 = v10 >> 1;
LABEL_19:
          v15 = *(char *)(v5 + 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 *)(v5 + 564) = v13 ^ (v66 ^ v13) & 0xF;
            v67 = KeGetCurrentPrcb();
            if( (char)v16 > (char)v12 )
            {
              if( *(_BYTE *)(v5 + 793) )
              {
                v86 = (_SINGLE_LIST_ENTRY *)(v5 + 808);
                if( *(_QWORD *)(v5 + 808) == 1i64 )
                {
                  v87 = &v67->AbPropagateBoostsList;
                  if( v67 != (_KPRCB *)-34680i64 )
                  {
                    v86->Next = v87->Next;
                    v87->Next = v86;
                    _InterlockedIncrement16((volatile signed __int16 *)(v5 + 868));
                    KiAbQueueAutoBoostDpc(v67);
                  }
                }
              }
            }
            v4 = (*(_DWORD *)(v5 + 120) & 0x400000) == 0;
            *(_BYTE *)(v5 + 195) = v16;
            if( !v4 )
              KiSetSchedulerAssistPriority(*(INT32 **)(v5 + 968), (unsigned int)(char)v16, 1);
          }
LABEL_24:
          v9 = *(_BYTE *)(v5 + 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 *)(v5 + 120) & 8) == 0 && *(char *)(v5 + 195) > 0 )
      KiScheduleNextForegroundBoost((_KTHREAD *)v5);
    goto LABEL_24;
  }
  v17 = 1;
LABEL_25:
  if( v9 != 2 )
    goto LABEL_26;
  v49 = *(_BYTE *)(v5 + 195);
  if( v49 > 0 )
  {
    v50 = *(_BYTE *)(v5 + 567);
    if( v49 < v50 && v49 < 13 && (*(_DWORD *)(v5 + 120) & 8) == 0 )
    {
      v51 = 13;
      v52 = *(_DWORD *)(v5 + 120);
      if( v50 < 13 )
        v51 = *(_BYTE *)(v5 + 567);
      *(_BYTE *)(v5 + 564) += 16 * (v51 - v49);
      v53 = KeGetCurrentPrcb();
      if( v51 > v49 )
      {
        if( *(_BYTE *)(v5 + 793) )
        {
          v108 = (_SINGLE_LIST_ENTRY *)(v5 + 808);
          if( *(_QWORD *)(v5 + 808) == 1i64 )
          {
            v109 = &v53->AbPropagateBoostsList;
            if( v53 != (_KPRCB *)-34680i64 )
            {
              v108->Next = v109->Next;
              v109->Next = v108;
              _InterlockedIncrement16((volatile signed __int16 *)(v5 + 868));
              KiAbQueueAutoBoostDpc(v53);
              v52 = *(_DWORD *)(v5 + 120);
            }
          }
        }
      }
      *(_BYTE *)(v5 + 195) = v51;
      if( (v52 & 0x400000) != 0 )
        KiSetSchedulerAssistPriority(*(INT32 **)(v5 + 968), (unsigned int)v51, 1);
      v54 = *(_QWORD *)(v5 + 32);
      if( v3 > v54 || v54 - v3 < (unsigned int)KiLockQuantumTarget )
        *(_QWORD *)(v5 + 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 *)(v5 + 651);
    if( (*(_DWORD *)(v5 + 120) & 0x20) != 0 )
      _interlockedbittestandreset((volatile signed __int32 *)(v5 + 120), 5u);
    *(_QWORD *)(v5 + 32) = v43;
    goto LABEL_27;
  }
  v65 = *(_QWORD *)(v5 + 32);
  if( v3 > v65 || v65 - v3 < (unsigned int)KiLockQuantumTarget )
    *(_QWORD *)(v5 + 32) = v3 + (unsigned int)KiLockQuantumTarget;
LABEL_27:
  v18 = *(_DWORD *)(v5 + 588);
  v125 = v18;
  *(_WORD *)(v5 + 565) = 0;
  v19 = *(_DWORD *)(v5 + 484) || *(_BYTE *)(v5 + 390) == 1;
  v20 = 0;
  v21 = _bittestandreset((signed __int32 *)(v5 + 116), 1u);
  if( *(_QWORD *)(v5 + 568) != KiCpuSetSequence && (*(_DWORD *)(v5 + 116) & 8) == 0 )
    KiComputeThreadAffinity((_KTHREAD *)v5);
  Group = *(_WORD *)(v5 + 584);
  Mask = *(_QWORD *)(v5 + 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 *)(v5 + 125) )
      {
        v25 = KiHeteroChooseTargetProcessor(*(_KPRCB **)&Idle[4], (_KTHREAD *)v5, &Affinity, (UINT64 *)Idle);
      }
      else
      {
        v24 = *(_KPRCB **)&Idle[4];
        if( KiPerfIsoEnabled && KiIsThreadRankBiased(v5, *(struct _KPRCB **)&Idle[4]) && !v19 )
          v20 = 1;
        v25 = KiChooseTargetProcessor(v24, (_KTHREAD *)v5, &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->PrcbLock, 0i64) )
          break;
        KiSetVpThreadSpinLockCount();
        do
          KeYieldProcessorEx(&v134);
        while( v25->PrcbLock );
      }
      v75 = *(_DWORD *)Idle;
      if( (v25->IdleState & 1) == 0 )
        v75 = 1;
      *(_DWORD *)Idle = v75;
    }
    Number = v25->Number;
    *(_DWORD *)(v5 + 536) = Number;
    ThreadScb = *(_KSCB **)(v5 + 104);
    if( ThreadScb )
      ThreadScb = (_KSCB *)((char *)ThreadScb + v25->ScbOffset);
    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 )
    {
      NextThread = v25->NextThread;
      if( NextThread && NextThread != v25->IdleThread )
        __fastfail(0x1Eu);
      v30 = 2;
      if( v21 )
        v30 = 6;
      if( (*(_BYTE *)(v5 + 2) & 4) == 0
        || (IsThreadRankNonZero = KiIsThreadRankNonZero((_KTHREAD *)v5, v25, v26), v31 = 1, !IsThreadRankNonZero) )
      {
        v31 = *(_BYTE *)(v5 + 195);
      }
      *v25->PriorityState = v31;
      if( v25->SchedulerAssist )
      {
        v113 = (unsigned int)KiVpThreadSystemWorkPriority;
        if( (_ETHREAD *)v5 != v25->IdleThread )
          v113 = (unsigned int)v31;
        KiSetSchedulerAssistPriority((INT32 *)v25->SchedulerAssist, v113, 0);
      }
      v25->NextThread = (_ETHREAD *)v5;
      v32 = v25->SchedulerAssist;
      if( v32 )
        v32[16] = (_ETHREAD *)v5 == v25->IdleThread;
      if( *(_BYTE *)(v5 + 388) == 1 || (v30 & 4) != 0 )
        *(_DWORD *)(v5 + 132) = *(_DWORD *)(v5 + 132) - *(_DWORD *)(v5 + 436) + KUSER_SHARED_DATA.TickCount.LowPart;
      *(_BYTE *)(v5 + 388) = 3;
      IdleState = v25->IdleState;
      ParentNode = v25->ParentNode;
      v25->IdleSchedule = 0;
      if( (IdleState & 1) != 0 )
        __fastfail(0x21u);
      v35 = IdleState + 1;
      v25->IdleState = v35;
      if( v35 == 1 )
        _interlockedbittestandreset64((volatile signed __int32 *)ParentNode, v25->GroupIndex);
      _interlockedbittestandreset64((volatile signed __int32 *)&ParentNode->IdleCpuSet, v25->GroupIndex);
      _InterlockedAnd64((volatile signed __int64 *)&ParentNode->IdleSmtSet, ~v25->CoreProcessorSet);
      _InterlockedAnd64((volatile signed __int64 *)&ParentNode->NonPairedSmtSet, ~v25->CoreProcessorSet);
      if( (v25->CoreProcessorSet & ~ParentNode->IdleCpuSet) == v25->GroupSetMember )
        _interlockedbittestandset64((volatile signed __int32 *)&ParentNode->NonPairedSmtSet, v25->GroupIndex);
      _InterlockedAnd64((volatile signed __int64 *)&v25->PrcbLock, 0i64);
      KiSetVpThreadSpinLockCount();
      v36 = *(_DWORD *)(v5 + 588);
      v37 = *(char *)(v5 + 195);
      *(_QWORD *)(v5 + 64) = 0i64;
      v38 = *(_KPRCB **)&Idle[4];
      if( v25 != *(_KPRCB **)&Idle[4] && v25->IdleHalt )
      {
        v39 = KeGetCurrentPrcb();
        v140 = 0i64;
        LODWORD(v140) = 6;
        ++v39->SynchCounters.IpiSendSoftwareInterruptCount;
        v141 = 0i64;
        DWORD2(v140) = Number;
        memset(v144, 0i64, sizeof(v144));
        v142 = *(_OWORD *)(qword_140C50630 + 24 * Number);
        v143 = *(_QWORD *)(qword_140C50630 + 24 * Number + 16);
        HIDWORD(v134) = -1;
        v135 = 1;
        v136[1] = *(_DWORD *)(qword_140C50700 + 20);
        v136[0] = *(_DWORD *)(qword_140C50700 + 16);
        v40 = *(void(__fastcall **)(_QWORD, int *, __int128 *, __int64, char *))(Controller + 120);
        _disable();
        v40(*(_QWORD *)(Controller + 16), v136, &v142, 47i64, (char *)&v134 + 4);
        if( (v145 & 0x200) != 0 )
          _enable();
        v38 = *(_KPRCB **)&Idle[4];
      }
      if( (KiVelocityFlags & 2) == 0 )
        goto LABEL_64;
      v41 = (int *)v25->SchedulerAssist;
      if( !v41 )
        goto LABEL_64;
      if( !v38->SchedulerAssist )
        goto LABEL_64;
      if( 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 = v38->SchedulerAssist;
      v116[3] = 2;
      v117 = v25->Number;
      if( !v4 )
      {
LABEL_273:
        v116[2] = v117;
        __writemsr(0x400000C2u, (unsigned int)v117);
LABEL_64:
        if( (xmmword_140CFB490 & 0x8000000) == 0 )
          return;
        v123 = v125;
        v122 = v36;
LABEL_292:
        EtwTraceIdealProcessor(v5, 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 = v25->NextThread;
    if( !v55 )
    {
      CurrentThread = (INT64)v25->CurrentThread;
      if( CurrentThread == v5 )
      {
        KiUpdateVPBackingThreadPriority((PVOID)v5);
      }
      else
      {
        v4 = (*(_DWORD *)(CurrentThread + 120) & 0x400000) == 0;
        CheckLockOrder[0] = 0;
        if( !v4 && KiTryToAcquireThreadLock((_KTHREAD *)CurrentThread, (UINT8 *)CheckLockOrder) )
        {
          if( (*(_DWORD *)(CurrentThread + 120) & 0x400000) != 0 )
            KiUpdateVPBackingThreadPriority((PVOID)CurrentThread);
          KiReleaseThreadLockSafe(CurrentThread);
        }
      }
      if( !KiGroupSchedulingEnabled )
      {
        if( *(_BYTE *)(v5 + 195) > *(_BYTE *)(CurrentThread + 195) )
        {
LABEL_104:
          if( *(_BYTE *)(CurrentThread + 388) == 2 )
            *(_BYTE *)(CurrentThread + 565) = 1;
          v58 = 2;
          if( v21 )
            v58 = 6;
          if( (*(_BYTE *)(v5 + 2) & 4) == 0 || (v76 = KiIsThreadRankNonZero((_KTHREAD *)v5, v25, v26), v59 = 1, !v76) )
            v59 = *(_BYTE *)(v5 + 195);
          *v25->PriorityState = v59;
          if( v25->SchedulerAssist )
          {
            v119 = (unsigned int)KiVpThreadSystemWorkPriority;
            if( (_ETHREAD *)v5 != v25->IdleThread )
              v119 = (unsigned int)v59;
            KiSetSchedulerAssistPriority((INT32 *)v25->SchedulerAssist, v119, 0);
          }
          v25->NextThread = (_ETHREAD *)v5;
          v60 = v25->SchedulerAssist;
          if( v60 )
            v60[16] = (_ETHREAD *)v5 == v25->IdleThread;
          if( *(_BYTE *)(v5 + 388) == 1 || (v58 & 4) != 0 )
            *(_DWORD *)(v5 + 132) = *(_DWORD *)(v5 + 132) - *(_DWORD *)(v5 + 436) + KUSER_SHARED_DATA.TickCount.LowPart;
          *(_BYTE *)(v5 + 388) = 3;
          _InterlockedAnd64((volatile signed __int64 *)&v25->PrcbLock, 0i64);
          KiSetVpThreadSpinLockCount();
          v36 = *(_DWORD *)(v5 + 588);
          v61 = *(char *)(v5 + 195);
          *(_QWORD *)(v5 + 64) = 0i64;
          v62 = *(_QWORD *)&Idle[4];
          if( *(_KPRCB **)&Idle[4] == v25 )
            goto LABEL_64;
          v63 = KeGetCurrentPrcb();
          v138 = 0i64;
          LODWORD(v138) = 6;
          ++v63->SynchCounters.IpiSendSoftwareInterruptCount;
          v139 = 0i64;
          DWORD2(v138) = Number;
          HalpInterruptSendIpi(&v138, 0x2Fu);
          if( (KiVelocityFlags & 2) == 0 )
            goto LABEL_64;
          v64 = (int *)v25->SchedulerAssist;
          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 = *(_DWORD **)(v62 + 33976);
          v116[3] = 2;
          v117 = v25->Number;
          if( !v4 )
            goto LABEL_273;
          goto LABEL_272;
        }
        goto LABEL_139;
      }
      KiEvaluateGroupSchedulingPreemption(v25, (_ETHREAD *)CurrentThread, (_ETHREAD *)v5, &NewScb);
      if( v57 )
        goto LABEL_104;
      goto LABEL_157;
    }
    KiTryToUpdateVPBackingThreadPriority(v25->NextThread);
    if( KiGroupSchedulingEnabled )
    {
      KiEvaluateGroupSchedulingPreemption(v25, v55, (_ETHREAD *)v5, &NewScb);
      if( !v73 )
      {
LABEL_157:
        ThreadScb = NewScb;
LABEL_139:
        v18 = v125;
        goto LABEL_140;
      }
    }
    else if( *(_BYTE *)(v5 + 195) <= v55->Tcb.Priority )
    {
      goto LABEL_139;
    }
    v55->Tcb.Preempted = 1;
    v81 = 2;
    if( v21 )
      v81 = 6;
    if( (*(_BYTE *)(v5 + 2) & 4) == 0 || (v88 = KiIsThreadRankNonZero((_KTHREAD *)v5, v25, v26), v82 = 1, !v88) )
      v82 = *(_BYTE *)(v5 + 195);
    *v25->PriorityState = v82;
    if( v25->SchedulerAssist )
    {
      v118 = (unsigned int)KiVpThreadSystemWorkPriority;
      if( (_ETHREAD *)v5 != v25->IdleThread )
        v118 = (unsigned int)v82;
      KiSetSchedulerAssistPriority((INT32 *)v25->SchedulerAssist, v118, 0);
    }
    v25->NextThread = (_ETHREAD *)v5;
    v83 = v25->SchedulerAssist;
    if( v83 )
      v83[16] = (_ETHREAD *)v5 == v25->IdleThread;
    if( *(_BYTE *)(v5 + 388) == 1 || (v81 & 4) != 0 )
      *(_DWORD *)(v5 + 132) = *(_DWORD *)(v5 + 132) - *(_DWORD *)(v5 + 436) + KUSER_SHARED_DATA.TickCount.LowPart;
    v84 = v137;
    *(_BYTE *)(v5 + 388) = 3;
    KiInsertDeferredReadyList(v84, (INT64)v55);
    _InterlockedAnd64((volatile signed __int64 *)&v25->PrcbLock, 0i64);
    KiSetVpThreadSpinLockCount();
    v36 = *(_DWORD *)(v5 + 588);
    v85 = *(char *)(v5 + 195);
    KiReleaseThreadLockSafe(v5);
    KiHvEnlightenedGuestPriorityKick(*(INT64 *)&Idle[4], (INT64)v25, v85);
    goto LABEL_64;
  }
  v110 = *(unsigned int *)(v5 + 536);
  LODWORD(v110) = v110 & 0x7FFFFFFF;
  v25 = *(&KiProcessorBlock + v110);
  if( !(unsigned int)KiPrcbInGroupAffinity(v25, &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->PrcbLock, 0i64) )
      break;
    KiSetVpThreadSpinLockCount();
    do
      KeYieldProcessorEx(&v133);
    while( v25->PrcbLock );
  }
  *(_DWORD *)(v5 + 536) = v110;
  ThreadScb = KiGetThreadScb((_KTHREAD *)v5, v25, 0i64);
  NewScb = ThreadScb;
LABEL_140:
  v68 = ThreadScb;
  if( !v21 )
  {
    ThreadScb = NewScb;
    *(_DWORD *)(v5 + 436) = KUSER_SHARED_DATA.TickCount.LowPart;
  }
  if( !ThreadScb )
  {
    v68 = *(_KSCB **)(v5 + 104);
    if( v68 )
      v68 = (_KSCB *)((char *)v68 + v25->ScbOffset);
  }
  v69 = v25->SchedulerAssist;
  if( v69 )
    v69[16] = 0;
  ShareRankNonZero = 0;
  *(_BYTE *)(v5 + 388) = 1;
  v124[0] = 0;
  if( !v68 || (*(_DWORD *)(v5 + 120) & 0xC00) != 0 )
    goto LABEL_148;
  KiGetThreadEffectiveRankNonZero((_ETHREAD *)v5, v68, v26, 0, (UINT8 *)v124);
  if( !v79 )
  {
    ShareRankNonZero = v124[0];
LABEL_148:
    KiAddThreadToPrcbQueue(
      v25,
      (_KTHREAD *)v5,
      (unsigned int)*(char *)(v5 + 195),
      (unsigned int)Preempted,
      ShareRankNonZero);
    goto LABEL_149;
  }
  KiAddThreadToScbQueue(v25, v78, (_KTHREAD *)v5, (unsigned int)Preempted);
LABEL_149:
  _InterlockedAnd64((volatile signed __int64 *)&v25->PrcbLock, 0i64);
  KiSetVpThreadSpinLockCount();
  v71 = *(_DWORD *)(v5 + 588);
  *(_QWORD *)(v5 + 64) = 0i64;
  if( (xmmword_140CFB490 & 0x8000000) != 0 )
  {
    v122 = v71;
    v123 = v18;
    goto LABEL_292;
  }
}

Referenced by:

KiAbProcessContextSwitch
KiExitDispatcher
KiReadyDeferredReadyList
KiReadyThread