KeSetActualBasePriorityThread
__int64 __fastcall KeSetActualBasePriorityThread(__int64 a1, int a2){
unsigned __int8 CurrentIrql;
struct _KPRCB *CurrentPrcb;
__int64 v5;
unsigned int v6;
unsigned int v7;
_KPRCB *v8;
char v9;
UINT64 updated;
UINT64 v11;
unsigned int v12;
char v13;
int v14;
int v15;
_KPRCB *v16;
__int64 v17;
bool v18;
_KTHREAD *v19;
_ETHREAD *v20;
char v21;
__int64 v22;
volatile INT32 *v23;
struct _KPRCB *v25;
int *v26;
_QWORD *v27;
_QWORD *v28;
UINT64 v29;
char v30;
char v31;
__int64 v32;
INT64 v33;
bool v34;
_KTHREAD *v35;
_ETHREAD *v36;
char v37;
char v38;
__int64 v39;
__int64 v40;
INT64 v41;
bool v42;
int v43;
int v44;
__int64 v45;
_KPRCB *v46;
__int64 v47;
unsigned __int8 v48;
_KSHARED_READY_QUEUE *ControlReadyQueue;
_SINGLE_LIST_ENTRY ReadyList;
_QWORD *v51;
unsigned int v52;
UINT64 SpinCount;
_KPRCB *ControlPrcb;
if( *(__int64 **)(a1 + 544) == KiInitialProcess )
return 1i64;
ReadyList.Next = 0i64;
CurrentIrql = KeGetCurrentIrql();
v48 = CurrentIrql;
__writecr8(2ui64);
CurrentPrcb = KeGetCurrentPrcb();
LODWORD(SpinCount) = 0;
v5 = *((_QWORD *)CurrentPrcb + 1);
while( _interlockedbittestandset64((volatile signed __int32 *)(a1 + 64), 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *(_QWORD *)(a1 + 64) );
v39 = *((_QWORD *)CurrentPrcb + 4247);
if( v39 && *((_BYTE *)CurrentPrcb + 32) <= 1u )
++*(_DWORD *)(v39 + 24);
}
v6 = *(char *)(a1 + 563);
*(_BYTE *)(a1 + 645) = 0;
v7 = v6;
v8 = KeGetCurrentPrcb();
v52 = v6;
if( (char)a2 < (char)v6 )
{
if( *(_BYTE *)(a1 + 871) )
{
v27 = (_QWORD *)(a1 + 816);
if( *(_QWORD *)(a1 + 816) == 1i64 )
{
v28 = (_QWORD *)((char *)v8 + 34672);
if( v8 != (_KPRCB *)-34672i64 )
{
*v27 = *v28;
*v28 = v27;
_InterlockedIncrement16((volatile signed __int16 *)(a1 + 868));
KiAbQueueAutoBoostDpc(v8);
}
}
}
}
*(_BYTE *)(a1 + 563) = a2;
v9 = *(_BYTE *)(a1 + 564);
if( v9 )
{
if( (v9 & 0xF) != 0 )
*(_DWORD *)(a1 + 872) = KUSER_SHARED_DATA.TickCount.LowPart;
*(_BYTE *)(a1 + 564) = 0;
}
if( a2 != *(char *)(a1 + 195) )
{
if( a1 != v5 || *((_BYTE *)CurrentPrcb + 32) )
{
updated = *(_QWORD *)(a1 + 72);
}
else
{
_disable();
updated = KiUpdateTotalCyclesCurrentThread((__int64)CurrentPrcb, a1, 0i64);
_enable();
}
v11 = updated + KiCyclesPerClockQuantum * (unsigned int)*(unsigned __int8 *)(a1 + 651);
if( (*(_DWORD *)(a1 + 120) & 0x20) != 0 )
_interlockedbittestandreset((volatile signed __int32 *)(a1 + 120), 5u);
*(_QWORD *)(a1 + 32) = v11;
ControlPrcb = 0i64;
ControlReadyQueue = 0i64;
v12 = (char)KiComputePriorityFloor(a1, a2);
if( *(char *)(a1 + 195) != v12 )
{
KiAcquireThreadStateLock((_ETHREAD *)a1, &ControlPrcb, &ControlReadyQueue);
v14 = 0;
v15 = *(char *)(a1 + 195);
switch( v13 )
{
case 2:
v16 = ControlPrcb;
v17 = *((_QWORD *)ControlPrcb + 2);
v51 = (_QWORD *)((char *)ControlPrcb + 16);
KiUpdateThreadPriority(ControlPrcb, (_KTHREAD *)a1, v12, v17 == 0);
v18 = (int)v12 <= v15;
if( (int)v12 < v15 )
{
if( !v17 )
{
v16 = ControlPrcb;
if( *(_BYTE *)(a1 + 388) != 2 )
{
v7 = v52;
if( *((_DWORD *)ControlPrcb + 7942) >> (v12 + 1) )
*(_BYTE *)(a1 + 112) |= 0x10u;
goto LABEL_19;
}
v19 = (_ETHREAD *)KiSelectReadyThreadEx(ControlPrcb, (_KTHREAD *)a1, 0);
v20 = v19;
if( v19 )
{
if( (*((_BYTE *)v19 + 2) & 4) != 0 )
{
KiIsThreadRankNonZero(v19, v16);
v30 = 1;
if( !v31 )
v30 = *((_BYTE *)v20 + 195);
}
else
{
v30 = *((_BYTE *)v19 + 195);
}
**((_BYTE **)v16 + 7) = v30;
v32 = *((_QWORD *)v16 + 4247);
if( v32 )
{
if( v20 == *((_ETHREAD **)v16 + 3) )
v33 = (unsigned int)KiVpThreadSystemWorkPriority;
else
v33 = (unsigned int)v30;
KiSetSchedulerAssistPriority((volatile INT32 *)v32, v33, 0);
v32 = *((_QWORD *)v16 + 4247);
}
v34 = v20 == *((_ETHREAD **)v16 + 3);
*v51 = v20;
if( v32 )
*(_BYTE *)(v32 + 16) = v34;
if( *((_BYTE *)v20 + 388) == 1 )
*((_DWORD *)v20 + 33) = *((_DWORD *)v20 + 33)
- *((_DWORD *)v20 + 109)
+ KUSER_SHARED_DATA.TickCount.LowPart;
v16 = ControlPrcb;
v7 = v52;
*((_BYTE *)v20 + 388) = 3;
v21 = 1;
goto LABEL_20;
}
goto LABEL_18;
}
v18 = (int)v12 <= v15;
}
if( v18 || v17 )
{
LABEL_18:
v7 = v52;
LABEL_19:
v21 = 0;
LABEL_20:
KiUpdateSharedReadyQueueAffinityThread(0i64, (_KTHREAD *)a1);
KiReleaseThreadStateLock(v22, (__int64)v16, (volatile signed __int64 *)ControlReadyQueue);
if( v21 )
{
v29 = *((unsigned int *)ControlPrcb + 9);
if( *((_DWORD *)KeGetPcr() + 105) != (_DWORD)v29 )
KiSendSoftwareInterrupt(v29, 2u);
}
if( v14 > 0 )
{
v25 = KeGetCurrentPrcb();
if( (KiVelocityFlags & 2) != 0 )
{
v26 = (int *)*((_QWORD *)ControlPrcb + 4247);
if( v26 )
{
if( *((_QWORD *)v25 + 4247) )
{
if( v25 != ControlPrcb && v14 >= 8 )
{
v43 = *v26;
v44 = *v26 & 0x40000;
if( (v43 & 0x100000) != 0 || v44 && (unsigned __int8)v43 < v14 )
{
v34 = HvlpVirtualProcessorsIdentityMapped == 0;
v45 = *((_QWORD *)v25 + 4247);
v46 = ControlPrcb;
*(_DWORD *)(v45 + 12) = 2;
v47 = *((unsigned int *)v46 + 9);
if( v34 )
LODWORD(v47) = (unsigned __int8)HvlpVirtualProcessorMapping[2 * (unsigned int)v47 + 1] | ((unsigned __int8)HvlpVirtualProcessorMapping[2 * v47] << 6);
*(_DWORD *)(v45 + 8) = v47;
__writemsr(0x400000C2u, (unsigned int)v47);
}
}
}
}
}
}
CurrentIrql = v48;
goto LABEL_23;
}
v16 = ControlPrcb;
v7 = v52;
if( *(_BYTE *)(a1 + 388) != 2 )
goto LABEL_19;
break;
case 1:
v16 = ControlPrcb;
KiRemoveThreadFromAnyReadyQueue(ControlPrcb, ControlReadyQueue, (_KTHREAD *)a1, (unsigned int)v15);
KiUpdateThreadPriority(0i64, (_KTHREAD *)a1, v12, 0);
KiPrepareReadyThreadForRescheduling((_KTHREAD *)a1, v12, &ReadyList);
goto LABEL_19;
case 3:
v16 = ControlPrcb;
KiUpdateThreadPriority(ControlPrcb, (_KTHREAD *)a1, v12, 1u);
if( (int)v12 < v15 )
{
v35 = (_ETHREAD *)KiSelectReadyThreadEx(v16, (_KTHREAD *)a1, 0);
v36 = v35;
if( v35 )
{
if( (*((_BYTE *)v35 + 2) & 4) != 0 )
{
KiIsThreadRankNonZero(v35, v16);
v37 = 1;
if( !v38 )
v37 = *((_BYTE *)v36 + 195);
}
else
{
v37 = *((_BYTE *)v35 + 195);
}
**((_BYTE **)v16 + 7) = v37;
v40 = *((_QWORD *)v16 + 4247);
if( v40 )
{
v41 = (unsigned int)KiVpThreadSystemWorkPriority;
if( v36 != *((_ETHREAD **)v16 + 3) )
v41 = (unsigned int)v37;
KiSetSchedulerAssistPriority(*((volatile INT32 **)v16 + 4247), v41, 0);
v40 = *((_QWORD *)v16 + 4247);
}
v42 = v36 == *((_ETHREAD **)v16 + 3);
*((_QWORD *)v16 + 2) = v36;
if( v40 )
*(_BYTE *)(v40 + 16) = v42;
if( *((_BYTE *)v36 + 388) == 1 )
*((_DWORD *)v36 + 33) = *((_DWORD *)v36 + 33)
- *((_DWORD *)v36 + 109)
+ KUSER_SHARED_DATA.TickCount.LowPart;
*((_BYTE *)v36 + 388) = 3;
KiInsertDeferredReadyList((INT64)&ReadyList, a1);
v16 = ControlPrcb;
}
goto LABEL_19;
}
break;
default:
KiUpdateThreadPriority(0i64, (_KTHREAD *)a1, v12, 0);
v16 = ControlPrcb;
goto LABEL_19;
}
v14 = v12;
goto LABEL_19;
}
}
LABEL_23:
v23 = *(volatile INT32 **)(a1 + 232);
if( v23 && (*(_BYTE *)v23 & 0x7F) == 21 )
KiPriQueueThreadPriorityChanged(v23, a1);
else
*(_QWORD *)(a1 + 64) = 0i64;
KiProcessDeferredReadyList((__int64)CurrentPrcb, &ReadyList, CurrentIrql);
return v7;
}Referenced by:
EtwpLogger
ExpWorkQueueManagerThread
IoApplyPriorityInfoThread
IopCreatePassiveInterruptRealtimeThreads
MiDeletePartitionResources
MiFlushAllHintedStorePages
MiMappedPageWriter
MiModifiedPageWriter
MiSetZeroPageThreadPriority
MiStoreUpdateMemoryConditions
MiWakeModifiedPageWriter
MiZeroLargePages
NtSetInformationThread
NtSetSystemInformation
PfpServiceMainThreadBoost
PfpServiceMainThreadUnboost
PopCreatePowerThread
PopFxEmergencyWorker
SMKM_STORE::SmStReadThread
SMKM_STORE::SmStWorkItemGet
SMKM_STORE::SmStWorkItemQueue
SMKM_STORE::SmStWorker
SMKM_STORE_MGR::SmCompressContextUpdateMemoryCondition
SMKM_STORE_MGR::SmCompressCtxBalancerThread
SMKM_STORE_MGR::SmCompressCtxWorkerThread
SMKM_STORE_MGR::SmUpdateMemoryConditions
SmKmStoreHelperWorker