FsRtlpCancelOplockRHIrp
VOID __stdcall FsRtlpCancelOplockRHIrp(_IRP *Irp, UINT8 CallerAcquiredMutex, UINT8 ReleaseWaitingIrps){
_NONOPAQUE_OPLOCK *v5;
char v6;
_LIST_ENTRY *p_IrpOplocksRH;
_LIST_ENTRY *i;
int IsEnabled;
_LIST_ENTRY *Flink;
INT64 v11;
INT64 v12;
UINT64 v13;
v5 = (_NONOPAQUE_OPLOCK *)*((_QWORD *)Irp + 7);
_InterlockedExchange64((volatile __int64 *)Irp + 13, 0i64);
KeReleaseQueuedSpinLock(7ui64, *((_BYTE *)Irp + 69));
v6 = 0;
if( !CallerAcquiredMutex )
ExAcquireFastMutex(v5->FastMutex);
p_IrpOplocksRH = &v5->IrpOplocksRH;
for( i = v5->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((INT64)Flink, (INT64)v5, 3221225760i64, 0i64, v11, v12, 0);
}
else
{
LODWORD(v13) = 0;
LODWORD(v12) = 0;
LODWORD(v11) = 0;
FsRtlpRemoveAndBreakRHIrp(Flink, v5, 1u, 3221225760i64, v11, v12, v13, 0);
}
v6 = 1;
}
}
if( v6 )
{
if( ReleaseWaitingIrps )
FsRtlpReleaseIrpsWaitingForRH((INT64)v5);
if( p_IrpOplocksRH->Flink == p_IrpOplocksRH )
FsRtlpComputeShareableOplockState(v5);
}
if( !CallerAcquiredMutex )
KeReleaseGuardedMutex(v5->FastMutex);
}Referenced by:
FsRtlpOplockRHIrpCancelRoutine
FsRtlpRequestShareableOplock