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