KiSetThreadSchedulingGroup
VOID __stdcall KiSetThreadSchedulingGroup(_ETHREAD *Thread, _KSCHEDULING_GROUP *SchedulingGroup){
_KPRCB *CurrentPrcb;
_KPRCB *v5;
UINT8 v6;
UINT8 v7;
_KPRCB *v8;
_SINGLE_LIST_ENTRY ReadyList;
UINT64 SpinCount;
_KSHARED_READY_QUEUE *ControlReadyQueue;
_KPRCB *ControlPrcb;
ControlPrcb = 0i64;
ControlReadyQueue = 0i64;
if( SchedulingGroup )
{
CurrentPrcb = 0i64;
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&Thread->Tcb.ThreadLock, 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( Thread->Tcb.ThreadLock );
}
KiAcquireThreadStateLock(Thread, &ControlPrcb, &ControlReadyQueue);
Thread->Tcb.SchedulingGroup = SchedulingGroup;
_interlockedbittestandset((volatile signed __int32 *)Thread, 0x12u);
v5 = ControlPrcb;
v7 = v6;
KeUpdateThreadSchedulingProperties(&Thread->Tcb, v6, ControlPrcb);
if( v7 == 1 && ControlReadyQueue && (*(&Thread->Tcb.MiscFlags + 1) & 0x2000) == 0 )
{
CurrentPrcb = KeGetCurrentPrcb();
KiRemoveThreadFromSharedReadyQueue(ControlReadyQueue, &Thread->Tcb, (unsigned int)Thread->Tcb.Priority);
KiEnterDeferredReadyState((INT64)Thread);
v5 = ControlPrcb;
}
KiReleaseThreadStateLock(v8, (_KSHARED_READY_QUEUE *)v5);
KiReleaseThreadLockSafe((INT64)Thread);
if( CurrentPrcb )
{
*(_QWORD *)Thread->Tcb.gapD8 = 0i64;
ReadyList.Next = (_SINGLE_LIST_ENTRY *)Thread->Tcb.gapD8;
KiReadyDeferredReadyList(CurrentPrcb, &ReadyList);
}
}
else
{
KiRemoveThreadFromSchedulingGroup(&Thread->Tcb);
}
}Referenced by:
KeSetProcessSchedulingGroup