FsRtlpRemoveAndBreakRHIrp

VOID __fastcall FsRtlpRemoveAndBreakRHIrp(
        _LIST_ENTRY *Link,
        _NONOPAQUE_OPLOCK *Oplock,
        UINT8 RemoveCancelRoutine,
        INT64 CompletionStatus,
        UINT64 NewOplockLevel,
        UINT64 OutputFlags,
        UINT64 AccessMode,
        UINT16 ShareMode){
  _LIST_ENTRY *Flink; 
  int v9; 
  _LIST_ENTRY *Blink; 
  __int64 v13; 
  int v14; 
  Flink = Link[1].Flink;
  v9 = CompletionStatus;
  Link[1].Flink = 0i64;
  if( RemoveCancelRoutine )
  {
    BYTE5(Flink[4].Flink) = KeAcquireQueuedSpinLock(7ui64);
    _InterlockedExchange64((volatile __int64 *)&Flink[6].Blink, 0i64);
    KeReleaseQueuedSpinLock(7ui64, BYTE5(Flink[4].Flink));
  }
  FsRtlpOplockDequeueRH((_RH_OP_CONTEXT *)Link);
  if( BYTE4(Flink[4].Flink) )
  {
    ObfDereferenceObjectWithTag(Link[1].Blink, 0x746C6644ui64);
    if( Link[2].Blink )
      FsRtlpClearOwner((INT64)Oplock, (INT64)Link);
    ExFreePoolWithTag(Link, 0);
    v13 = 0i64;
  }
  else
  {
    Blink = Flink[1].Blink;
    v13 = 24i64;
    Blink[1].Flink = 0i64;
    LODWORD(Blink->Flink) = 1572865;
    HIDWORD(Blink->Flink) = 3;
    LODWORD(Blink->Blink) = ((unsigned int)NewOplockLevel >> 12) & 7;
    HIDWORD(Blink->Blink) = OutputFlags;
    if( (OutputFlags & 2) != 0 )
    {
      LODWORD(Blink[1].Flink) = AccessMode;
      WORD2(Blink[1].Flink) = ShareMode;
    }
    if( (OutputFlags & 1) != 0 )
    {
      LODWORD(Link[3].Flink) = (__int64)Link[3].Flink & 0xFF0FFFFF | ((_DWORD)NewOplockLevel != 0 ? 0x100000 : 0x800000);
      FsRtlpOplockEnqueueRH(&Oplock->RHBreakQueue, Link, (unsigned int)-(int)NewOplockLevel);
      FsRtlpModifyThreadPriorities(Oplock, (_RH_OP_CONTEXT *)Link, 1u);
      FsRtlpOplockSendModernAppTermination(Oplock, (_RH_OP_CONTEXT *)Link);
    }
    else
    {
      ObfDereferenceObjectWithTag(Link[1].Blink, 0x746C6644ui64);
      if( Link[2].Blink )
        FsRtlpClearOwner((INT64)Oplock, (INT64)Link);
      ExFreePoolWithTag(Link, 0);
    }
  }
  Flink[3].Blink = (_LIST_ENTRY *)v13;
  v14 = -1073741536;
  if( !BYTE4(Flink[4].Flink) )
    v14 = v9;
  LODWORD(Flink[3].Flink) = v14;
  IofCompleteRequest((_IRP *)Flink, 1);
}

Referenced by:

FsRtlUninitializeOplock
FsRtlpCancelOplockRHIrp
FsRtlpOplockBreakByCacheFlags
FsRtlpOplockCleanup
FsRtlpRequestExclusiveOplock
FsRtlpRequestShareableOplock