From 0aef6bc83484ef97cbf1de3127c19112e2f9a3de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Lam?= Date: Tue, 25 Dec 2018 20:49:11 +0100 Subject: [PATCH] WiiUtils: Clear IPL.TID when re-installing a title manually If the user tries to permanently install a title that has already been imported, and if that title is currently marked as a temporary title in IPL.TID, that flag should be cleared. --- Source/Core/Core/WiiUtils.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/Source/Core/Core/WiiUtils.cpp b/Source/Core/Core/WiiUtils.cpp index fdf58ccfe8..bad07a9767 100644 --- a/Source/Core/Core/WiiUtils.cpp +++ b/Source/Core/Core/WiiUtils.cpp @@ -116,14 +116,24 @@ bool InstallWAD(IOS::HLE::Kernel& ios, const DiscIO::WiiWAD& wad, InstallType in if (!wad.GetTMD().IsValid()) return false; + SysConf sysconf{ios.GetFS()}; + SysConf::Entry* tid_entry = sysconf.GetOrAddEntry("IPL.TID", SysConf::Entry::Type::LongLong); + const u64 previous_temporary_title_id = Common::swap64(tid_entry->GetData(0)); + const u64 title_id = wad.GetTMD().GetTitleId(); + // Skip the install if the WAD is already installed. const auto installed_contents = ios.GetES()->GetStoredContentsFromTMD(wad.GetTMD()); if (wad.GetTMD().GetContents() == installed_contents) + { + // Clear the "temporary title ID" flag in case the user tries to permanently install a title + // that has already been imported as a temporary title. + if (previous_temporary_title_id == title_id && install_type == InstallType::Permanent) + tid_entry->SetData(0); return true; + } // If a different version is currently installed, warn the user to make sure // they don't overwrite the current version by mistake. - const u64 title_id = wad.GetTMD().GetTitleId(); const IOS::ES::TMDReader installed_tmd = ios.GetES()->FindInstalledTMD(title_id); const bool has_another_version = installed_tmd.IsValid() && installed_tmd.GetTitleVersion() != wad.GetTMD().GetTitleVersion(); @@ -137,9 +147,7 @@ bool InstallWAD(IOS::HLE::Kernel& ios, const DiscIO::WiiWAD& wad, InstallType in } // Delete a previous temporary title, if it exists. - SysConf sysconf{ios.GetFS()}; - SysConf::Entry* tid_entry = sysconf.GetOrAddEntry("IPL.TID", SysConf::Entry::Type::LongLong); - if (const u64 previous_temporary_title_id = Common::swap64(tid_entry->GetData(0))) + if (previous_temporary_title_id) ios.GetES()->DeleteTitleContent(previous_temporary_title_id); if (!ImportWAD(ios, wad))