KeSetThreadChargeOnlySchedulingGroup
UINT8 __stdcall KeSetThreadChargeOnlySchedulingGroup(_ETHREAD *Thread, _KSCHEDULING_GROUP *SchedulingGroup){
struct _KPRCB *CurrentPrcb;
struct _KPRCB *v6;
_DWORD *SchedulerAssist;
UINT64 SpinCount;
if( (*(&Thread->Tcb.MiscFlags + 1) & 0x200) != 0 )
{
if( SchedulingGroup )
return 0;
}
else if( !SchedulingGroup || Thread->Tcb.SchedulingGroup )
{
return 0;
}
KeGetCurrentIrql();
__writecr8(2ui64);
CurrentPrcb = KeGetCurrentPrcb();
_disable();
KiUpdateTotalCyclesCurrentThread(CurrentPrcb, &Thread->Tcb, 0i64);
_enable();
v6 = KeGetCurrentPrcb();
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&CurrentPrcb->PrcbLock, 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( CurrentPrcb->PrcbLock );
SchedulerAssist = v6->SchedulerAssist;
if( SchedulerAssist && v6->NestingLevel <= 1u )
++SchedulerAssist[6];
}
if( SchedulingGroup )
{
_interlockedbittestandset((volatile signed __int32 *)&Thread->Tcb.116 + 1, 9u);
Thread->Tcb.SchedulingGroup = SchedulingGroup;
_interlockedbittestandset((volatile signed __int32 *)Thread, 0x12u);
}
else
{
_interlockedbittestandreset((volatile signed __int32 *)Thread, 0x12u);
Thread->Tcb.SchedulingGroup = 0i64;
_interlockedbittestandreset((volatile signed __int32 *)&Thread->Tcb.116 + 1, 9u);
}
_InterlockedAnd64((volatile signed __int64 *)&CurrentPrcb->PrcbLock, 0i64);
__writecr8(0i64);
return 1;
}Referenced by:
NtSetInformationThread
PsImpersonateContainerOfThread
PspExitThread