KiRemoveThreadFromSchedulingGroup
VOID __stdcall KiRemoveThreadFromSchedulingGroup(_ETHREAD *Thread){
_ETHREAD *CurrentThread;
struct _KPRCB *CurrentPrcb;
char v4;
UINT8 v5;
UINT8 v6;
_KPRCB *v7;
_KPRCB *v8;
UINT64 SpinCount;
UINT64 v11;
_KPRCB *ControlPrcb;
_KSHARED_READY_QUEUE *ControlReadyQueue;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
ControlPrcb = 0i64;
ControlReadyQueue = 0i64;
CurrentPrcb = KeGetCurrentPrcb();
if( Thread == CurrentThread )
{
ControlPrcb = CurrentPrcb;
_disable();
KiUpdateTotalCyclesCurrentThread(CurrentPrcb, &Thread->Tcb, 0i64);
_enable();
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&CurrentPrcb->PrcbLock, 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( CurrentPrcb->PrcbLock );
}
_interlockedbittestandreset((volatile signed __int32 *)Thread, 0x12u);
Thread->Tcb.SchedulingGroup = 0i64;
KeUpdateThreadSchedulingProperties(&Thread->Tcb, 2u, CurrentPrcb);
_InterlockedAnd64((volatile signed __int64 *)&CurrentPrcb->PrcbLock, 0i64);
}
else
{
v4 = 0;
LODWORD(v11) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&Thread->Tcb.ThreadLock, 0i64) )
{
do
KeYieldProcessorEx(&v11);
while( Thread->Tcb.ThreadLock );
}
KiAcquireThreadStateLock(Thread, &ControlPrcb, &ControlReadyQueue);
v6 = v5;
if( (Thread->Tcb._bf_0 & 0x2000) != 0 )
{
KiRemoveThreadFromScbQueue(ControlPrcb, Thread->Tcb.QueuedScb, Thread, (unsigned int)Thread->Tcb.Priority);
v4 = 1;
}
_interlockedbittestandreset((volatile signed __int32 *)Thread, 0x12u);
Thread->Tcb.SchedulingGroup = 0i64;
if( (*(&Thread->Tcb.MiscFlags + 1) & 0x800) != 0 )
_interlockedbittestandreset((volatile signed __int32 *)&Thread->Tcb.116 + 1, 0xBu);
v7 = ControlPrcb;
KeUpdateThreadSchedulingProperties(&Thread->Tcb, v6, ControlPrcb);
if( v4 )
KiAddThreadToPrcbQueue(v7, &Thread->Tcb, (unsigned int)Thread->Tcb.Priority, 0i64, 0);
KiReleaseThreadStateLock(v8, (_KSHARED_READY_QUEUE *)v7);
KiReleaseThreadLockSafe((INT64)Thread);
}
}Referenced by:
KeTerminateThread
KiSetThreadSchedulingGroup