KiRemoveThreadFromSchedulingGroup
void __fastcall KiRemoveThreadFromSchedulingGroup(__int64 a1){
_ETHREAD *CurrentThread;
struct _KPRCB *CurrentPrcb;
char v4;
UINT8 v5;
UINT8 v6;
_KPRCB *v7;
__int64 v8;
UINT64 SpinCount;
UINT64 v11;
_KPRCB *ControlPrcb;
_KSHARED_READY_QUEUE *ControlReadyQueue;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
ControlPrcb = 0i64;
ControlReadyQueue = 0i64;
CurrentPrcb = KeGetCurrentPrcb();
if( (_ETHREAD *)a1 == CurrentThread )
{
ControlPrcb = CurrentPrcb;
_disable();
KiUpdateTotalCyclesCurrentThread((__int64)CurrentPrcb, a1, 0i64);
_enable();
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)CurrentPrcb + 12, 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *((_QWORD *)CurrentPrcb + 6) );
}
_interlockedbittestandreset((volatile signed __int32 *)a1, 0x12u);
*(_QWORD *)(a1 + 104) = 0i64;
KeUpdateThreadSchedulingProperties((_KTHREAD *)a1, 2u, CurrentPrcb);
_InterlockedAnd64((volatile signed __int64 *)CurrentPrcb + 6, 0i64);
}
else
{
v4 = 0;
LODWORD(v11) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)(a1 + 64), 0i64) )
{
do
KeYieldProcessorEx(&v11);
while( *(_QWORD *)(a1 + 64) );
}
KiAcquireThreadStateLock((_ETHREAD *)a1, &ControlPrcb, &ControlReadyQueue);
v6 = v5;
if( (*(_DWORD *)(a1 + 116) & 0x2000) != 0 )
{
KiRemoveThreadFromScbQueue(ControlPrcb, *(_QWORD *)(a1 + 944), a1);
v4 = 1;
}
_interlockedbittestandreset((volatile signed __int32 *)a1, 0x12u);
*(_QWORD *)(a1 + 104) = 0i64;
if( (*(_DWORD *)(a1 + 120) & 0x800) != 0 )
_interlockedbittestandreset((volatile signed __int32 *)(a1 + 120), 0xBu);
v7 = ControlPrcb;
KeUpdateThreadSchedulingProperties((_KTHREAD *)a1, v6, ControlPrcb);
if( v4 )
KiAddThreadToPrcbQueue((__int64)v7, a1, *(char *)(a1 + 195), 0, 0);
KiReleaseThreadStateLock(v8, (__int64)v7, (volatile signed __int64 *)ControlReadyQueue);
KiReleaseThreadLockSafe(a1);
}
}Referenced by:
KeTerminateThread
KiSetThreadSchedulingGroup