FsRtlpRemoveAndBreakRHIrp

VOID __stdcall FsRtlpRemoveAndBreakRHIrp(
        VOID *Link,
        _NONOPAQUE_OPLOCK *Oplock,
        UINT8 RemoveCancelRoutine,
        INT64 CompletionStatus,
        UINT64 NewOplockLevel,
        UINT64 OutputFlags,
        UINT64 AccessMode,
        UINT16 ShareMode){
  __int64 v8; 
  int v9; 
  __int64 v12; 
  __int64 v13; 
  _CCHAR v14; 
  int v15; 

  v8 = *((_QWORD *)Link + 2);
  v9 = CompletionStatus;
  *((_QWORD *)Link + 2) = 0i64;
  if( RemoveCancelRoutine )
  {
    *(_BYTE *)(v8 + 69) = KeAcquireQueuedSpinLock(7i64, (INT64)Oplock, RemoveCancelRoutine);
    _InterlockedExchange64((volatile __int64 *)(v8 + 104), 0i64);
    KeReleaseQueuedSpinLock(LockQueueIoCancelLock, *(_BYTE *)(v8 + 69));
  }
  FsRtlpOplockDequeueRH((_RH_OP_CONTEXT *)Link);
  if( *(_BYTE *)(v8 + 68) )
  {
    ObfDereferenceObjectWithTag(*((VOID **)Link + 3), 0x746C6644ui64);
    if( *((_QWORD *)Link + 5) )
      FsRtlpClearOwner(Oplock, (_RH_OP_CONTEXT *)Link);
    ExFreePoolWithTag(Link, 0);
    v13 = 0i64;
  }
  else
  {
    v12 = *(_QWORD *)(v8 + 24);
    v13 = 24i64;
    *(_QWORD *)(v12 + 16) = 0i64;
    *(_DWORD *)v12 = 1572865;
    *(_DWORD *)(v12 + 4) = 3;
    *(_DWORD *)(v12 + 8) = ((unsigned int)NewOplockLevel >> 12) & 7;
    *(_DWORD *)(v12 + 12) = OutputFlags;
    if( (OutputFlags & 2) != 0 )
    {
      *(_DWORD *)(v12 + 16) = AccessMode;
      *(_WORD *)(v12 + 20) = ShareMode;
    }
    if( (OutputFlags & 1) != 0 )
    {
      *((_DWORD *)Link + 12) = *((_DWORD *)Link + 12) & 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(*((VOID **)Link + 3), 0x746C6644ui64);
      if( *((_QWORD *)Link + 5) )
        FsRtlpClearOwner(Oplock, (_RH_OP_CONTEXT *)Link);
      ExFreePoolWithTag(Link, 0);
    }
  }
  *(_QWORD *)(v8 + 56) = v13;
  v15 = -1073741536;
  LOBYTE(v14) = 1;
  if( !*(_BYTE *)(v8 + 68) )
    v15 = v9;
  *(_DWORD *)(v8 + 48) = v15;
  IofCompleteRequest((PIRP)v8, v14);
}

Referenced by:

FsRtlUninitializeOplock
FsRtlpCancelOplockRHIrp
FsRtlpOplockBreakByCacheFlags
FsRtlpOplockCleanup
FsRtlpRequestExclusiveOplock
FsRtlpRequestShareableOplock