KiAbSetMinimumThreadPriority
__int64 __fastcall KiAbSetMinimumThreadPriority(__int64 a1, __int64 a2, __int64 a3, _QWORD *a4, _QWORD *a5, _DWORD *a6){
__int64 v7;
unsigned int v8;
int v9;
CHAR CpuPriorityKey;
void *v11;
void *v12;
_DWORD *v13;
char *v14;
ULONG_PTR v15;
UINT64 *v16;
__int64 v17;
int v18;
char v20;
int v21;
int v22;
UINT64 SpinCount[10];
v7 = a1 - 16i64 * *(unsigned __int8 *)(a1 + 24);
PsGetIoPriorityThread(v7);
v8 = 0;
v9 = 0;
*a6 = 0;
CpuPriorityKey = KiAbEntryGetCpuPriorityKey((unsigned __int8 *)a1);
v15 = *v14;
if( CpuPriorityKey < (char)v15 )
{
*(_WORD *)(a1 + 88) ^= (*(_WORD *)(a1 + 88) ^ (*(_WORD *)(a1 + 88) & 0x7FFF | (1 << (v15 - 1)))) & 0x7FFF;
LODWORD(SpinCount[0]) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)(v7 + 64), 0i64) )
{
do
KeYieldProcessorEx(SpinCount);
while( *(_QWORD *)(v7 + 64) );
}
v20 = *(_BYTE *)(v15 + v7 + 824);
if( v20 == -1 )
KeBugCheckEx(0x157u, v7, v15, 1ui64, 0i64);
*(_BYTE *)(v15 + v7 + 824) = v20 + 1;
v9 = 0;
*(_DWORD *)(v7 + 856) |= 1 << v15;
if( *(char *)(v7 + 195) < (char)v15 )
{
KiSetPriorityThread((_KTHREAD *)v7, (_SINGLE_LIST_ENTRY *)a3, (unsigned int)v15);
v9 = 1;
}
KiReleaseThreadLockSafe(v7);
v13 = a6;
}
else
{
LOBYTE(v15) = 0;
}
PsGetBaseIoPriorityThread((KDPC *)v7, v11, v12, v13);
if( v18 < *(char *)(v17 + 1) && *(__int16 *)(a1 + 88) >= 0 )
{
KiAbThreadBoostIoPriority((_ETHREAD *)v7, (_SINGLE_LIST_ENTRY *)a5, 0i64, v16);
if( v21 )
{
*(_WORD *)(a1 + 88) |= 0x8000u;
v9 = 1;
}
}
if( (*(_DWORD *)(v7 + 1368) == 0) < *(char *)(a2 + 2) && (*(_BYTE *)(a1 + 90) & 1) == 0 )
{
KiAbThreadBoostIoPriority((_ETHREAD *)v7, (_SINGLE_LIST_ENTRY *)a5, 1ui64, (UINT64 *)a6);
if( v22 )
{
*(_WORD *)(a1 + 90) |= 1u;
v9 = 1;
}
}
if( a4 && v9 && *(_BYTE *)(v7 + 793) )
KiAbThreadInsertList((_KTHREAD *)v7, (_SINGLE_LIST_ENTRY *)a4, (_SINGLE_LIST_ENTRY *)(v7 + 808));
LOBYTE(v8) = (_BYTE)v15 != 0;
return v8;
}Referenced by:
KiAbCpuBoostOwners
KiAbIoBoostOwners
KiAbProcessContextSwitch
KiAbProcessThreadLocks