IopCheckVpbMounted
_VPB *__stdcall IopCheckVpbMounted(
_OPEN_PACKET *op,
_DEVICE_OBJECT *parseDeviceObject,
_UNICODE_STRING *RemainingName,
INT64 *status){
UINT8 CurrentIrql;
volatile __int64 **v9;
_VPB *v10;
_KSPIN_LOCK_QUEUE *v11;
_KSPIN_LOCK_QUEUE *Next;
_VPB *result;
bool v14;
bool v15;
NTSTATUS v16;
INT64 v17;
INT64 v18;
UINT8 v19;
_DEVICE_OBJECT *DeviceObject;
_DRIVER_OBJECT *DriverObject;
_VPB *Vpb;
Vpb = 0i64;
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
v9 = (volatile __int64 **)((char *)KeGetPcr()->NtTib.ArbitraryUserPointer + 144);
if( _InterlockedExchange64(v9[1], (__int64)v9) )
KxWaitForLockOwnerShip((INT64)v9);
v10 = parseDeviceObject->Vpb;
if( (v10->Flags & 1) != 0 )
{
LABEL_4:
if( (v10->Flags & 2) != 0 )
{
*(_DWORD *)status = -1073741790;
v10 = 0i64;
}
else if( (int)++v10->ReferenceCount <= 0 )
{
DeviceObject = v10->DeviceObject;
if( DeviceObject )
{
IoAddTriageDumpDataBlock(DeviceObject, (_BYTE *)0x150);
DriverObject = v10->DeviceObject->DriverObject;
if( DriverObject )
{
IoAddTriageDumpDataBlock(DriverObject, (_BYTE *)0x150);
IoAddTriageDumpDataBlock(
v10->DeviceObject->DriverObject->DriverName.Buffer,
(_BYTE *)v10->DeviceObject->DriverObject->DriverName.Length);
}
}
KeBugCheckEx(0x18u, 0i64, v10, (PVOID)7, (PVOID)v10->ReferenceCount);
}
v11 = (_KSPIN_LOCK_QUEUE *)((char *)KeGetPcr()->NtTib.ArbitraryUserPointer + 144);
_m_prefetchw(v11);
Next = v11->Next;
if( !v11->Next )
{
if( v11 == (_KSPIN_LOCK_QUEUE *)_InterlockedCompareExchange64(
(volatile signed __int64 *)v11->Lock,
0i64,
(signed __int64)v11) )
{
LABEL_8:
__writecr8(CurrentIrql);
if( !v10 )
IopDecrementDeviceObjectRef(parseDeviceObject, 0, 0);
return v10;
}
Next = KxWaitForLockChainValid(v11);
}
v11->Next = 0i64;
_InterlockedXor64((volatile signed __int64 *)&Next->Lock, 1ui64);
goto LABEL_8;
}
while( 1 )
{
KeReleaseQueuedSpinLock(LockQueueIoVpbLock, CurrentIrql);
v14 = (op->CreateOptions & 0x10) != 0;
Vpb = 0i64;
v15 = !RemainingName->Length && !op->RelatedFileObject;
v16 = IopMountVolume(parseDeviceObject, v15, 0, v14, &Vpb);
*(_DWORD *)status = v16;
if( v16 < 0 || v16 == 192 || v16 == 257 )
break;
result = Vpb;
if( Vpb )
return result;
v19 = KeAcquireQueuedSpinLock(9i64, v17, v18);
v10 = parseDeviceObject->Vpb;
CurrentIrql = v19;
if( (v10->Flags & 1) != 0 )
goto LABEL_4;
}
IopDecrementDeviceObjectRef(parseDeviceObject, 0, 0);
result = 0i64;
if( *(int *)status >= 0 )
*(_DWORD *)status = -1073741806;
return result;
}Referenced by:
IopParseDevice