KiSetThreadSchedulingGroup
VOID __fastcall KiSetThreadSchedulingGroup(INT64 a1, INT64 a2){
struct _KPRCB *CurrentPrcb;
_KPRCB *v5;
UINT8 v6;
UINT8 v7;
__int64 v8;
_KSHARED_READY_QUEUE *v9;
INT64 v10[2];
UINT64 SpinCount;
_KSHARED_READY_QUEUE *ControlReadyQueue;
_KPRCB *ControlPrcb;
ControlPrcb = 0i64;
ControlReadyQueue = 0i64;
if( a2 )
{
CurrentPrcb = 0i64;
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)(a1 + 64), 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *(_QWORD *)(a1 + 64) );
}
KiAcquireThreadStateLock((_ETHREAD *)a1, &ControlPrcb, &ControlReadyQueue);
*(_QWORD *)(a1 + 104) = a2;
_interlockedbittestandset((volatile signed __int32 *)a1, 0x12u);
v5 = ControlPrcb;
v7 = v6;
KeUpdateThreadSchedulingProperties((_KTHREAD *)a1, v6, ControlPrcb);
v9 = ControlReadyQueue;
if( v7 == 1 && ControlReadyQueue && (*(_DWORD *)(a1 + 120) & 0x2000) == 0 )
{
CurrentPrcb = KeGetCurrentPrcb();
KiRemoveThreadFromSharedReadyQueue((__int64)ControlReadyQueue, a1, *(_BYTE *)(a1 + 195));
KiEnterDeferredReadyState(a1);
v5 = ControlPrcb;
}
KiReleaseThreadStateLock(v8, (__int64)v5, (volatile signed __int64 *)v9);
KiReleaseThreadLockSafe(a1);
if( CurrentPrcb )
{
*(_QWORD *)(a1 + 216) = 0i64;
v10[0] = a1 + 216;
KiReadyDeferredReadyList(CurrentPrcb, v10);
}
}
else
{
KiRemoveThreadFromSchedulingGroup(a1);
}
}Referenced by:
KeSetProcessSchedulingGroup