KiApplyForegroundBoostThread
VOID __fastcall KiApplyForegroundBoostThread(_ETHREAD *Thread, _SINGLE_LIST_ENTRY *ReadyList){
char v3;
char v5;
UINT64 Priority;
_KPRCB *v7;
char v8;
int v9;
_KPRCB *v10;
int *v11;
int v12;
int v13;
__int64 v14;
__int64 Number;
unsigned int v16;
_ETHREAD *v17;
_KPRCB *v18;
_ETHREAD *v19;
char v20;
_BYTE *v21;
INT64 v22;
bool v23;
UINT8 v24;
_ETHREAD **p_NextThread;
_ETHREAD *NextThread;
bool v27;
_ETHREAD *v28;
_KPRCB *v29;
_ETHREAD *v30;
char v31;
_BYTE *SchedulerAssist;
INT64 v33;
bool v34;
UINT8 IsThreadRankNonZero;
int v36;
int v37;
_KSHARED_READY_QUEUE *ControlReadyQueue;
char v39;
_KPRCB *ControlPrcb;
ControlPrcb = 0i64;
ControlReadyQueue = 0i64;
v3 = 0;
KiAcquireThreadStateLock(Thread, &ControlPrcb, &ControlReadyQueue);
if( (unsigned __int8)(v5 - 1) > 2u && v5 != 7 || Thread->Tcb.Process->Vm.Instance.Flags.MemoryPriority != 2 )
{
v7 = ControlPrcb;
LABEL_4:
KiReleaseThreadStateLock((_KPRCB *)Priority, (_KSHARED_READY_QUEUE *)v7);
return;
}
if( Thread->Tcb.PriorityDecrement )
goto LABEL_13;
if( (*(&Thread->Tcb.MiscFlags + 1) & 8) != 0 )
goto LABEL_13;
Priority = (unsigned int)Thread->Tcb.Priority;
if( Thread->Tcb.Priority <= 0 )
goto LABEL_13;
v8 = PsPrioritySeparation + Thread->Tcb.BasePriority;
if( v8 >= 16 )
v8 = 15;
if( v8 <= Thread->Tcb.Priority )
{
LABEL_13:
v7 = ControlPrcb;
goto LABEL_14;
}
v9 = 0;
v36 = v8;
v37 = Thread->Tcb.Priority;
v39 = 0;
Thread->Tcb.PriorityDecrement = (v8 - Thread->Tcb.Priority) & 0xF;
if( v5 == 1 )
{
v7 = ControlPrcb;
KiRemoveThreadFromAnyReadyQueue(ControlPrcb, ControlReadyQueue, (__int64)Thread, (unsigned int)Priority);
KiUpdateThreadPriority(0i64, &Thread->Tcb, (unsigned int)v36, 0);
KiPrepareReadyThreadForRescheduling(&Thread->Tcb, (unsigned int)v36, ReadyList);
goto LABEL_17;
}
if( v5 == 2 )
{
v7 = ControlPrcb;
p_NextThread = &ControlPrcb->NextThread;
NextThread = ControlPrcb->NextThread;
KiUpdateThreadPriority(ControlPrcb, &Thread->Tcb, (unsigned int)v8, NextThread == 0i64);
v27 = v36 <= v37;
if( v36 < v37 )
{
if( !NextThread )
{
v7 = ControlPrcb;
if( Thread->Tcb.WaitBlockFill6[68] == 2 )
{
v28 = (_ETHREAD *)KiSelectReadyThreadEx(ControlPrcb, &Thread->Tcb, 0);
v30 = v28;
if( !v28 )
goto LABEL_17;
if( (v28->Tcb.gap0[2] & 4) != 0 )
{
IsThreadRankNonZero = KiIsThreadRankNonZero(&v28->Tcb, v7, v29);
v31 = 1;
if( !IsThreadRankNonZero )
v31 = v30->Tcb.Priority;
}
else
{
v31 = v28->Tcb.Priority;
}
*v7->PriorityState = v31;
SchedulerAssist = v7->SchedulerAssist;
if( SchedulerAssist )
{
v33 = (unsigned int)KiVpThreadSystemWorkPriority;
if( v30 != v7->IdleThread )
v33 = (unsigned int)v31;
KiSetSchedulerAssistPriority((INT32 *)v7->SchedulerAssist, v33, 0);
SchedulerAssist = v7->SchedulerAssist;
}
v34 = v30 == v7->IdleThread;
*p_NextThread = v30;
if( SchedulerAssist )
SchedulerAssist[16] = v34;
if( v30->Tcb.WaitBlockFill6[68] == 1 )
v30->Tcb.ReadyTime = v30->Tcb.ReadyTime
- v30->Tcb.WaitBlock[2].SpareLong
+ KUSER_SHARED_DATA.TickCount.LowPart;
v30->Tcb.WaitBlockFill6[68] = 3;
v39 = 1;
goto LABEL_48;
}
if( ControlPrcb->ReadySummary >> (v36 + 1) )
Thread->Tcb.WaitRegister.Flags |= 0x10u;
goto LABEL_17;
}
v27 = v36 <= v37;
}
if( v27 )
goto LABEL_17;
if( NextThread )
goto LABEL_17;
v7 = ControlPrcb;
if( Thread->Tcb.WaitBlockFill6[68] != 2 )
goto LABEL_17;
LABEL_16:
v9 = v36;
goto LABEL_17;
}
if( v5 != 3 )
{
KiUpdateThreadPriority(0i64, &Thread->Tcb, (unsigned int)v8, 0);
LABEL_48:
v7 = ControlPrcb;
goto LABEL_17;
}
v7 = ControlPrcb;
KiUpdateThreadPriority(ControlPrcb, &Thread->Tcb, (unsigned int)v8, 1u);
if( v36 >= v37 )
goto LABEL_16;
v17 = (_ETHREAD *)KiSelectReadyThreadEx(v7, &Thread->Tcb, 0);
v19 = v17;
if( v17 )
{
if( (v17->Tcb.gap0[2] & 4) != 0 )
{
v24 = KiIsThreadRankNonZero(&v17->Tcb, v7, v18);
v20 = 1;
if( !v24 )
v20 = v19->Tcb.Priority;
}
else
{
v20 = v17->Tcb.Priority;
}
*v7->PriorityState = v20;
v21 = v7->SchedulerAssist;
if( v21 )
{
v22 = (unsigned int)KiVpThreadSystemWorkPriority;
if( v19 != v7->IdleThread )
v22 = (unsigned int)v20;
KiSetSchedulerAssistPriority((INT32 *)v7->SchedulerAssist, v22, 0);
v21 = v7->SchedulerAssist;
}
v23 = v19 == v7->IdleThread;
v7->NextThread = v19;
if( v21 )
v21[16] = v23;
if( v19->Tcb.WaitBlockFill6[68] == 1 )
v19->Tcb.ReadyTime = v19->Tcb.ReadyTime - v19->Tcb.WaitBlock[2].SpareLong + KUSER_SHARED_DATA.TickCount.LowPart;
v19->Tcb.WaitBlockFill6[68] = 3;
KiInsertDeferredReadyList((INT64)ReadyList, (INT64)Thread);
goto LABEL_48;
}
LABEL_17:
KiUpdateSharedReadyQueueAffinityThread(0i64, &Thread->Tcb);
KiReleaseThreadStateLock(v10, (_KSHARED_READY_QUEUE *)v7);
if( v39 )
{
v7 = ControlPrcb;
Priority = ControlPrcb->Number;
if( KeGetPcr()->Prcb.Number != (_DWORD)Priority )
KiSendSoftwareInterrupt(Priority, 2u);
}
if( v9 <= 0 )
goto LABEL_21;
Priority = (UINT64)KeGetCurrentPrcb();
if( (KiVelocityFlags & 2) != 0 )
{
v7 = ControlPrcb;
v11 = (int *)ControlPrcb->SchedulerAssist;
if( !v11 || !*(_QWORD *)(Priority + 33976) || (_KPRCB *)Priority == ControlPrcb || v9 < 8 )
goto LABEL_21;
v12 = *v11;
v13 = *v11 & 0x40000;
if( (v12 & 0x100000) != 0 || v13 && (unsigned __int8)v12 < v9 )
{
v23 = HvlpVirtualProcessorsIdentityMapped == 0;
v14 = *(_QWORD *)(Priority + 33976);
v7 = ControlPrcb;
*(_DWORD *)(v14 + 12) = 2;
Number = v7->Number;
if( v23 )
LODWORD(Number) = (unsigned __int8)HvlpVirtualProcessorMapping[2 * (unsigned int)Number + 1] | ((unsigned __int8)HvlpVirtualProcessorMapping[2 * Number] << 6);
*(_DWORD *)(v14 + 8) = Number;
v16 = Number;
Priority = 1073742018i64;
__writemsr(0x400000C2u, v16);
goto LABEL_21;
}
}
v7 = ControlPrcb;
LABEL_21:
v3 = 1;
LABEL_14:
if( !v3 )
goto LABEL_4;
}Referenced by:
KeSetPriorityAndQuantumProcess