KiRemoveBoostThread

CHAR __stdcall KiRemoveBoostThread(_KPRCB *Prcb, _ETHREAD *Thread){
  struct _KPRCB *CurrentPrcb; 
  unsigned __int8 v5; 
  _KPRCB *v6; 
  char v7; 
  CHAR v8; 
  char v9; 
  unsigned int v10; 
  char v11; 
  char v12; 
  struct _KPRCB *v13; 
  __int64 v14; 
  int v15; 
  _KTHREAD *v16; 
  _ETHREAD *v17; 
  _KPRCB *v18; 
  volatile INT32 *v19; 
  char v21; 
  bool v22; 
  char v23; 
  _KSCB *v24; 
  UINT8 v25; 
  int v26; 
  __int64 v27; 
  int v28; 
  __int64 v29; 
  char v30; 
  __int64 v31; 
  char v32; 
  INT64 v33; 
  _QWORD *v34; 
  _QWORD *v35; 
  INT64 v36; 
  UINT64 SpinCount; 
  int v38; 
  UINT64 v39; 
  if( !*((_BYTE *)Thread + 564) )
    return *((_BYTE *)Thread + 195) + 1;
  CurrentPrcb = KeGetCurrentPrcb();
  LODWORD(SpinCount) = 0;
  while( _interlockedbittestandset64((volatile signed __int32 *)Thread + 16, 0i64) )
  {
    do
      KeYieldProcessorEx(&SpinCount);
    while( *((_QWORD *)Thread + 8) );
    v27 = *((_QWORD *)CurrentPrcb + 4247);
    if( v27 && *((_BYTE *)CurrentPrcb + 32) <= 1u )
      ++*(_DWORD *)(v27 + 24);
  }
  v5 = *((_BYTE *)Thread + 564);
  v6 = (_KPRCB *)*((unsigned __int8 *)Thread + 195);
  v7 = v5 & 0xF;
  v8 = (_BYTE)v6 - (v5 & 0xF);
  if( (v5 & 0xF) == 0 )
    v8 = *((_BYTE *)Thread + 195);
  v9 = v5 >> 4;
  if( v9 )
  {
    v10 = *((_DWORD *)Thread + 214);
    v11 = (_BYTE)v6 - v9;
    *((_BYTE *)Thread + 564) = v7;
    v38 = 0;
    if( v10 )
    {
      _BitScanReverse((unsigned int *)&v28, v10);
      if( v11 < v28 )
        v11 = v28;
      v38 = v28;
    }
    if( v11 != (_BYTE)v6 )
    {
      v12 = 0;
      v13 = KeGetCurrentPrcb();
      LODWORD(v39) = 0;
      while( _interlockedbittestandset64((volatile signed __int32 *)Prcb + 12, 0i64) )
      {
        do
          KeYieldProcessorEx(&v39);
        while( *((_QWORD *)Prcb + 6) );
        v29 = *((_QWORD *)v13 + 4247);
        if( v29 && *((_BYTE *)v13 + 32) <= 1u )
          ++*(_DWORD *)(v29 + 24);
      }
      if( !*((_QWORD *)Prcb + 2) )
      {
        if( *((_BYTE *)Thread + 195) == 31 )
          goto LABEL_16;
        if( (v14 = *((_QWORD *)Thread + 13), v15 = *((char *)Thread + 195), v14)
          && (v24 = (_KSCB *)(*((unsigned int *)Prcb + 54) + v14)) != 0i64
          && (Prcb == KeGetCurrentPrcb() || Thread != *((_ETHREAD **)Prcb + 1) ? (v25 = 1) : (v25 = 0),
              KiGetThreadEffectiveRankNonZero(Thread, v24, v6, v25, 0i64),
              v26) )
        {
          KiChooseLowestRankedThread(Prcb, Thread, (unsigned int)(v15 + 1));
        }
        else
        {
          v16 = (_ETHREAD *)KiSelectReadyThread((unsigned int)(v15 + 1), Prcb);
        }
        v17 = v16;
        if( v16 )
        {
          if( (*((_BYTE *)v16 + 2) & 4) == 0 || (KiIsThreadRankNonZero(v16, Prcb), v30 = 1, !v32) )
            v30 = *((_BYTE *)v17 + 195);
          **((_BYTE **)Prcb + 7) = v30;
          v31 = *((_QWORD *)Prcb + 4247);
          if( v31 )
          {
            v33 = (unsigned int)KiVpThreadSystemWorkPriority;
            if( v17 != *((_ETHREAD **)Prcb + 3) )
              v33 = (unsigned int)v30;
            KiSetSchedulerAssistPriority(*((volatile INT32 **)Prcb + 4247), v33, 0);
            v31 = *((_QWORD *)Prcb + 4247);
          }
          *((_QWORD *)Prcb + 2) = v17;
          if( v31 )
            *(_BYTE *)(v31 + 16) = v17 == *((_ETHREAD **)Prcb + 3);
          if( *((_BYTE *)v17 + 388) == 1 )
            *((_DWORD *)v17 + 33) = *((_DWORD *)v17 + 33) - *((_DWORD *)v17 + 109) + KUSER_SHARED_DATA.TickCount.LowPart;
          *((_BYTE *)v17 + 388) = 3;
        }
        else
        {
LABEL_16:
          v12 = 1;
        }
      }
      v18 = KeGetCurrentPrcb();
      if( v11 > *((char *)Thread + 195) )
      {
        if( *((_BYTE *)Thread + 793) )
        {
          v34 = (_QWORD *)((char *)Thread + 808);
          if( *((_QWORD *)Thread + 101) == 1i64 )
          {
            v35 = (_QWORD *)((char *)v18 + 34680);
            if( v18 != (_KPRCB *)-34680i64 )
            {
              *v34 = *v35;
              *v35 = v34;
              _InterlockedIncrement16((volatile signed __int16 *)Thread + 434);
              KiAbQueueAutoBoostDpc(v18);
            }
          }
        }
      }
      *((_BYTE *)Thread + 195) = v11;
      if( v12 )
      {
        if( (*((_BYTE *)Thread + 2) & 4) != 0 )
        {
          KiIsThreadRankNonZero(Thread, Prcb);
          v22 = v21 == 0;
          v23 = 1;
          if( v22 )
            v23 = *((_BYTE *)Thread + 195);
          v11 = v23;
        }
        **((_BYTE **)Prcb + 7) = v11;
        v19 = (volatile INT32 *)*((_QWORD *)Prcb + 4247);
        if( v19 )
        {
          v36 = (unsigned int)KiVpThreadSystemWorkPriority;
          if( Thread != *((_ETHREAD **)Prcb + 3) )
            v36 = (unsigned int)v11;
          KiSetSchedulerAssistPriority(v19, v36, 0);
        }
      }
      if( (*((_DWORD *)Thread + 30) & 0x400000) != 0 )
        KiSetSchedulerAssistPriority(*((volatile INT32 **)Thread + 121), (unsigned int)*((char *)Thread + 195), 1);
      _InterlockedAnd64((volatile signed __int64 *)Prcb + 6, 0i64);
    }
  }
  else
  {
    ++v8;
  }
  *((_QWORD *)Thread + 8) = 0i64;
  return v8;
}

Referenced by:

CcUnpinFileDataEx
ExpReleaseResourceExclusiveForThreadLite
ExpReleaseResourceSharedForThreadLite
KeGenericProcessorCallback
KeSetEventBoostPriorityEx
KeWakeWaitChain
KiCompleteDirectSwitchThread