KiSetBasePriorityAndClearDecrement
NTSTATUS __stdcall KiSetBasePriorityAndClearDecrement(_ETHREAD *Thread, INT64 *NewBase, UINT64 ClearForegroundOnly){
NTSTATUS v3;
int v4;
char v7;
_KPRCB *CurrentPrcb;
char v9;
_QWORD *v11;
_QWORD *v12;
v3 = 0;
v4 = ClearForegroundOnly;
if( NewBase )
{
v7 = *(_BYTE *)NewBase;
CurrentPrcb = KeGetCurrentPrcb();
if( *(_BYTE *)NewBase < *((_BYTE *)Thread + 563) )
{
if( *((_BYTE *)Thread + 871) )
{
v11 = (_QWORD *)((char *)Thread + 816);
if( *((_QWORD *)Thread + 102) == 1i64 )
{
v12 = (_QWORD *)((char *)CurrentPrcb + 34672);
if( CurrentPrcb != (_KPRCB *)-34672i64 )
{
*v11 = *v12;
*v12 = v11;
_InterlockedAdd16((volatile signed __int16 *)Thread + 434, 1u);
KiAbQueueAutoBoostDpc(CurrentPrcb);
v7 = *(_BYTE *)NewBase;
}
}
}
}
*((_BYTE *)Thread + 563) = v7;
v3 = *(_DWORD *)NewBase;
}
v9 = *((_BYTE *)Thread + 564);
if( v9 )
{
if( (v9 & 0xF) != 0 )
*((_DWORD *)Thread + 218) = KUSER_SHARED_DATA.TickCount.LowPart;
if( v4 )
{
v3 = *((char *)Thread + 195) - (*((_BYTE *)Thread + 564) & 0xF);
*((_BYTE *)Thread + 564) &= 0xF0u;
}
else
{
*((_BYTE *)Thread + 564) = 0;
}
}
return v3;
}Referenced by:
KeRemovePriQueue
KeSetPriorityAndQuantumProcess
KiDeferredReadySingleThread
KiDirectSwitchThread
KiUpdateVPBackingThreadPriority
KiUpdateVpBackingThreadPriorityFromTopLevel