From 239167245dfea23f563429c30d07b3752dd83cad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Lam?= Date: Tue, 3 Oct 2017 16:45:59 +0200 Subject: Add a way to check the NAND for issues and fix them Old versions of Dolphin are so broken regarding NAND handling that we need this to repair common issues and avoid issues with titles like the System Menu or the Wii Shop. This isn't an exhaustive check, but this will catch most issues and offer to fix them automatically (if possible). --- Source/Core/DolphinQt2/MenuBar.cpp | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) (limited to 'Source/Core/DolphinQt2/MenuBar.cpp') diff --git a/Source/Core/DolphinQt2/MenuBar.cpp b/Source/Core/DolphinQt2/MenuBar.cpp index 6fb6cc79a5..b7b7410e6f 100644 --- a/Source/Core/DolphinQt2/MenuBar.cpp +++ b/Source/Core/DolphinQt2/MenuBar.cpp @@ -22,6 +22,7 @@ #include "Core/IOS/IOS.h" #include "Core/Movie.h" #include "Core/State.h" +#include "Core/WiiUtils.h" #include "DiscIO/NANDImporter.h" #include "DolphinQt2/AboutDialog.h" #include "DolphinQt2/GameList/GameFile.h" @@ -114,7 +115,7 @@ void MenuBar::AddToolsMenu() AddAction(tools_menu, QStringLiteral(""), this, [this] { emit BootWiiSystemMenu(); }); m_import_backup = AddAction(gc_ipl, tr("Import BootMii NAND Backup..."), this, [this] { emit ImportNANDBackup(); }); - + m_check_nand = AddAction(tools_menu, tr("Check NAND..."), this, &MenuBar::CheckNAND); m_extract_certificates = AddAction(tools_menu, tr("Extract Certificates from NAND"), this, &MenuBar::NANDExtractCertificates); @@ -473,6 +474,7 @@ void MenuBar::UpdateToolsMenu(bool emulation_started) m_pal_ipl->setEnabled(!emulation_started && File::Exists(SConfig::GetInstance().GetBootROMPath(EUR_DIR))); m_import_backup->setEnabled(!emulation_started); + m_check_nand->setEnabled(!emulation_started); if (!emulation_started) { @@ -532,6 +534,35 @@ void MenuBar::ExportWiiSaves() CWiiSaveCrypted::ExportAllSaves(); } +void MenuBar::CheckNAND() +{ + IOS::HLE::Kernel ios; + if (WiiUtils::CheckNAND(ios)) + { + QMessageBox::information(this, tr("NAND Check"), tr("No issues have been detected.")); + return; + } + + if (QMessageBox::question( + this, tr("NAND Check"), + tr("The emulated NAND is damaged. System titles such as the Wii Menu and " + "the Wii Shop Channel may not work correctly.\n\n" + "Do you want to try to repair the NAND?")) != QMessageBox::Yes) + { + return; + } + + if (WiiUtils::RepairNAND(ios)) + { + QMessageBox::information(this, tr("NAND Check"), tr("The NAND has been repaired.")); + return; + } + + QMessageBox::critical(this, tr("NAND Check"), + tr("The NAND could not be repaired. It is recommended to back up " + "your current data and start over with a fresh NAND.")); +} + void MenuBar::NANDExtractCertificates() { if (DiscIO::NANDImporter().ExtractCertificates(File::GetUserPath(D_WIIROOT_IDX))) -- cgit v1.2.3 From 02e17594b06151e652a1b51ce1018ce4747feecd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Lam?= Date: Fri, 6 Oct 2017 21:45:28 +0200 Subject: WiiUtils: Attempt to fix the NAND more aggressively Change the repair logic to fix issues more aggressively by deleting bad titles. This is necessary because of a bug in Dolphin's WAD boot code. The UI code was updated to inform the user about titles that will be deleted if they continue a repair, before deleting anything. --- Source/Core/DolphinQt2/MenuBar.cpp | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) (limited to 'Source/Core/DolphinQt2/MenuBar.cpp') diff --git a/Source/Core/DolphinQt2/MenuBar.cpp b/Source/Core/DolphinQt2/MenuBar.cpp index b7b7410e6f..401f7f4d7e 100644 --- a/Source/Core/DolphinQt2/MenuBar.cpp +++ b/Source/Core/DolphinQt2/MenuBar.cpp @@ -22,6 +22,7 @@ #include "Core/IOS/IOS.h" #include "Core/Movie.h" #include "Core/State.h" +#include "Core/TitleDatabase.h" #include "Core/WiiUtils.h" #include "DiscIO/NANDImporter.h" #include "DolphinQt2/AboutDialog.h" @@ -537,21 +538,37 @@ void MenuBar::ExportWiiSaves() void MenuBar::CheckNAND() { IOS::HLE::Kernel ios; - if (WiiUtils::CheckNAND(ios)) + WiiUtils::NANDCheckResult result = WiiUtils::CheckNAND(ios); + if (!result.bad) { QMessageBox::information(this, tr("NAND Check"), tr("No issues have been detected.")); return; } - if (QMessageBox::question( - this, tr("NAND Check"), - tr("The emulated NAND is damaged. System titles such as the Wii Menu and " - "the Wii Shop Channel may not work correctly.\n\n" - "Do you want to try to repair the NAND?")) != QMessageBox::Yes) + QString message = tr("The emulated NAND is damaged. System titles such as the Wii Menu and " + "the Wii Shop Channel may not work correctly.\n\n" + "Do you want to try to repair the NAND?"); + if (!result.titles_to_remove.empty()) { - return; + message += tr("\n\nWARNING: Fixing this NAND requires the deletion of titles that have " + "incomplete data on the NAND, including all associated save data. " + "By continuing, the following title(s) will be removed:\n\n"); + Core::TitleDatabase title_db; + for (const u64 title_id : result.titles_to_remove) + { + const std::string name = title_db.GetTitleName(title_id); + message += !name.empty() ? + QStringLiteral("%1 (%2)") + .arg(QString::fromStdString(name)) + .arg(title_id, 16, 16, QLatin1Char('0')) : + QStringLiteral("%1").arg(title_id, 16, 16, QLatin1Char('0')); + message += QStringLiteral("\n"); + } } + if (QMessageBox::question(this, tr("NAND Check"), message) != QMessageBox::Yes) + return; + if (WiiUtils::RepairNAND(ios)) { QMessageBox::information(this, tr("NAND Check"), tr("The NAND has been repaired.")); -- cgit v1.2.3