From bb032804629eb290f763129d0a3b662e46c36a17 Mon Sep 17 00:00:00 2001 From: JosJuice Date: Wed, 7 Oct 2020 09:44:37 +0200 Subject: [PATCH] VolumeVerifier: Make "no valid data in partition" hide some other errors Not much use in knowing that the H3 hashes are wrong when the partition consists of complete garbage. --- Source/Core/DiscIO/VolumeVerifier.cpp | 72 ++++++++++++++------------- 1 file changed, 38 insertions(+), 34 deletions(-) diff --git a/Source/Core/DiscIO/VolumeVerifier.cpp b/Source/Core/DiscIO/VolumeVerifier.cpp index c8cb3ba5bf..f626250ca5 100644 --- a/Source/Core/DiscIO/VolumeVerifier.cpp +++ b/Source/Core/DiscIO/VolumeVerifier.cpp @@ -523,6 +523,41 @@ bool VolumeVerifier::CheckPartition(const Partition& partition) Common::FmtFormatT("The {0} partition is not properly aligned.", name)); } + bool invalid_header = false; + bool blank_contents = false; + std::vector disc_header(0x80); + constexpr u32 WII_MAGIC = 0x5D1C9EA3; + if (!m_volume.Read(0, disc_header.size(), disc_header.data(), partition)) + { + invalid_header = true; + } + else if (Common::swap32(disc_header.data() + 0x18) != WII_MAGIC) + { + for (size_t i = 0; i < disc_header.size(); i += 4) + { + if (Common::swap32(disc_header.data() + i) != i) + { + invalid_header = true; + break; + } + } + + // The loop above ends without setting invalid_header for discs that legitimately lack + // updates. No such discs have been released to end users. Most such discs are debug signed, + // but there is apparently at least one that is retail signed, the Movie-Ch Install Disc. + if (!invalid_header) + blank_contents = true; + } + if (invalid_header) + { + // This can happen when certain programs that create WBFS files scrub the entirety of + // the Masterpiece partitions in Super Smash Bros. Brawl without removing them from + // the partition table. https://bugs.dolphin-emu.org/issues/8733 + AddProblem(severity, + Common::FmtFormatT("The {0} partition does not seem to contain valid data.", name)); + return false; + } + if (!m_is_datel) { IOS::HLE::Kernel ios; @@ -549,40 +584,6 @@ bool VolumeVerifier::CheckPartition(const Partition& partition) Common::FmtFormatT("The H3 hash table for the {0} partition is not correct.", name)); } - bool invalid_disc_header = false; - std::vector disc_header(0x80); - constexpr u32 WII_MAGIC = 0x5D1C9EA3; - if (!m_volume.Read(0, disc_header.size(), disc_header.data(), partition)) - { - invalid_disc_header = true; - } - else if (Common::swap32(disc_header.data() + 0x18) != WII_MAGIC) - { - for (size_t i = 0; i < disc_header.size(); i += 4) - { - if (Common::swap32(disc_header.data() + i) != i) - { - invalid_disc_header = true; - break; - } - } - - // The loop above ends without setting invalid_disc_header for discs that legitimately lack - // updates. No such discs have been released to end users. Most such discs are debug signed, - // but there is apparently at least one that is retail signed, the Movie-Ch Install Disc. - if (!invalid_disc_header) - return false; - } - if (invalid_disc_header) - { - AddProblem(severity, - // This can happen when certain programs that create WBFS files scrub the entirety of - // the Masterpiece partitions in Super Smash Bros. Brawl without removing them from - // the partition table. https://bugs.dolphin-emu.org/issues/8733 - Common::FmtFormatT("The {0} partition does not seem to contain valid data.", name)); - return false; - } - // Prepare for hash verification in the Process step if (m_volume.SupportsIntegrityCheck()) { @@ -597,6 +598,9 @@ bool VolumeVerifier::CheckPartition(const Partition& partition) m_block_errors.emplace(partition, 0); } + if (blank_contents) + return false; + const DiscIO::FileSystem* filesystem = m_volume.GetFileSystem(partition); if (!filesystem) {