KiDeferGroupSchedulingPreemption

VOID __stdcall KiDeferGroupSchedulingPreemption(_ETHREAD *CurrentThread, _KPRCB *CurrentPrcb){
  int v4; 
  __int64 v5; 
  _KPRCB *v6; 
  _KSCB *v7; 
  char v8; 
  char v9; 
  int v10; 
  INT64 v11; 
  UINT8 ShareRankNonZero; 
  UINT64 SpinCount; 
  if( *((_QWORD *)CurrentThread + 13) && KiShouldPreemptionBeDeferred((__int64)CurrentThread) )
  {
    v4 = 0;
    LODWORD(SpinCount) = 0;
    ShareRankNonZero = 0;
    while( _interlockedbittestandset64((volatile signed __int32 *)CurrentPrcb + 12, 0i64) )
    {
      do
        KeYieldProcessorEx(&SpinCount);
      while( *((_QWORD *)CurrentPrcb + 6) );
    }
    v5 = *((_QWORD *)CurrentPrcb + 2);
    if( *((_QWORD *)CurrentThread + 13)
      && v5 != *((_QWORD *)CurrentPrcb + 3)
      && KiPrcbInGroupAffinity((__int64)CurrentPrcb, (__int64)CurrentThread + 576)
      && ((v7 = *(_KSCB **)(v5 + 104)) != 0i64
       && (v7 = (_KSCB *)((char *)v7 + *((unsigned int *)CurrentPrcb + 54))) != 0i64
       && (KiGetThreadEffectiveRankNonZero((_ETHREAD *)v5, v7, v6, 1u, &ShareRankNonZero), (v4 = v10) != 0)
       || *(_BYTE *)(v5 + 195) <= *((_BYTE *)CurrentThread + 195)) )
    {
      *((_QWORD *)CurrentPrcb + 2) = 0i64;
      if( (*((_BYTE *)CurrentThread + 2) & 4) == 0 || (KiIsThreadRankNonZero(CurrentThread, CurrentPrcb), v8 = 1, !v9) )
        v8 = *((_BYTE *)CurrentThread + 195);
      **((_BYTE **)CurrentPrcb + 7) = v8;
      if( *((_QWORD *)CurrentPrcb + 4247) )
      {
        v11 = (unsigned int)KiVpThreadSystemWorkPriority;
        if( CurrentThread != *((_ETHREAD **)CurrentPrcb + 3) )
          v11 = (unsigned int)v8;
        KiSetSchedulerAssistPriority(*((volatile INT32 **)CurrentPrcb + 4247), v11, 0);
      }
      *(_BYTE *)(v5 + 388) = 1;
      if( v4 )
        KiAddThreadToScbQueue(CurrentPrcb, v7, (_KTHREAD *)v5, 1ui64);
      else
        KiAddThreadToPrcbQueue((__int64)CurrentPrcb, v5, *(char *)(v5 + 195), 1, ShareRankNonZero);
      _InterlockedAnd64((volatile signed __int64 *)CurrentPrcb + 6, 0i64);
      KiInsertDeferredPreemptionApc(CurrentPrcb, (_KTHREAD *)CurrentThread, 0);
    }
    else
    {
      _InterlockedAnd64((volatile signed __int64 *)CurrentPrcb + 6, 0i64);
    }
  }
}

Referenced by:

KiDispatchInterrupt