IopDereferenceVpbAndFree

VOID __stdcall IopDereferenceVpbAndFree(_VPB *Vpb){
  _VPB *v2; 
  unsigned __int8 CurrentIrql; 
  KSPIN_LOCK_QUEUE *v4; 
  KSPIN_LOCK_QUEUE *v5; 
  bool v6; 
  v2 = 0i64;
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(2ui64);
  v4 = (KSPIN_LOCK_QUEUE *)(*((_QWORD *)KeGetPcr() + 5) + 144i64);
  v5 = (KSPIN_LOCK_QUEUE *)_InterlockedExchange64((volatile __int64 *)v4->Lock, (__int64)v4);
  if( v5 )
    KxWaitForLockOwnerShip(v4, v5);
  v6 = Vpb->ReferenceCount-- == 1;
  if( v6 && *((_VPB **)Vpb->RealDevice + 7) != Vpb && (Vpb->Flags & 4) == 0 )
    v2 = Vpb;
  KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)(*((_QWORD *)KeGetPcr() + 5) + 144i64));
  __writecr8(CurrentIrql);
  if( v2 )
    ExFreePoolWithTag(v2, 0);
}

Referenced by:

IoVerifyVolume
IopParseDevice