IopDecrementVpbRefCount

NTSTATUS __stdcall IopDecrementVpbRefCount(VPB *Vpb, UINT8 LockRequired){
  WORK_QUEUE_TYPE v2; 
  void *v3; 
  unsigned __int8 CurrentIrql; 
  __int64 v6; 
  NTSTATUS v7; 
  _KSPIN_LOCK_QUEUE *v8; 
  _KSPIN_LOCK_QUEUE *Next; 
  if( LockRequired )
  {
    CurrentIrql = KeGetCurrentIrql();
    __writecr8(2ui64);
    v6 = *((_QWORD *)KeGetPcr() + 5) + 144i64;
    KxAcquireQueuedSpinLock((PIO_WORKITEM)v6, *(PIO_WORKITEM_ROUTINE *)(v6 + 8), v2, v3);
    v7 = --Vpb->ReferenceCount;
    v8 = (_KSPIN_LOCK_QUEUE *)(*((_QWORD *)KeGetPcr() + 5) + 144i64);
    _m_prefetchw(v8);
    Next = v8->Next;
    if( !v8->Next )
    {
      if( v8 == (_KSPIN_LOCK_QUEUE *)_InterlockedCompareExchange64(
                                        (volatile signed __int64 *)v8->Lock,
                                        0i64,
                                        (signed __int64)v8) )
      {
LABEL_4:
        __writecr8(CurrentIrql);
        return v7;
      }
      Next = KxWaitForLockChainValid(v8);
    }
    v8->Next = 0i64;
    _InterlockedXor64((volatile signed __int64 *)&Next->Lock, 1ui64);
    goto LABEL_4;
  }
  return --Vpb->ReferenceCount;
}

Referenced by:

IoVerifyVolume
IopDeleteFile