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