IopGetMountFlag

UINT8 __stdcall IopGetMountFlag(_DEVICE_OBJECT *DeviceObject){
  UINT8 v2; 
  unsigned __int8 CurrentIrql; 
  volatile __int64 **v4; 
  _VPB *Vpb; 
  _KSPIN_LOCK_QUEUE *v6; 
  _KSPIN_LOCK_QUEUE *Next; 

  v2 = 0;
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(2ui64);
  v4 = (volatile __int64 **)((char *)KeGetPcr()->NtTib.ArbitraryUserPointer + 144);
  if( _InterlockedExchange64(v4[1], (__int64)v4) )
    KxWaitForLockOwnerShip((INT64)v4);
  Vpb = DeviceObject->Vpb;
  if( Vpb && (Vpb->Flags & 1) != 0 )
    v2 = 1;
  v6 = (_KSPIN_LOCK_QUEUE *)((char *)KeGetPcr()->NtTib.ArbitraryUserPointer + 144);
  _m_prefetchw(v6);
  Next = v6->Next;
  if( v6->Next )
    goto LABEL_10;
  if( v6 != (_KSPIN_LOCK_QUEUE *)_InterlockedCompareExchange64(
                                    (volatile signed __int64 *)v6->Lock,
                                    0i64,
                                    (signed __int64)v6) )
  {
    Next = KxWaitForLockChainValid(v6);
LABEL_10:
    v6->Next = 0i64;
    _InterlockedXor64((volatile signed __int64 *)&Next->Lock, 1ui64);
  }
  __writecr8(CurrentIrql);
  return v2;
}

Referenced by:

NtQueryVolumeInformationFile