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