diff options
| author | JosJuice <josjuice@gmail.com> | 2020-08-29 15:12:02 +0200 |
|---|---|---|
| committer | JosJuice <josjuice@gmail.com> | 2020-08-29 15:18:52 +0200 |
| commit | 047bb803376a294a66bca5c9e91e23918706d151 (patch) | |
| tree | c46f83fd3434880278d225c63241e298a4a80c24 /Source/Core/DiscIO/WIABlob.cpp | |
| parent | 800b2480ecb0d5d0285c6d560fb25f6b96c3b021 (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.cpp | 51 |
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; |
