FsRtlpCancelOplockRHIrp
VOID __stdcall FsRtlpCancelOplockRHIrp(_IRP *Irp, UINT8 CallerAcquiredMutex, UINT8 ReleaseWaitingIrps){
_NONOPAQUE_OPLOCK *Information;
char v6;
_LIST_ENTRY *p_IrpOplocksRH;
_LIST_ENTRY *i;
NTSTATUS IsEnabled;
_LIST_ENTRY *Flink;
INT64 v11;
INT64 v12;
UINT64 AccessMode;
Information = (_NONOPAQUE_OPLOCK *)Irp->IoStatus.Information;
_InterlockedExchange64((volatile __int64 *)&Irp->CancelRoutine, 0i64);
KeReleaseQueuedSpinLock(LockQueueIoCancelLock, Irp->CancelIrql);
v6 = 0;
if( !CallerAcquiredMutex )
ExAcquireFastMutex(Information->FastMutex);
p_IrpOplocksRH = &Information->IrpOplocksRH;
for( i = Information->IrpOplocksRH.Flink; i != p_IrpOplocksRH; i = i->Flink )
{
if( !i[3].Blink && BYTE4(i[1].Flink[4].Flink) )
{
i = i->Blink;
IsEnabled = Feature_Servicing_39887415__private_IsEnabled();
Flink = i->Flink;
if( IsEnabled )
{
LODWORD(v12) = 0;
LODWORD(v11) = 0;
FsRtlpRemoveAndCompleteRHIrp(Flink, Information, 3221225760i64, 0i64, v11, v12, 0);
}
else
{
LODWORD(AccessMode) = 0;
LODWORD(v12) = 0;
LODWORD(v11) = 0;
FsRtlpRemoveAndBreakRHIrp(Flink, Information, 1u, 3221225760i64, v11, v12, AccessMode, 0);
}
v6 = 1;
}
}
if( v6 )
{
if( ReleaseWaitingIrps )
FsRtlpReleaseIrpsWaitingForRH(Information);
if( p_IrpOplocksRH->Flink == p_IrpOplocksRH )
FsRtlpComputeShareableOplockState(Information);
}
if( !CallerAcquiredMutex )
KeReleaseGuardedMutex(Information->FastMutex);
}Referenced by:
FsRtlpOplockRHIrpCancelRoutine
FsRtlpRequestShareableOplock