summaryrefslogtreecommitdiff
path: root/Source/Core/DiscIO/WIABlob.cpp
diff options
context:
space:
mode:
authorJosJuice <josjuice@gmail.com>2020-08-29 15:12:02 +0200
committerJosJuice <josjuice@gmail.com>2020-08-29 15:18:52 +0200
commit047bb803376a294a66bca5c9e91e23918706d151 (patch)
treec46f83fd3434880278d225c63241e298a4a80c24 /Source/Core/DiscIO/WIABlob.cpp
parent800b2480ecb0d5d0285c6d560fb25f6b96c3b021 (diff)
DiscIO: Add parameters to BlobReader::SupportsReadWiiDecrypted
It's possible (but rare) for a WIA or RVZ file to support this for some partitions but not all, and for the game and the blob code to disagree on how large a partition is.
Diffstat (limited to 'Source/Core/DiscIO/WIABlob.cpp')
-rw-r--r--Source/Core/DiscIO/WIABlob.cpp51
1 files changed, 39 insertions, 12 deletions
diff --git a/Source/Core/DiscIO/WIABlob.cpp b/Source/Core/DiscIO/WIABlob.cpp
index 94c3fc12c3..bdeb3a2951 100644
--- a/Source/Core/DiscIO/WIABlob.cpp
+++ b/Source/Core/DiscIO/WIABlob.cpp
@@ -413,28 +413,55 @@ bool WIARVZFileReader<RVZ>::Read(u64 offset, u64 size, u8* out_ptr)
}
template <bool RVZ>
-bool WIARVZFileReader<RVZ>::SupportsReadWiiDecrypted() const
+const typename WIARVZFileReader<RVZ>::PartitionEntry*
+WIARVZFileReader<RVZ>::GetPartition(u64 partition_data_offset, u32* partition_first_sector) const
{
- return !m_partition_entries.empty();
+ const auto it = m_data_entries.upper_bound(partition_data_offset);
+ if (it == m_data_entries.end() || !it->second.is_partition)
+ return nullptr;
+
+ const PartitionEntry* partition = &m_partition_entries[it->second.index];
+ *partition_first_sector = Common::swap32(partition->data_entries[0].first_sector);
+ if (partition_data_offset != *partition_first_sector * VolumeWii::BLOCK_TOTAL_SIZE)
+ return nullptr;
+
+ return partition;
+}
+
+template <bool RVZ>
+bool WIARVZFileReader<RVZ>::SupportsReadWiiDecrypted(u64 offset, u64 size,
+ u64 partition_data_offset) const
+{
+ u32 partition_first_sector;
+ const PartitionEntry* partition = GetPartition(partition_data_offset, &partition_first_sector);
+ if (!partition)
+ return false;
+
+ for (const PartitionDataEntry& data : partition->data_entries)
+ {
+ const u32 start_sector = Common::swap32(data.first_sector) - partition_first_sector;
+ const u32 end_sector = start_sector + Common::swap32(data.number_of_sectors);
+
+ if (offset + size <= end_sector * VolumeWii::BLOCK_DATA_SIZE)
+ return true;
+ }
+
+ return false;
}
template <bool RVZ>
bool WIARVZFileReader<RVZ>::ReadWiiDecrypted(u64 offset, u64 size, u8* out_ptr,
u64 partition_data_offset)
{
- const u64 chunk_size = Common::swap32(m_header_2.chunk_size) * VolumeWii::BLOCK_DATA_SIZE /
- VolumeWii::BLOCK_TOTAL_SIZE;
-
- const auto it = m_data_entries.upper_bound(partition_data_offset);
- if (it == m_data_entries.end() || !it->second.is_partition)
+ u32 partition_first_sector;
+ const PartitionEntry* partition = GetPartition(partition_data_offset, &partition_first_sector);
+ if (!partition)
return false;
- const PartitionEntry& partition = m_partition_entries[it->second.index];
- const u32 partition_first_sector = Common::swap32(partition.data_entries[0].first_sector);
- if (partition_data_offset != partition_first_sector * VolumeWii::BLOCK_TOTAL_SIZE)
- return false;
+ const u64 chunk_size = Common::swap32(m_header_2.chunk_size) * VolumeWii::BLOCK_DATA_SIZE /
+ VolumeWii::BLOCK_TOTAL_SIZE;
- for (const PartitionDataEntry& data : partition.data_entries)
+ for (const PartitionDataEntry& data : partition->data_entries)
{
if (size == 0)
return true;