FsRtlpModifyThreadPriorities

VOID __stdcall FsRtlpModifyThreadPriorities(_NONOPAQUE_OPLOCK *Oplock, _RH_OP_CONTEXT *RHOpContext, UINT8 Boost){
  _ETHREAD *CurrentThread; 
  _ETHREAD *ExclusiveOplockOwnerThread; 
  unsigned int *p_OplockState; 
  _LIST_ENTRY *i; 

  if( Boost )
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    ExclusiveOplockOwnerThread = Oplock->ExclusiveOplockOwnerThread;
    if( ExclusiveOplockOwnerThread )
    {
      p_OplockState = &Oplock->OplockState;
    }
    else
    {
      if( !RHOpContext )
      {
LABEL_13:
        for( i = Oplock->RHBreakQueue.Flink; i != &Oplock->RHBreakQueue; i = i->Flink )
          FsRtlpDoBoost((_ETHREAD *)i[2].Blink, CurrentThread, &Oplock->WaiterPriority, (UINT64 *)&i[3], Oplock);
        return;
      }
      ExclusiveOplockOwnerThread = RHOpContext->OplockOwnerThread;
      p_OplockState = &RHOpContext->Flags;
    }
    if( ExclusiveOplockOwnerThread )
    {
      FsRtlpDoBoost(ExclusiveOplockOwnerThread, CurrentThread, &Oplock->WaiterPriority, (UINT64 *)p_OplockState, Oplock);
      return;
    }
    goto LABEL_13;
  }
  if( RHOpContext )
  {
    if( (RHOpContext->Flags & 0x20) != 0 )
    {
      PsBoostThreadIoEx(RHOpContext->OplockOwnerThread, 1u, 1u, Oplock);
      RHOpContext->Flags &= ~0x20u;
    }
  }
  else if( (Oplock->OplockState & 0x20) != 0 )
  {
    PsBoostThreadIoEx(Oplock->ExclusiveOplockOwnerThread, 1u, 1u, Oplock);
    Oplock->OplockState &= ~0x20u;
  }
}

Referenced by:

FsRtlUninitializeOplock
FsRtlpAcknowledgeOplockBreak
FsRtlpAcknowledgeOplockBreakByCacheFlags
FsRtlpCancelExclusiveIrp
FsRtlpOpBatchBreakClosePending
FsRtlpOplockBreakByCacheFlags
FsRtlpOplockBreakNotify
FsRtlpOplockBreakToII
FsRtlpOplockBreakToNone
FsRtlpOplockCleanup
FsRtlpRemoveAndBreakRHIrp
FsRtlpRemoveAndCompleteRHIrp