KiGroupSchedulingGenerationEnd

VOID __stdcall KiGroupSchedulingGenerationEnd(_KPRCB *Prcb, UINT64 CurrentTick, UINT8 Parking){
  __int64 v3; 
  __int64 v5; 
  __int64 v8; 
  int v9; 
  INT64 v10; 
  _KTHREAD *v11; 
  _ETHREAD *v12; 
  __int64 v13; 
  char v14; 
  int v15; 
  char v16; 
  __int64 v17; 
  bool v18; 
  UINT64 v19; 
  UINT64 v20; 
  char v21; 
  char v22; 
  INT64 v23; 
  INT64 v24; 
  v3 = *((_QWORD *)Prcb + 1);
  v5 = *((_QWORD *)Prcb + 3);
  if( !Parking )
  {
    _disable();
    KiEndThreadCycleAccumulation(Prcb, *((_KTHREAD **)Prcb + 1), 0i64);
    _enable();
  }
  KiTransitionSchedulingGroupGeneration((__int64)Prcb, CurrentTick, Parking);
  if( !Parking )
  {
    v8 = *((_QWORD *)Prcb + 2);
    v9 = 0;
    if( v8 )
    {
      if( v8 == *((_QWORD *)Prcb + 3) )
        goto LABEL_9;
      *((_QWORD *)Prcb + 2) = 0i64;
      if( (*(_BYTE *)(v3 + 2) & 4) == 0 || (KiIsThreadRankNonZero((_ETHREAD *)v3, Prcb), v14 = 1, !v22) )
        v14 = *(_BYTE *)(v3 + 195);
      **((_BYTE **)Prcb + 7) = v14;
      if( *((_QWORD *)Prcb + 4247) )
      {
        v23 = (unsigned int)KiVpThreadSystemWorkPriority;
        if( v3 != *((_QWORD *)Prcb + 3) )
          v23 = (unsigned int)v14;
        KiSetSchedulerAssistPriority(*((volatile INT32 **)Prcb + 4247), v23, 0);
      }
      *(_BYTE *)(v8 + 388) = 1;
      v15 = *(char *)(v8 + 195);
      *(_DWORD *)(v8 + 436) = KUSER_SHARED_DATA.TickCount.LowPart;
      KiAddThreadToPrcbQueue((__int64)Prcb, v8, v15, 1, 0);
      v9 = 1;
    }
    if( v8 == *((_QWORD *)Prcb + 3) )
      goto LABEL_9;
    if( v3 == v5 )
    {
      v10 = 0i64;
    }
    else
    {
      v10 = (unsigned int)(*(char *)(v3 + 195) + 1);
      if( (int)v10 > 31 )
        goto LABEL_9;
    }
    v11 = (_ETHREAD *)KiSelectReadyThread(v10, Prcb);
    v12 = v11;
    if( v11 )
    {
      if( (*((_BYTE *)v11 + 2) & 4) != 0 )
      {
        KiIsThreadRankNonZero(v11, Prcb);
        v16 = 1;
        if( !v21 )
          v16 = *((_BYTE *)v12 + 195);
      }
      else
      {
        v16 = *((_BYTE *)v11 + 195);
      }
      **((_BYTE **)Prcb + 7) = v16;
      v17 = *((_QWORD *)Prcb + 4247);
      if( v17 )
      {
        v24 = (unsigned int)KiVpThreadSystemWorkPriority;
        if( v12 != *((_ETHREAD **)Prcb + 3) )
          v24 = (unsigned int)v16;
        KiSetSchedulerAssistPriority(*((volatile INT32 **)Prcb + 4247), v24, 0);
        v17 = *((_QWORD *)Prcb + 4247);
      }
      v18 = v12 == *((_ETHREAD **)Prcb + 3);
      *((_QWORD *)Prcb + 2) = v12;
      if( v17 )
        *(_BYTE *)(v17 + 16) = v18;
      if( *((_BYTE *)v12 + 388) == 1 )
        *((_DWORD *)v12 + 33) = *((_DWORD *)v12 + 33) - *((_DWORD *)v12 + 109) + KUSER_SHARED_DATA.TickCount.LowPart;
      *((_BYTE *)v12 + 388) = 3;
      --v9;
    }
LABEL_9:
    if( v3 != v5 )
    {
LABEL_10:
      _disable();
      KiStartThreadCycleAccumulation(Prcb, (_KTHREAD *)v3, v3 == v5);
      _enable();
      return;
    }
    if( v9 > 0 )
    {
      if( (*((_BYTE *)Prcb + 35) & 1) != 0 )
      {
        v19 = 1i64;
        v20 = 1i64;
LABEL_36:
        KiSetProcessorIdle(Prcb, v20, v19);
      }
    }
    else if( v9 < 0 && (*((_BYTE *)Prcb + 35) & 1) == 0 )
    {
      v19 = 0i64;
      v20 = 0i64;
      goto LABEL_36;
    }
    v13 = *((_QWORD *)Prcb + 2);
    if( !v13 || v13 == *((_QWORD *)Prcb + 3) )
    {
      if( (*((_BYTE *)Prcb + 35) & 1) == 0 )
        goto LABEL_10;
    }
    else if( (*((_BYTE *)Prcb + 35) & 1) != 0 )
    {
      goto LABEL_10;
    }
    __fastfail(0x1Eu);
  }
}

Referenced by:

KeTransitionProcessorParkState
KiGroupSchedulingQuantumEnd