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