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