/* * Copyright (c) 2018-2020 Atmosphère-NX * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #pragma once #include namespace ams::prfile2::pdm { namespace impl { extern DiskSet g_disk_set; } ALWAYS_INLINE Disk *GetDisk(HandleType handle) { if (AMS_LIKELY(IsDiskHandle(handle))) { if (const auto id = GetHandleId(handle); AMS_LIKELY(id < MaxDisks)) { const auto signature = GetHandleSignature(handle); Disk *disk = std::addressof(impl::g_disk_set.disks[id]); for (const auto &holder : impl::g_disk_set.disk_holders) { if (holder.disk == disk && holder.signature == signature) { return disk; } } } } return nullptr; } ALWAYS_INLINE Disk *GetDiskUnsafe(HandleType handle) { return std::addressof(impl::g_disk_set.disks[GetHandleId(handle)]); } ALWAYS_INLINE DiskHolder *GetDiskHolder(HandleType handle) { if (AMS_LIKELY(IsDiskHandle(handle))) { if (const auto id = GetHandleId(handle); AMS_LIKELY(id < MaxDisks)) { const auto signature = GetHandleSignature(handle); Disk *disk = std::addressof(impl::g_disk_set.disks[id]); for (auto &holder : impl::g_disk_set.disk_holders) { if (holder.disk == disk && holder.signature == signature) { return std::addressof(holder); } } } } return nullptr; } ALWAYS_INLINE Partition *GetPartition(HandleType handle) { if (AMS_LIKELY(IsPartitionHandle(handle))) { if (const auto id = GetHandleId(handle); AMS_LIKELY(id < MaxPartitions)) { const auto signature = GetHandleSignature(handle); Partition *part = std::addressof(impl::g_disk_set.partitions[id]); for (const auto &holder : impl::g_disk_set.partition_holders) { if (holder.partition == part && holder.signature == signature) { return part; } } } } return nullptr; } ALWAYS_INLINE Partition *GetPartitionUnsafe(HandleType handle) { return std::addressof(impl::g_disk_set.partitions[GetHandleId(handle)]); } ALWAYS_INLINE PartitionHolder *GetPartitionHolder(HandleType handle) { if (AMS_LIKELY(IsPartitionHandle(handle))) { if (const auto id = GetHandleId(handle); AMS_LIKELY(id < MaxPartitions)) { const auto signature = GetHandleSignature(handle); Partition *part = std::addressof(impl::g_disk_set.partitions[id]); for (auto &holder : impl::g_disk_set.partition_holders) { if (holder.partition == part && holder.signature == signature) { return std::addressof(holder); } } } } return nullptr; } }