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