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