KiGroupSchedulingQuantumEnd

VOID __stdcall KiGroupSchedulingQuantumEnd(
        _KPRCB *Prcb,
        _ETHREAD *Thread,
        UINT8 RoundRobin,
        _SINGLE_LIST_ENTRY *ReadyList){
  _KPRCB *v4; 
  UINT64 TickCountQuad; 
  char v8; 
  struct _KPRCB *CurrentPrcb; 
  char v10; 
  __int64 v11; 
  _KSCB *v12; 
  __int64 v13; 
  _KSCHEDULING_GROUP *v14; 
  INT64 v15; 
  char v16; 
  char v17; 
  _KSCB *v18; 
  _ETHREAD *v19; 
  INT64 v20; 
  int v21; 
  _KTHREAD *v22; 
  _ETHREAD *v23; 
  struct _KPRCB *v24; 
  __int64 v25; 
  __int64 v26; 
  _KPRCB *v27; 
  __int64 v28; 
  __int64 v29; 
  char v30; 
  __int64 v31; 
  char v32; 
  INT64 v33; 
  char v34; 
  char v35; 
  __int64 v36; 
  INT64 v37; 
  bool v38; 
  _KSCB *v39; 
  _KSCB *v40; 
  int v41; 
  UINT8 ShareRankNonZero; 
  UINT64 SpinCount; 
  __int64 v44; 
  _ETHREAD *Threada; 
  char v46; 
  v4 = 0i64;
  v44 = 0i64;
  ShareRankNonZero = 0;
  v46 = 0;
  TickCountQuad = KUSER_SHARED_DATA.TickCountQuad;
  v8 = 0;
  CurrentPrcb = KeGetCurrentPrcb();
  v10 = 0;
  LODWORD(SpinCount) = 0;
  while( _interlockedbittestandset64((volatile signed __int32 *)Prcb + 12, 0i64) )
  {
    do
      KeYieldProcessorEx(&SpinCount);
    while( *((_QWORD *)Prcb + 6) );
    v29 = *((_QWORD *)CurrentPrcb + 4247);
    if( v29 && *((_BYTE *)CurrentPrcb + 32) <= 1u )
      ++*(_DWORD *)(v29 + 24);
  }
  v11 = *((_QWORD *)Prcb + 2);
  v12 = 0i64;
  Threada = (_ETHREAD *)v11;
  if( v11 )
  {
    v12 = *(_KSCB **)(v11 + 104);
    if( v12 )
      v12 = (_KSCB *)((char *)v12 + *((unsigned int *)Prcb + 54));
  }
  if( TickCountQuad > *((_QWORD *)Prcb + 4203) )
  {
    KiGroupSchedulingGenerationEnd(Prcb, TickCountQuad, 0);
    return;
  }
  v13 = *((_QWORD *)Thread + 13);
  v14 = (_KSCHEDULING_GROUP *)v13;
  v44 = v13;
  if( v13 )
  {
    v15 = *((unsigned int *)Prcb + 54) + v13;
    if( v15 )
    {
      while( 1 )
      {
        v16 = *(_BYTE *)(v15 + 112);
        if( (v16 & 4) != 0 )
          break;
        KiComputeGroupSchedulingRank(v14, Prcb, (_KSCB *)v15);
        if( (*(_BYTE *)(v15 + 112) & 4) == 0 )
          goto LABEL_16;
        v10 = 1;
        v8 = 1;
        if( v12 != (_KSCB *)v15 )
          goto LABEL_16;
        v17 = 1;
        v46 = 1;
LABEL_17:
        v15 = *(_QWORD *)(v15 + 408);
        if( !v15 )
        {
          v18 = (_KSCB *)*((_QWORD *)Thread + 13);
          v19 = Threada;
          if( v18 )
            v18 = (_KSCB *)((char *)v18 + *((unsigned int *)Prcb + 54));
          if( !v10 || Threada )
          {
            if( v8 && Threada && v12 )
            {
              if( v12 == v18 )
                goto LABEL_39;
              while( v12 )
              {
                v12 = v12->Parent;
                if( v12 == v18 )
                  goto LABEL_39;
              }
              if( !v18 || v17 )
              {
LABEL_39:
                KiChooseLowestRankedThread(Prcb, Threada, (unsigned int)(*((char *)Threada + 195) + 1));
                v28 = v26;
                if( v26 )
                {
                  *((_BYTE *)v19 + 388) = 1;
                  *((_DWORD *)v19 + 109) = KUSER_SHARED_DATA.TickCount.LowPart;
                  if( (*(_BYTE *)(v26 + 2) & 4) == 0 || (KiIsThreadRankNonZero((_ETHREAD *)v26, Prcb), v34 = 1, !v35) )
                    v34 = *(_BYTE *)(v28 + 195);
                  **((_BYTE **)Prcb + 7) = v34;
                  v36 = *((_QWORD *)Prcb + 4247);
                  if( v36 )
                  {
                    v37 = (unsigned int)KiVpThreadSystemWorkPriority;
                    if( v28 != *((_QWORD *)Prcb + 3) )
                      v37 = (unsigned int)v34;
                    KiSetSchedulerAssistPriority(*((volatile INT32 **)Prcb + 4247), v37, 0);
                    v36 = *((_QWORD *)Prcb + 4247);
                  }
                  v38 = v28 == *((_QWORD *)Prcb + 3);
                  *((_QWORD *)Prcb + 2) = v28;
                  if( v36 )
                    *(_BYTE *)(v36 + 16) = v38;
                  if( *(_BYTE *)(v28 + 388) == 1 )
                    *(_DWORD *)(v28 + 132) = *(_DWORD *)(v28 + 132)
                                           - *(_DWORD *)(v28 + 436)
                                           + KUSER_SHARED_DATA.TickCount.LowPart;
                  *(_BYTE *)(v28 + 388) = 3;
                  v39 = (_KSCB *)*((_QWORD *)v19 + 13);
                  if( v39 )
                    v39 = (_KSCB *)((char *)v39 + *((unsigned int *)Prcb + 54));
                  KiGetThreadEffectiveRankNonZero(v19, v39, v27, 1u, &ShareRankNonZero);
                  if( v41 )
                    KiAddThreadToScbQueue(Prcb, v40, (_KTHREAD *)v19, 1ui64);
                  else
                    KiAddThreadToPrcbQueue((__int64)Prcb, (__int64)v19, *((char *)v19 + 195), 1, ShareRankNonZero);
                }
              }
            }
          }
          else
          {
            KiGetThreadEffectiveRankNonZero(Thread, v18, v4, 1u, 0i64);
            v20 = (unsigned int)*((char *)Thread + 195);
            if( v21 )
              KiChooseLowestRankedThread(Prcb, Thread, (unsigned int)v20);
            else
              v22 = (_ETHREAD *)KiSelectReadyThread(v20, Prcb);
            v23 = v22;
            if( v22 )
            {
              if( (*((_BYTE *)v22 + 2) & 4) == 0 || (KiIsThreadRankNonZero(v22, Prcb), v30 = 1, !v32) )
                v30 = *((_BYTE *)v23 + 195);
              **((_BYTE **)Prcb + 7) = v30;
              v31 = *((_QWORD *)Prcb + 4247);
              if( v31 )
              {
                v33 = (unsigned int)KiVpThreadSystemWorkPriority;
                if( v23 != *((_ETHREAD **)Prcb + 3) )
                  v33 = (unsigned int)v30;
                KiSetSchedulerAssistPriority(*((volatile INT32 **)Prcb + 4247), v33, 0);
                v31 = *((_QWORD *)Prcb + 4247);
              }
              *((_QWORD *)Prcb + 2) = v23;
              if( v31 )
                *(_BYTE *)(v31 + 16) = v23 == *((_ETHREAD **)Prcb + 3);
              if( *((_BYTE *)v23 + 388) == 1 )
                *((_DWORD *)v23 + 33) = *((_DWORD *)v23 + 33)
                                      - *((_DWORD *)v23 + 109)
                                      + KUSER_SHARED_DATA.TickCount.LowPart;
              *((_BYTE *)v23 + 388) = 3;
            }
          }
          if( v18 )
          {
            if( KiShouldPreemptionBeDeferred((__int64)Thread) )
            {
              if( (*((_DWORD *)Thread + 30) & 0xC00) == 0 )
              {
                _InterlockedAnd64((volatile signed __int64 *)Prcb + 6, 0i64);
                KiInsertDeferredPreemptionApc(Prcb, (_KTHREAD *)Thread, 0);
                v24 = KeGetCurrentPrcb();
                HIDWORD(SpinCount) = 0;
                while( _interlockedbittestandset64((volatile signed __int32 *)Prcb + 12, 0i64) )
                {
                  do
                    KeYieldProcessorEx((UINT64 *)((char *)&SpinCount + 4));
                  while( *((_QWORD *)Prcb + 6) );
                  v25 = *((_QWORD *)v24 + 4247);
                  if( v25 )
                  {
                    if( *((_BYTE *)v24 + 32) <= 1u )
                      ++*(_DWORD *)(v25 + 24);
                  }
                }
              }
            }
            else if( KiCheckForMaxOverQuotaScb((__int64)v18) && !*((_QWORD *)Prcb + 2) )
            {
              KiSelectNextThread(Prcb, ReadyList);
            }
          }
          return;
        }
        v14 = (_KSCHEDULING_GROUP *)(v15 - *((unsigned int *)Prcb + 54));
        v44 = (__int64)v14;
      }
      if( (v16 & 2) == 0 )
      {
        if( KiCheckMaxOverQuotaTransition(v15, (volatile INT64 *)v14) )
        {
          if( (*(_BYTE *)(v15 + 112) & 1) != 0 )
            KiRemoveSchedulingGroupQueue(Prcb, (_KSCB *)v15, 1u);
        }
        else
        {
          if( *(_QWORD *)v15 < *(_QWORD *)(v15 + 24) )
          {
            if( RoundRobin )
              v10 = 1;
            goto LABEL_16;
          }
          KiRecomputeGroupSchedulingRank(v14, (_KSCB *)v15, Prcb);
          if( v12 == (_KSCB *)v15 )
          {
            v10 = 1;
            v46 = 1;
            v8 = 1;
            goto LABEL_16;
          }
        }
      }
      v10 = 1;
      v8 = 1;
LABEL_16:
      v17 = v46;
      goto LABEL_17;
    }
  }
}

Referenced by:

KiQuantumEnd