FsRtlpCancelReadOnlyOplockIrp
VOID __stdcall FsRtlpCancelReadOnlyOplockIrp(_IRP *Irp, UINT8 CallerAcquiredMutex){
_NONOPAQUE_OPLOCK *Information;
char v4;
_LIST_ENTRY *i;
Information = (_NONOPAQUE_OPLOCK *)Irp->IoStatus.Information;
_InterlockedExchange64((volatile __int64 *)&Irp->CancelRoutine, 0i64);
KeReleaseQueuedSpinLock(LockQueueIoCancelLock, Irp->CancelIrql);
v4 = 0;
if( !CallerAcquiredMutex )
ExAcquireFastMutex(Information->FastMutex);
for( i = Information->IrpOplocksR.Flink; i != &Information->IrpOplocksR; i = i->Flink )
{
if( BYTE4(i[-7].Blink) )
{
i = i->Blink;
FsRtlpRemoveAndCompleteReadOnlyIrp(i->Flink, 3221225760i64, 0i64);
v4 = 1;
}
}
if( v4 )
FsRtlpComputeShareableOplockState(Information);
if( !CallerAcquiredMutex )
KeReleaseGuardedMutex(Information->FastMutex);
}Referenced by:
FsRtlpAcknowledgeOplockBreak
FsRtlpReadOnlyOplockIrpCancelRoutine
FsRtlpRequestShareableOplock