KeSetThreadChargeOnlySchedulingGroup
UINT8 __stdcall KeSetThreadChargeOnlySchedulingGroup(_ETHREAD *Thread, _KSCHEDULING_GROUP *SchedulingGroup){
struct _KPRCB *CurrentPrcb;
struct _KPRCB *v6;
__int64 v7;
UINT64 SpinCount;
if( (*((_DWORD *)Thread + 30) & 0x200) != 0 )
{
if( SchedulingGroup )
return 0;
}
else if( !SchedulingGroup || *((_QWORD *)Thread + 13) )
{
return 0;
}
KeGetCurrentIrql();
__writecr8(2ui64);
CurrentPrcb = KeGetCurrentPrcb();
_disable();
KiUpdateTotalCyclesCurrentThread((__int64)CurrentPrcb, (__int64)Thread, 0i64);
_enable();
v6 = KeGetCurrentPrcb();
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)CurrentPrcb + 12, 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *((_QWORD *)CurrentPrcb + 6) );
v7 = *((_QWORD *)v6 + 4247);
if( v7 && *((_BYTE *)v6 + 32) <= 1u )
++*(_DWORD *)(v7 + 24);
}
if( SchedulingGroup )
{
_interlockedbittestandset((volatile signed __int32 *)Thread + 30, 9u);
*((_QWORD *)Thread + 13) = SchedulingGroup;
_interlockedbittestandset((volatile signed __int32 *)Thread, 0x12u);
}
else
{
_interlockedbittestandreset((volatile signed __int32 *)Thread, 0x12u);
*((_QWORD *)Thread + 13) = 0i64;
_interlockedbittestandreset((volatile signed __int32 *)Thread + 30, 9u);
}
_InterlockedAnd64((volatile signed __int64 *)CurrentPrcb + 6, 0i64);
__writecr8(0i64);
return 1;
}Referenced by:
NtSetInformationThread
PsImpersonateContainerOfThread
PspExitThread