IopDereferenceVpbAndFree

VOID __stdcall IopDereferenceVpbAndFree(_VPB *Vpb){
  _VPB *v2; 
  unsigned __int8 CurrentIrql; 
  volatile __int64 **v4; 
  bool v5; 

  v2 = 0i64;
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(2ui64);
  v4 = (volatile __int64 **)((char *)KeGetPcr()->NtTib.ArbitraryUserPointer + 144);
  if( _InterlockedExchange64(v4[1], (__int64)v4) )
    KxWaitForLockOwnerShip((INT64)v4);
  v5 = Vpb->ReferenceCount-- == 1;
  if( v5 && Vpb->RealDevice->Vpb != Vpb && (Vpb->Flags & 4) == 0 )
    v2 = Vpb;
  KeReleaseInStackQueuedSpinLockFromDpcLevel((PKLOCK_QUEUE_HANDLE)KeGetPcr()->NtTib.ArbitraryUserPointer + 6);
  __writecr8(CurrentIrql);
  if( v2 )
    ExFreePoolWithTag(v2, 0);
}

Referenced by:

IoVerifyVolume
IopParseDevice