FsRtlpReleaseIrpsWaitingForRH
VOID __stdcall FsRtlpReleaseIrpsWaitingForRH(_NONOPAQUE_OPLOCK *Oplock){
_LIST_ENTRY *p_WaitingIrps;
_LIST_ENTRY *Flink;
char v4;
_LIST_ENTRY *p_RHBreakQueue;
_LIST_ENTRY *v6;
_WAITING_IRP *v7;
_LIST_ENTRY *v8;
_LIST_ENTRY *v9;
char v10;
p_WaitingIrps = &Oplock->WaitingIrps;
Flink = Oplock->WaitingIrps.Flink;
v4 = 1;
if( Flink != &Oplock->WaitingIrps )
{
p_RHBreakQueue = &Oplock->RHBreakQueue;
do
{
v6 = p_RHBreakQueue->Flink;
v7 = (_WAITING_IRP *)Flink;
if( p_RHBreakQueue->Flink == p_RHBreakQueue && (Oplock->OplockState & 0x10000) == 0 )
goto LABEL_17;
if( !BYTE4(Flink[3].Flink) )
{
if( (Oplock->OplockState & 0x10000) != 0 )
v6 = Oplock->AtomicQueue.Flink;
v8 = (_LIST_ENTRY *)((char *)Oplock + ((Oplock->OplockState & 0x10000) != 0 ? 120i64 : 72i64));
while( v6 != v8 )
{
v9 = (_LIST_ENTRY *)((char *)v6 - 56);
if( (Oplock->OplockState & 0x10000) == 0 )
v9 = v6;
FsRtlpOplockKeysEqual((_FILE_OBJECT *)Flink[3].Blink, (_FILE_OBJECT *)v9[1].Blink, 0i64);
if( !v10 )
{
v4 = 0;
break;
}
v6 = v6->Flink;
}
if( v4 )
{
LABEL_17:
Flink = Flink->Blink;
FsRtlpRemoveAndCompleteWaitingIrp(v7);
}
}
Flink = Flink->Flink;
}
while( Flink != p_WaitingIrps );
}
}Referenced by:
FsRtlCheckOplockEx2
FsRtlpAcknowledgeOplockBreakByCacheFlags
FsRtlpCancelOplockRHIrp
FsRtlpOplockBreakByCacheFlags
FsRtlpOplockCleanup
FsRtlpOplockFsctrlInternal