diff options
| author | JosJuice <josjuice@gmail.com> | 2019-11-27 14:35:25 +0100 |
|---|---|---|
| committer | JosJuice <josjuice@gmail.com> | 2019-11-27 18:26:22 +0100 |
| commit | 59633f5309b8386ebf321104dc16bd46b372bf1c (patch) | |
| tree | 51cf76b141011f4b7d63a8aa4e162fcac6390d56 /Source/Core/DiscIO/VolumeVerifier.cpp | |
| parent | 70ee5234ba4782ae9e16a81266f97024a96245cf (diff) | |
VolumeVerifier: Detect broken Super Paper Mario
https://bugs.dolphin-emu.org/issues/11900
Diffstat (limited to 'Source/Core/DiscIO/VolumeVerifier.cpp')
| -rw-r--r-- | Source/Core/DiscIO/VolumeVerifier.cpp | 34 |
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.")); } } |
