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