summaryrefslogtreecommitdiff
path: root/Source/Core/DiscIO/VolumeVerifier.cpp
diff options
context:
space:
mode:
authorAnthony <Helios747@users.noreply.github.com>2019-11-27 15:31:05 -0800
committerGitHub <noreply@github.com>2019-11-27 15:31:05 -0800
commitf20c1c2f8ddd6c32e751dd39a6182572712c4af0 (patch)
tree4c465967ecc120d4061af44ad20e40b57ce5bda5 /Source/Core/DiscIO/VolumeVerifier.cpp
parent66220d3ae5928c61ebe9430dfbdc8e921942ed6b (diff)
parent59633f5309b8386ebf321104dc16bd46b372bf1c (diff)
Merge pull request #8499 from JosJuice/volumeverifier-super-paper-mario
VolumeVerifier: Detect broken Super Paper Mario
Diffstat (limited to 'Source/Core/DiscIO/VolumeVerifier.cpp')
-rw-r--r--Source/Core/DiscIO/VolumeVerifier.cpp34
1 files changed, 34 insertions, 0 deletions
diff --git a/Source/Core/DiscIO/VolumeVerifier.cpp b/Source/Core/DiscIO/VolumeVerifier.cpp
index 5b84ca2633..905a1cc26d 100644
--- a/Source/Core/DiscIO/VolumeVerifier.cpp
+++ b/Source/Core/DiscIO/VolumeVerifier.cpp
@@ -8,6 +8,7 @@
#include <cinttypes>
#include <future>
#include <limits>
+#include <memory>
#include <mutex>
#include <optional>
#include <string>
@@ -972,6 +973,39 @@ void VolumeVerifier::CheckMisc()
"The CRC32 of this file might match the CRC32 of a good dump even "
"though the files are not identical."));
}
+
+ if (StringBeginsWith(game_id_unencrypted, "R8P"))
+ CheckSuperPaperMario();
+ }
+}
+
+void VolumeVerifier::CheckSuperPaperMario()
+{
+ // When Super Paper Mario (any region/revision) reads setup/aa1_01.dat when starting a new game,
+ // it also reads a few extra bytes so that the read length is divisible by 0x20. If these extra
+ // bytes are zeroes like in good dumps, the game works correctly, but otherwise it can freeze
+ // (depending on the exact values of the extra bytes). https://bugs.dolphin-emu.org/issues/11900
+
+ const DiscIO::Partition partition = m_volume.GetGamePartition();
+ const FileSystem* fs = m_volume.GetFileSystem(partition);
+ if (!fs)
+ return;
+
+ std::unique_ptr<FileInfo> file_info = fs->FindFileInfo("setup/aa1_01.dat");
+ if (!file_info)
+ return;
+
+ const u64 offset = file_info->GetOffset() + file_info->GetSize();
+ const u64 length = Common::AlignUp(offset, 0x20) - offset;
+ std::vector<u8> data(length);
+ if (!m_volume.Read(offset, length, data.data(), partition))
+ return;
+
+ if (std::any_of(data.cbegin(), data.cend(), [](u8 x) { return x != 0; }))
+ {
+ AddProblem(Severity::High,
+ Common::GetStringT("Some padding data that should be zero is not zero. "
+ "This can make the game freeze at certain points."));
}
}