KiApplyForegroundBoostThread
UINT8 __stdcall KiApplyForegroundBoostThread(_ETHREAD *Thread, _SINGLE_LIST_ENTRY *ReadyList){
UINT8 v3;
char v5;
UINT64 CurrentPrcb;
_KPRCB *v7;
char v9;
int v10;
__int64 v11;
int *v12;
int v13;
int v14;
__int64 v15;
__int64 v16;
unsigned int v17;
_KTHREAD *v18;
_ETHREAD *v19;
char v20;
__int64 v21;
INT64 v22;
bool v23;
char v24;
_QWORD *v25;
__int64 v26;
bool v27;
_KTHREAD *v28;
_ETHREAD *v29;
char v30;
__int64 v31;
INT64 v32;
bool v33;
char v34;
int v35;
int v36;
_KSHARED_READY_QUEUE *ControlReadyQueue;
char v38;
_KPRCB *ControlPrcb;
ControlPrcb = 0i64;
ControlReadyQueue = 0i64;
v3 = 0;
KiAcquireThreadStateLock(Thread, &ControlPrcb, &ControlReadyQueue);
if( ((unsigned __int8)(v5 - 1) <= 2u || v5 == 7) && *(_BYTE *)(*((_QWORD *)Thread + 68) + 1850i64) == 2 )
{
if( *((_BYTE *)Thread + 564) )
goto LABEL_13;
if( (*((_DWORD *)Thread + 30) & 8) != 0 )
goto LABEL_13;
CurrentPrcb = (unsigned int)*((char *)Thread + 195);
if( *((char *)Thread + 195) <= 0 )
goto LABEL_13;
v9 = PsPrioritySeparation + *((_BYTE *)Thread + 563);
if( v9 >= 16 )
v9 = 15;
if( v9 <= *((char *)Thread + 195) )
{
LABEL_13:
v7 = ControlPrcb;
goto LABEL_14;
}
v10 = 0;
v35 = v9;
v36 = *((char *)Thread + 195);
v38 = 0;
*((_BYTE *)Thread + 564) = (v9 - *((_BYTE *)Thread + 195)) & 0xF;
switch( v5 )
{
case 1:
v7 = ControlPrcb;
KiRemoveThreadFromAnyReadyQueue(ControlPrcb, ControlReadyQueue, (_KTHREAD *)Thread, (unsigned int)CurrentPrcb);
KiUpdateThreadPriority(0i64, (_KTHREAD *)Thread, (unsigned int)v35, 0);
KiPrepareReadyThreadForRescheduling((_KTHREAD *)Thread, (unsigned int)v35, ReadyList);
goto LABEL_17;
case 2:
v7 = ControlPrcb;
v25 = (_QWORD *)((char *)ControlPrcb + 16);
v26 = *((_QWORD *)ControlPrcb + 2);
KiUpdateThreadPriority(ControlPrcb, (_KTHREAD *)Thread, (unsigned int)v9, v26 == 0);
v27 = v35 <= v36;
if( v35 < v36 )
{
if( !v26 )
{
v7 = ControlPrcb;
if( *((_BYTE *)Thread + 388) == 2 )
{
v28 = (_ETHREAD *)KiSelectReadyThreadEx(ControlPrcb, (_KTHREAD *)Thread, 0);
v29 = v28;
if( !v28 )
goto LABEL_17;
if( (*((_BYTE *)v28 + 2) & 4) != 0 )
{
KiIsThreadRankNonZero(v28, v7);
v30 = 1;
if( !v34 )
v30 = *((_BYTE *)v29 + 195);
}
else
{
v30 = *((_BYTE *)v28 + 195);
}
**((_BYTE **)v7 + 7) = v30;
v31 = *((_QWORD *)v7 + 4247);
if( v31 )
{
v32 = (unsigned int)KiVpThreadSystemWorkPriority;
if( v29 != *((_ETHREAD **)v7 + 3) )
v32 = (unsigned int)v30;
KiSetSchedulerAssistPriority(*((volatile INT32 **)v7 + 4247), v32, 0);
v31 = *((_QWORD *)v7 + 4247);
}
v33 = v29 == *((_ETHREAD **)v7 + 3);
*v25 = v29;
if( v31 )
*(_BYTE *)(v31 + 16) = v33;
if( *((_BYTE *)v29 + 388) == 1 )
*((_DWORD *)v29 + 33) = *((_DWORD *)v29 + 33)
- *((_DWORD *)v29 + 109)
+ KUSER_SHARED_DATA.TickCount.LowPart;
*((_BYTE *)v29 + 388) = 3;
v38 = 1;
goto LABEL_48;
}
if( *((_DWORD *)ControlPrcb + 7942) >> (v35 + 1) )
*((_BYTE *)Thread + 112) |= 0x10u;
goto LABEL_17;
}
v27 = v35 <= v36;
}
if( v27 )
goto LABEL_17;
if( v26 )
goto LABEL_17;
v7 = ControlPrcb;
if( *((_BYTE *)Thread + 388) != 2 )
goto LABEL_17;
break;
case 3:
v7 = ControlPrcb;
KiUpdateThreadPriority(ControlPrcb, (_KTHREAD *)Thread, (unsigned int)v9, 1u);
if( v35 < v36 )
{
v18 = (_ETHREAD *)KiSelectReadyThreadEx(v7, (_KTHREAD *)Thread, 0);
v19 = v18;
if( v18 )
{
if( (*((_BYTE *)v18 + 2) & 4) != 0 )
{
KiIsThreadRankNonZero(v18, v7);
v20 = 1;
if( !v24 )
v20 = *((_BYTE *)v19 + 195);
}
else
{
v20 = *((_BYTE *)v18 + 195);
}
**((_BYTE **)v7 + 7) = v20;
v21 = *((_QWORD *)v7 + 4247);
if( v21 )
{
v22 = (unsigned int)KiVpThreadSystemWorkPriority;
if( v19 != *((_ETHREAD **)v7 + 3) )
v22 = (unsigned int)v20;
KiSetSchedulerAssistPriority(*((volatile INT32 **)v7 + 4247), v22, 0);
v21 = *((_QWORD *)v7 + 4247);
}
v23 = v19 == *((_ETHREAD **)v7 + 3);
*((_QWORD *)v7 + 2) = v19;
if( v21 )
*(_BYTE *)(v21 + 16) = v23;
if( *((_BYTE *)v19 + 388) == 1 )
*((_DWORD *)v19 + 33) = *((_DWORD *)v19 + 33)
- *((_DWORD *)v19 + 109)
+ KUSER_SHARED_DATA.TickCount.LowPart;
*((_BYTE *)v19 + 388) = 3;
KiInsertDeferredReadyList((INT64)ReadyList, (INT64)Thread);
goto LABEL_48;
}
LABEL_17:
KiUpdateSharedReadyQueueAffinityThread(0i64, (_KTHREAD *)Thread);
KiReleaseThreadStateLock(v11, (__int64)v7, (volatile signed __int64 *)ControlReadyQueue);
if( v38 )
{
v7 = ControlPrcb;
CurrentPrcb = *((unsigned int *)ControlPrcb + 9);
if( *((_DWORD *)KeGetPcr() + 105) != (_DWORD)CurrentPrcb )
KiSendSoftwareInterrupt(CurrentPrcb, 2u);
}
if( v10 <= 0 )
goto LABEL_21;
CurrentPrcb = (UINT64)KeGetCurrentPrcb();
if( (KiVelocityFlags & 2) != 0 )
{
v7 = ControlPrcb;
v12 = (int *)*((_QWORD *)ControlPrcb + 4247);
if( !v12 || !*(_QWORD *)(CurrentPrcb + 33976) || (_KPRCB *)CurrentPrcb == ControlPrcb || v10 < 8 )
goto LABEL_21;
v13 = *v12;
v14 = *v12 & 0x40000;
if( (v13 & 0x100000) != 0 || v14 && (unsigned __int8)v13 < v10 )
{
v23 = HvlpVirtualProcessorsIdentityMapped == 0;
v15 = *(_QWORD *)(CurrentPrcb + 33976);
v7 = ControlPrcb;
*(_DWORD *)(v15 + 12) = 2;
v16 = *((unsigned int *)v7 + 9);
if( v23 )
LODWORD(v16) = (unsigned __int8)HvlpVirtualProcessorMapping[2 * (unsigned int)v16 + 1] | ((unsigned __int8)HvlpVirtualProcessorMapping[2 * v16] << 6);
*(_DWORD *)(v15 + 8) = v16;
v17 = v16;
CurrentPrcb = 1073742018i64;
__writemsr(0x400000C2u, v17);
goto LABEL_21;
}
}
v7 = ControlPrcb;
LABEL_21:
v3 = 1;
LABEL_14:
if( v3 )
return v3;
goto LABEL_4;
}
break;
default:
KiUpdateThreadPriority(0i64, (_KTHREAD *)Thread, (unsigned int)v9, 0);
LABEL_48:
v7 = ControlPrcb;
goto LABEL_17;
}
v10 = v35;
goto LABEL_17;
}
v7 = ControlPrcb;
LABEL_4:
KiReleaseThreadStateLock(CurrentPrcb, (__int64)v7, (volatile signed __int64 *)ControlReadyQueue);
return v3;
}Referenced by:
KeSetPriorityAndQuantumProcess