KiResetScb
VOID __stdcall KiResetScb(_KSCB *Scb){
_KPRCB *v1;
bool v2;
_KPRCB *v3;
_KSCB *v4;
volatile unsigned int *ShareRank;
_KSCB *Parent;
unsigned int Rank;
_KPRCB *v8;
unsigned __int64 Root;
*((_BYTE *)Scb + 112) &= 0xF1u;
v2 = (*((_BYTE *)Scb + 112) & 0x20) == 0;
v3 = v1;
v4 = Scb;
Scb->GenerationCycles = 0i64;
Scb->RankCycleTarget = 0i64;
Scb->LastReportedCycles = 0i64;
Scb->ReadyTime = 0i64;
Scb->Rank = 0;
if( v2 )
{
ShareRank = Scb->ShareRank;
if( ShareRank )
*ShareRank = 0;
}
else
{
Scb->OwnerShareRank = 0;
}
if( Scb->ReadySummary )
{
if( !Scb->Rank )
{
do
{
Parent = Scb->Parent;
if( !Parent )
break;
Scb = Scb->Parent;
}
while( !Parent->Rank );
}
Rank = Scb->Rank;
v8 = 0i64;
if( !Rank )
v8 = v1;
KiMoveScbThreadsToNewReadylist(v4, (_KSCB *)((unsigned __int64)Scb & -(__int64)(Rank != 0)), v8, 0i64);
if( (*((_BYTE *)v4 + 112) & 1) != 0 )
{
Root = (unsigned __int64)v4->ChildScbQueue.Root;
if( (v4->ChildScbQueue._bf_0 & 1) != 0 )
{
if( !Root )
{
LABEL_16:
KiRemoveSchedulingGroupQueue(v3, v4, 0);
return;
}
Root ^= (unsigned __int64)&v4->ChildScbQueue;
}
if( !Root )
goto LABEL_16;
}
}
}Referenced by:
KiUpdateCpuTargetByRate
KiUpdateCpuTargetByWeight