IopCheckVpbMounted

VPB *__fastcall IopCheckVpbMounted(INT64 a1, DEVICE_OBJECT *a2, UINT8 *a3, INT64 *a4){
  KIRQL CurrentIrql; 
  KSPIN_LOCK_QUEUE *v9; 
  KSPIN_LOCK_QUEUE *v10; 
  ULONG_PTR v11; 
  _KSPIN_LOCK_QUEUE *v12; 
  _KSPIN_LOCK_QUEUE *Next; 
  VPB *result; 
  bool v15; 
  bool v16; 
  NTSTATUS v17; 
  UINT8 v18; 
  void *v19; 
  void *v20; 
  VPB *Vpb; 
  Vpb = 0i64;
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(2ui64);
  v9 = (KSPIN_LOCK_QUEUE *)(*((_QWORD *)KeGetPcr() + 5) + 144i64);
  v10 = (KSPIN_LOCK_QUEUE *)_InterlockedExchange64((volatile __int64 *)v9->Lock, (__int64)v9);
  if( v10 )
    KxWaitForLockOwnerShip(v9, v10);
  v11 = *((_QWORD *)a2 + 7);
  if( (*(_BYTE *)(v11 + 4) & 1) != 0 )
  {
LABEL_4:
    if( (*(_BYTE *)(v11 + 4) & 2) != 0 )
    {
      *(_DWORD *)a4 = -1073741790;
      v11 = 0i64;
    }
    else if( (int)++*(_DWORD *)(v11 + 28) <= 0 )
    {
      v19 = *(void **)(v11 + 8);
      if( v19 )
      {
        IoAddTriageDumpDataBlock(v19, 0x150ui64);
        v20 = *(void **)(*(_QWORD *)(v11 + 8) + 8i64);
        if( v20 )
        {
          IoAddTriageDumpDataBlock(v20, 0x150ui64);
          IoAddTriageDumpDataBlock(
            *(PVOID *)(*(_QWORD *)(*(_QWORD *)(v11 + 8) + 8i64) + 64i64),
            *(unsigned __int16 *)(*(_QWORD *)(*(_QWORD *)(v11 + 8) + 8i64) + 56i64));
        }
      }
      KeBugCheckEx(0x18u, 0i64, v11, 7ui64, *(unsigned int *)(v11 + 28));
    }
    v12 = (_KSPIN_LOCK_QUEUE *)(*((_QWORD *)KeGetPcr() + 5) + 144i64);
    _m_prefetchw(v12);
    Next = v12->Next;
    if( !v12->Next )
    {
      if( v12 == (_KSPIN_LOCK_QUEUE *)_InterlockedCompareExchange64(
                                         (volatile signed __int64 *)v12->Lock,
                                         0i64,
                                         (signed __int64)v12) )
      {
LABEL_8:
        __writecr8(CurrentIrql);
        if( !v11 )
          IopDecrementDeviceObjectRef(a2, 0, 0);
        return(VPB *)v11;
      }
      Next = KxWaitForLockChainValid(v12);
    }
    v12->Next = 0i64;
    _InterlockedXor64((volatile signed __int64 *)&Next->Lock, 1ui64);
    goto LABEL_8;
  }
  while( 1 )
  {
    KeReleaseQueuedSpinLock(9ui64, CurrentIrql);
    v15 = (*(_DWORD *)(a1 + 64) & 0x10) != 0;
    Vpb = 0i64;
    v16 = !*(_WORD *)a3 && !*(_QWORD *)(a1 + 40);
    v17 = IopMountVolume(a2, v16, 0, v15, &Vpb);
    *(_DWORD *)a4 = v17;
    if( v17 < 0 || v17 == 192 || v17 == 257 )
      break;
    result = Vpb;
    if( Vpb )
      return result;
    v18 = KeAcquireQueuedSpinLock(9ui64);
    v11 = *((_QWORD *)a2 + 7);
    CurrentIrql = v18;
    if( (*(_BYTE *)(v11 + 4) & 1) != 0 )
      goto LABEL_4;
  }
  IopDecrementDeviceObjectRef(a2, 0, 0);
  result = 0i64;
  if( *(int *)a4 >= 0 )
    *(_DWORD *)a4 = -1073741806;
  return result;
}

Referenced by:

IopParseDevice