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