Rework system title handling with up-to-date title list and region detection support. (#6356)
This commit is contained in:
parent
b5d6f645bd
commit
5346ca27b5
|
@ -15,10 +15,8 @@
|
|||
#include "core/hle/service/cfg/cfg.h"
|
||||
#include "core/hle/service/ptm/ptm.h"
|
||||
#include "core/hw/aes/key.h"
|
||||
#include "core/system_titles.h"
|
||||
#include "ui_configure_system.h"
|
||||
#ifdef ENABLE_WEB_SERVICE
|
||||
#include "web_service/nus_titles.h"
|
||||
#endif
|
||||
|
||||
static const std::array<int, 12> days_in_month = {{
|
||||
31,
|
||||
|
@ -246,7 +244,9 @@ ConfigureSystem::ConfigureSystem(QWidget* parent)
|
|||
|
||||
SetupPerGameUI();
|
||||
|
||||
ui->combo_download_mode->setCurrentIndex(1); // set to Recommended
|
||||
ui->combo_download_set->setCurrentIndex(0); // set to Minimal
|
||||
ui->combo_download_region->setCurrentIndex(0); // set to the base region
|
||||
|
||||
bool keys_available = true;
|
||||
HW::AES::InitKeys(true);
|
||||
for (u8 i = 0; i < HW::AES::MaxCommonKeySlot; i++) {
|
||||
|
@ -258,11 +258,13 @@ ConfigureSystem::ConfigureSystem(QWidget* parent)
|
|||
}
|
||||
if (keys_available) {
|
||||
ui->button_start_download->setEnabled(true);
|
||||
ui->combo_download_mode->setEnabled(true);
|
||||
ui->combo_download_set->setEnabled(true);
|
||||
ui->combo_download_region->setEnabled(true);
|
||||
ui->label_nus_download->setText(tr("Download System Files from Nintendo servers"));
|
||||
} else {
|
||||
ui->button_start_download->setEnabled(false);
|
||||
ui->combo_download_mode->setEnabled(false);
|
||||
ui->combo_download_set->setEnabled(false);
|
||||
ui->combo_download_region->setEnabled(false);
|
||||
ui->label_nus_download->setTextInteractionFlags(Qt::TextBrowserInteraction);
|
||||
ui->label_nus_download->setOpenExternalLinks(true);
|
||||
ui->label_nus_download->setText(
|
||||
|
@ -343,6 +345,9 @@ void ConfigureSystem::ReadSystemSettings() {
|
|||
// set play coin
|
||||
play_coin = Service::PTM::Module::GetPlayCoins();
|
||||
ui->spinBox_play_coins->setValue(play_coin);
|
||||
|
||||
// set firmware download region
|
||||
ui->combo_download_region->setCurrentIndex(static_cast<int>(cfg->GetRegionValue()));
|
||||
}
|
||||
|
||||
void ConfigureSystem::ApplyConfiguration() {
|
||||
|
@ -535,8 +540,10 @@ void ConfigureSystem::DownloadFromNUS() {
|
|||
#ifdef ENABLE_WEB_SERVICE
|
||||
ui->button_start_download->setEnabled(false);
|
||||
|
||||
const auto mode = static_cast<Title::Mode>(ui->combo_download_mode->currentIndex());
|
||||
const std::vector<u64> titles = BuildFirmwareTitleList(mode, cfg->GetRegionValue());
|
||||
const auto mode =
|
||||
static_cast<Core::SystemTitleSet>(1 << ui->combo_download_set->currentIndex());
|
||||
const auto region = static_cast<u32>(ui->combo_download_region->currentIndex());
|
||||
const std::vector<u64> titles = Core::GetSystemTitleIds(mode, region);
|
||||
|
||||
QProgressDialog progress(tr("Downloading files..."), tr("Cancel"), 0,
|
||||
static_cast<int>(titles.size()), this);
|
||||
|
|
|
@ -371,22 +371,61 @@
|
|||
<item row="15" column="1">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_nus_download">
|
||||
<item>
|
||||
<widget class="QComboBox" name="combo_download_mode">
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>All</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Recommended</string>
|
||||
</property>
|
||||
</item>
|
||||
<widget class="QComboBox" name="combo_download_set">
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Minimal</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Old 3DS</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>New 3DS</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QComboBox" name="combo_download_region">
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>JPN</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>USA</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>EUR</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>AUS</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>CHN</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>KOR</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>TWN</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
|
|
|
@ -94,6 +94,7 @@
|
|||
#include "core/loader/loader.h"
|
||||
#include "core/movie.h"
|
||||
#include "core/savestate.h"
|
||||
#include "core/system_titles.h"
|
||||
#include "game_list_p.h"
|
||||
#include "input_common/main.h"
|
||||
#include "network/network_settings.h"
|
||||
|
@ -747,7 +748,10 @@ void GMainWindow::ConnectMenuEvents() {
|
|||
// File
|
||||
connect_menu(ui->action_Load_File, &GMainWindow::OnMenuLoadFile);
|
||||
connect_menu(ui->action_Install_CIA, &GMainWindow::OnMenuInstallCIA);
|
||||
connect_menu(ui->action_Boot_Home_Menu, &GMainWindow::OnMenuBootHomeMenu);
|
||||
for (u32 region = 0; region < Core::NUM_SYSTEM_TITLE_REGIONS; region++) {
|
||||
connect_menu(ui->menu_Boot_Home_Menu->actions().at(region),
|
||||
[this, region] { OnMenuBootHomeMenu(region); });
|
||||
}
|
||||
connect_menu(ui->action_Exit, &QMainWindow::close);
|
||||
connect_menu(ui->action_Load_Amiibo, &GMainWindow::OnLoadAmiibo);
|
||||
connect_menu(ui->action_Remove_Amiibo, &GMainWindow::OnRemoveAmiibo);
|
||||
|
@ -1633,18 +1637,8 @@ void GMainWindow::OnMenuInstallCIA() {
|
|||
InstallCIA(filepaths);
|
||||
}
|
||||
|
||||
static std::string GetHomeMenuPath() {
|
||||
static const std::array<u64, 7> home_menu_tids = {
|
||||
0x0004003000008202, 0x0004003000008F02, 0x0004003000009802, 0x0004003000009802,
|
||||
0x000400300000A102, 0x000400300000A902, 0x000400300000B102};
|
||||
|
||||
Service::CFG::Module cfg{};
|
||||
return Service::AM::GetTitleContentPath(Service::FS::MediaType::NAND,
|
||||
home_menu_tids[cfg.GetRegionValue()]);
|
||||
}
|
||||
|
||||
void GMainWindow::OnMenuBootHomeMenu() {
|
||||
BootGame(QString::fromStdString(GetHomeMenuPath()));
|
||||
void GMainWindow::OnMenuBootHomeMenu(u32 region) {
|
||||
BootGame(QString::fromStdString(Core::GetHomeMenuNcchPath(region)));
|
||||
}
|
||||
|
||||
void GMainWindow::InstallCIA(QStringList filepaths) {
|
||||
|
@ -2292,9 +2286,13 @@ void GMainWindow::UpdateStatusBar() {
|
|||
}
|
||||
|
||||
void GMainWindow::UpdateBootHomeMenuState() {
|
||||
const std::string home_menu_path = GetHomeMenuPath();
|
||||
ui->action_Boot_Home_Menu->setEnabled(!home_menu_path.empty() &&
|
||||
FileUtil::Exists(GetHomeMenuPath()));
|
||||
const auto current_region = Settings::values.region_value.GetValue();
|
||||
for (u32 region = 0; region < Core::NUM_SYSTEM_TITLE_REGIONS; region++) {
|
||||
const auto path = Core::GetHomeMenuNcchPath(region);
|
||||
ui->menu_Boot_Home_Menu->actions().at(region)->setEnabled(
|
||||
(current_region == Settings::REGION_VALUE_AUTO_SELECT || current_region == region) &&
|
||||
!path.empty() && FileUtil::Exists(path));
|
||||
}
|
||||
}
|
||||
|
||||
void GMainWindow::HideMouseCursor() {
|
||||
|
|
|
@ -196,7 +196,7 @@ private slots:
|
|||
void OnConfigurePerGame();
|
||||
void OnMenuLoadFile();
|
||||
void OnMenuInstallCIA();
|
||||
void OnMenuBootHomeMenu();
|
||||
void OnMenuBootHomeMenu(u32 region);
|
||||
void OnUpdateProgress(std::size_t written, std::size_t total);
|
||||
void OnCIAInstallReport(Service::AM::InstallStatus status, QString filepath);
|
||||
void OnCIAInstallFinished();
|
||||
|
|
|
@ -52,6 +52,18 @@
|
|||
<property name="title">
|
||||
<string>&File</string>
|
||||
</property>
|
||||
<widget class="QMenu" name="menu_Boot_Home_Menu">
|
||||
<property name="title">
|
||||
<string>Boot Home Menu</string>
|
||||
</property>
|
||||
<addaction name="action_Boot_Home_Menu_JPN"/>
|
||||
<addaction name="action_Boot_Home_Menu_USA"/>
|
||||
<addaction name="action_Boot_Home_Menu_EUR"/>
|
||||
<addaction name="action_Boot_Home_Menu_AUS"/>
|
||||
<addaction name="action_Boot_Home_Menu_CHN"/>
|
||||
<addaction name="action_Boot_Home_Menu_KOR"/>
|
||||
<addaction name="action_Boot_Home_Menu_TWN"/>
|
||||
</widget>
|
||||
<widget class="QMenu" name="menu_recent_files">
|
||||
<property name="title">
|
||||
<string>Recent Files</string>
|
||||
|
@ -66,7 +78,7 @@
|
|||
</widget>
|
||||
<addaction name="action_Load_File"/>
|
||||
<addaction name="action_Install_CIA"/>
|
||||
<addaction name="action_Boot_Home_Menu"/>
|
||||
<addaction name="menu_Boot_Home_Menu"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="menu_recent_files"/>
|
||||
<addaction name="separator"/>
|
||||
|
@ -210,9 +222,39 @@
|
|||
<string>Install CIA...</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="action_Boot_Home_Menu">
|
||||
<action name="action_Boot_Home_Menu_JPN">
|
||||
<property name="text">
|
||||
<string>Boot Home Menu</string>
|
||||
<string>JPN</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="action_Boot_Home_Menu_USA">
|
||||
<property name="text">
|
||||
<string>USA</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="action_Boot_Home_Menu_EUR">
|
||||
<property name="text">
|
||||
<string>EUR</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="action_Boot_Home_Menu_AUS">
|
||||
<property name="text">
|
||||
<string>AUS</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="action_Boot_Home_Menu_CHN">
|
||||
<property name="text">
|
||||
<string>CHN</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="action_Boot_Home_Menu_KOR">
|
||||
<property name="text">
|
||||
<string>KOR</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="action_Boot_Home_Menu_TWN">
|
||||
<property name="text">
|
||||
<string>TWN</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="action_Exit">
|
||||
|
|
|
@ -458,6 +458,8 @@ add_library(core STATIC
|
|||
rpc/udp_server.h
|
||||
savestate.cpp
|
||||
savestate.h
|
||||
system_titles.cpp
|
||||
system_titles.h
|
||||
telemetry_session.cpp
|
||||
telemetry_session.h
|
||||
tracer/citrace.h
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
#include "core/loader/ncch.h"
|
||||
#include "core/loader/smdh.h"
|
||||
#include "core/memory.h"
|
||||
#include "core/system_titles.h"
|
||||
#include "network/network.h"
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -162,7 +163,10 @@ ResultStatus AppLoader_NCCH::LoadExec(std::shared_ptr<Kernel::Process>& process)
|
|||
return ResultStatus::Error;
|
||||
}
|
||||
|
||||
void AppLoader_NCCH::ParseRegionLockoutInfo() {
|
||||
void AppLoader_NCCH::ParseRegionLockoutInfo(u64 program_id) {
|
||||
auto cfg = Service::CFG::GetModule(Core::System::GetInstance());
|
||||
ASSERT_MSG(cfg, "CFG Module missing!");
|
||||
|
||||
std::vector<u8> smdh_buffer;
|
||||
if (ReadIcon(smdh_buffer) == ResultStatus::Success && smdh_buffer.size() >= sizeof(SMDH)) {
|
||||
SMDH smdh;
|
||||
|
@ -176,9 +180,12 @@ void AppLoader_NCCH::ParseRegionLockoutInfo() {
|
|||
}
|
||||
region_lockout >>= 1;
|
||||
}
|
||||
auto cfg = Service::CFG::GetModule(Core::System::GetInstance());
|
||||
ASSERT_MSG(cfg, "CFG Module missing!");
|
||||
cfg->SetPreferredRegionCodes(regions);
|
||||
} else {
|
||||
const auto region = Core::GetSystemTitleRegion(program_id);
|
||||
if (region.has_value()) {
|
||||
cfg->SetPreferredRegionCodes({region.value()});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -229,7 +236,7 @@ ResultStatus AppLoader_NCCH::Load(std::shared_ptr<Kernel::Process>& process) {
|
|||
|
||||
system.ArchiveManager().RegisterSelfNCCH(*this);
|
||||
|
||||
ParseRegionLockoutInfo();
|
||||
ParseRegionLockoutInfo(ncch_program_id);
|
||||
|
||||
return ResultStatus::Success;
|
||||
}
|
||||
|
|
|
@ -76,7 +76,9 @@ private:
|
|||
ResultStatus LoadExec(std::shared_ptr<Kernel::Process>& process);
|
||||
|
||||
/// Reads the region lockout info in the SMDH and send it to CFG service
|
||||
void ParseRegionLockoutInfo();
|
||||
/// If an SMDH is not present, the program ID is compared against a list
|
||||
/// of known system titles to determine the region.
|
||||
void ParseRegionLockoutInfo(u64 program_id);
|
||||
|
||||
/// Detects whether the NCCH contains GBA Virtual Console.
|
||||
bool IsGbaVirtualConsole(const std::vector<u8>& code);
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,28 @@
|
|||
// Copyright 2023 Citra Emulator Project
|
||||
// Licensed under GPLv2 or any later version
|
||||
// Refer to the license.txt file included.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <vector>
|
||||
#include "common/common_types.h"
|
||||
|
||||
namespace Core {
|
||||
|
||||
constexpr u32 NUM_SYSTEM_TITLE_REGIONS = 7;
|
||||
|
||||
enum SystemTitleSet : u32 { Minimal = 1 << 0, Old3ds = 1 << 1, New3ds = 1 << 2 };
|
||||
|
||||
/// Returns a list of firmware title IDs for a specific set and region.
|
||||
std::vector<u64> GetSystemTitleIds(SystemTitleSet set, u32 region);
|
||||
|
||||
/// Gets the home menu title ID for a specific region.
|
||||
u64 GetHomeMenuTitleId(u32 region);
|
||||
|
||||
/// Gets the home menu NCCH path for a specific region.
|
||||
std::string GetHomeMenuNcchPath(u32 region);
|
||||
|
||||
/// Returns the region of a system title, if it can be determined.
|
||||
std::optional<u32> GetSystemTitleRegion(u64 title_id);
|
||||
|
||||
} // namespace Core
|
|
@ -3,7 +3,6 @@ add_library(web_service STATIC
|
|||
announce_room_json.h
|
||||
nus_download.cpp
|
||||
nus_download.h
|
||||
nus_titles.h
|
||||
precompiled_headers.h
|
||||
telemetry_json.cpp
|
||||
telemetry_json.h
|
||||
|
|
|
@ -1,761 +0,0 @@
|
|||
// Copyright 2023 Citra Emulator Project
|
||||
// Licensed under GPLv2 or any later version
|
||||
// Refer to the license.txt file included.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "common/common_types.h"
|
||||
|
||||
constexpr u32 SYSTEM_FIRMWARE_UPPER_TITLE_ID = 0x00040138;
|
||||
constexpr u32 SYSTEM_APPLICATION_UPPER_TITLE_ID = 0x00040010;
|
||||
constexpr u32 SYSTEM_DATA_ARCHIVE_UPPER_TITLE_ID = 0x0004001B;
|
||||
constexpr u32 SYSTEM_APPLET_UPPER_TITLE_ID = 0x00040030;
|
||||
constexpr u32 SHARED_DATA_ARCHIVE_UPPER_TITLE_ID = 0x0004009B;
|
||||
constexpr u32 SYSTEM_DATA_ARCHIVE_2_UPPER_TITLE_ID = 0x000400DB;
|
||||
constexpr u32 SYSTEM_MODULE_UPPER_TITLE_ID = 0x00040130;
|
||||
|
||||
struct Title {
|
||||
enum Mode { All, Recommended, Minimal };
|
||||
std::string name;
|
||||
u32 upper_title_id;
|
||||
std::array<u32, 6> lower_title_id;
|
||||
Mode mode = Mode::All;
|
||||
};
|
||||
|
||||
static const std::array<Title, 9> SYSTEM_FIRMWARE = {
|
||||
{{"Safe Mode Native Firmware",
|
||||
SYSTEM_FIRMWARE_UPPER_TITLE_ID,
|
||||
{{0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0x00000003}},
|
||||
Title::Mode::Minimal},
|
||||
{"New_3DS Safe Mode Native Firmware",
|
||||
SYSTEM_FIRMWARE_UPPER_TITLE_ID,
|
||||
{{0x20000003, 0x20000003, 0x20000003, 0x20000003, 0x20000003, 0x20000003}},
|
||||
Title::Mode::Minimal},
|
||||
{"Native Firmware",
|
||||
SYSTEM_FIRMWARE_UPPER_TITLE_ID,
|
||||
{{0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002}},
|
||||
Title::Mode::Minimal},
|
||||
{"New_3DS Native Firmware",
|
||||
SYSTEM_FIRMWARE_UPPER_TITLE_ID,
|
||||
{{0x20000002, 0x20000002, 0x20000002, 0x20000002, 0x20000002, 0x20000002}},
|
||||
Title::Mode::Minimal}}};
|
||||
static const std::array<Title, 17> SYSTEM_APPLICATIONS = {
|
||||
{{"System Settings",
|
||||
SYSTEM_APPLICATION_UPPER_TITLE_ID,
|
||||
{{0x00020000, 0x00021000, 0x00022000, 0x00026000, 0x00027000, 0x00028000}},
|
||||
Title::Mode::All},
|
||||
{"Download Play",
|
||||
SYSTEM_APPLICATION_UPPER_TITLE_ID,
|
||||
{{0x00020100, 0x00021100, 0x00022100, 0x00026100, 0x00027100, 0x00028100}},
|
||||
Title::Mode::Recommended},
|
||||
{"Activity Log",
|
||||
SYSTEM_APPLICATION_UPPER_TITLE_ID,
|
||||
{{0x00020200, 0x00021200, 0x00022200, 0x00026200, 0x00027200, 0x00028200}},
|
||||
Title::Mode::All},
|
||||
{"Health and Safety Information",
|
||||
SYSTEM_APPLICATION_UPPER_TITLE_ID,
|
||||
{{0x00020300, 0x00021300, 0x00022300, 0x00026300, 0x00027300, 0x00028300}},
|
||||
Title::Mode::All},
|
||||
{"New_3DS Health and Safety Information",
|
||||
SYSTEM_APPLICATION_UPPER_TITLE_ID,
|
||||
{{0x20020300, 0x20021300, 0x20022300, 0x0, 0x20027300, 0x0}},
|
||||
Title::Mode::All},
|
||||
{"Nintendo 3DS Camera",
|
||||
SYSTEM_APPLICATION_UPPER_TITLE_ID,
|
||||
{{0x00020400, 0x00021400, 0x00022400, 0x00026400, 0x00027400, 0x00028400}},
|
||||
Title::Mode::All},
|
||||
{"Nintendo 3DS Sound",
|
||||
SYSTEM_APPLICATION_UPPER_TITLE_ID,
|
||||
{{0x00020500, 0x00021500, 0x00022500, 0x00026500, 0x00027500, 0x00028500}},
|
||||
Title::Mode::All},
|
||||
{"Mii Maker",
|
||||
SYSTEM_APPLICATION_UPPER_TITLE_ID,
|
||||
{{0x00020700, 0x00021700, 0x00022700, 0x00026700, 0x00027700, 0x00028700}},
|
||||
Title::Mode::Recommended},
|
||||
{"StreetPass Mii Plaza",
|
||||
SYSTEM_APPLICATION_UPPER_TITLE_ID,
|
||||
{{0x00020800, 0x00021800, 0x00022800, 0x00026800, 0x00027800, 0x00028800}},
|
||||
Title::Mode::All},
|
||||
{"eShop",
|
||||
SYSTEM_APPLICATION_UPPER_TITLE_ID,
|
||||
{{0x00020900, 0x00021900, 0x00022900, 0x0, 0x00027900, 0x00028900}},
|
||||
Title::Mode::Recommended},
|
||||
{"System Transfer",
|
||||
SYSTEM_APPLICATION_UPPER_TITLE_ID,
|
||||
{{0x00020A00, 0x00021A00, 0x00022A00, 0x0, 0x00027A00, 0x00028A00}},
|
||||
Title::Mode::All},
|
||||
{"Nintendo Zone",
|
||||
SYSTEM_APPLICATION_UPPER_TITLE_ID,
|
||||
{{0x00020B00, 0x00021B00, 0x00022B00, 0x0, 0x0, 0x0}},
|
||||
Title::Mode::All},
|
||||
{"Face Raiders",
|
||||
SYSTEM_APPLICATION_UPPER_TITLE_ID,
|
||||
{{0x00020D00, 0x00021D00, 0x00022D00, 0x00026D00, 0x00027D00, 0x00028D00}},
|
||||
Title::Mode::All},
|
||||
{"New_3DS Face Raiders",
|
||||
SYSTEM_APPLICATION_UPPER_TITLE_ID,
|
||||
{{0x20020D00, 0x20021D00, 0x20022D00, 0x0, 0x20027D00, 0x0}},
|
||||
Title::Mode::All},
|
||||
{"AR Games",
|
||||
SYSTEM_APPLICATION_UPPER_TITLE_ID,
|
||||
{{0x00020E00, 0x00021E00, 0x00022E00, 0x00026E00, 0x00027E00, 0x00028E00}},
|
||||
Title::Mode::All},
|
||||
{"Nintendo Network ID Settings",
|
||||
SYSTEM_APPLICATION_UPPER_TITLE_ID,
|
||||
{{0x0002BF00, 0x0002C000, 0x0002C100, 0x0, 0x0, 0x0}},
|
||||
Title::Mode::Recommended},
|
||||
{"microSD Management",
|
||||
SYSTEM_APPLICATION_UPPER_TITLE_ID,
|
||||
{{0x20023100, 0x20024100, 0x20025100, 0x0, 0x0, 0x0}},
|
||||
Title::Mode::All}}};
|
||||
|
||||
static const std::array<Title, 7> SYSTEM_DATA_ARCHIVES = {
|
||||
{{"ClCertA",
|
||||
SYSTEM_DATA_ARCHIVE_UPPER_TITLE_ID,
|
||||
{{0x00010002, 0x00010002, 0x00010002, 0x00010002, 0x00010002, 0x00010002}},
|
||||
Title::Mode::Recommended},
|
||||
{"NS CFA",
|
||||
SYSTEM_DATA_ARCHIVE_UPPER_TITLE_ID,
|
||||
{{0x00010702, 0x00010702, 0x00010702, 0x00010702, 0x00010702, 0x00010702}},
|
||||
Title::Mode::All},
|
||||
{"dummy.txt",
|
||||
SYSTEM_DATA_ARCHIVE_UPPER_TITLE_ID,
|
||||
{{0x00010802, 0x00010802, 0x00010802, 0x00010802, 0x00010802, 0x00010802}},
|
||||
Title::Mode::All},
|
||||
{"CFA web-browser data",
|
||||
SYSTEM_DATA_ARCHIVE_UPPER_TITLE_ID,
|
||||
{{0x00018002, 0x00018002, 0x00018002, 0x00018002, 0x00018002, 0x00018002}},
|
||||
Title::Mode::All},
|
||||
{"local web-browser data",
|
||||
SYSTEM_DATA_ARCHIVE_UPPER_TITLE_ID,
|
||||
{{0x00018102, 0x00018102, 0x00018102, 0x00018102, 0x00018102, 0x00018102}},
|
||||
Title::Mode::All},
|
||||
{"webkit/OSS CROs",
|
||||
SYSTEM_DATA_ARCHIVE_UPPER_TITLE_ID,
|
||||
{{0x00018202, 0x00018202, 0x00018202, 0x00018202, 0x00018202, 0x00018202}},
|
||||
Title::Mode::All},
|
||||
{"Fangate_updater",
|
||||
SYSTEM_DATA_ARCHIVE_UPPER_TITLE_ID,
|
||||
{{0x00019002, 0x00019002, 0x00019002, 0x00019002, 0x00019002, 0x00019002}},
|
||||
Title::Mode::All}}};
|
||||
|
||||
static const std::array<Title, 27> SYSTEM_APPLETS = {
|
||||
{{"Home Menu",
|
||||
SYSTEM_APPLET_UPPER_TITLE_ID,
|
||||
{{0x00008202, 0x00008F02, 0x00009802, 0x0000A102, 0x0000A902, 0x0000B102}},
|
||||
Title::Mode::All},
|
||||
{"Camera applet",
|
||||
SYSTEM_APPLET_UPPER_TITLE_ID,
|
||||
{{0x00008402, 0x00009002, 0x00009902, 0x0000A202, 0x0000AA02, 0x0000B202}},
|
||||
Title::Mode::All},
|
||||
{"Instruction Manual",
|
||||
SYSTEM_APPLET_UPPER_TITLE_ID,
|
||||
{{0x00008602, 0x00009202, 0x00009B02, 0x0000A402, 0x0000AC02, 0x0000B402}},
|
||||
Title::Mode::Recommended},
|
||||
{"Game Notes",
|
||||
SYSTEM_APPLET_UPPER_TITLE_ID,
|
||||
{{0x00008702, 0x00009302, 0x00009C02, 0x0000A502, 0x0000AD02, 0x0000B502}},
|
||||
Title::Mode::All},
|
||||
{"Internet Browser",
|
||||
SYSTEM_APPLET_UPPER_TITLE_ID,
|
||||
{{0x00008802, 0x00009402, 0x00009D02, 0x0000A602, 0x0000AE02, 0x0000B602}},
|
||||
Title::Mode::All},
|
||||
{"New 3DS Internet Browser",
|
||||
SYSTEM_APPLET_UPPER_TITLE_ID,
|
||||
{{0x20008802, 0x20009402, 0x20009D02, 0x0, 0x2000AE02, 0x0}},
|
||||
Title::Mode::All},
|
||||
{"Fatal error viewer",
|
||||
SYSTEM_APPLET_UPPER_TITLE_ID,
|
||||
{{0x00008A02, 0x00008A02, 0x00008A02, 0x00008A02, 0x00008A02, 0x00008A02}},
|
||||
Title::Mode::All},
|
||||
{"Safe Mode Fatal error viewer",
|
||||
SYSTEM_APPLET_UPPER_TITLE_ID,
|
||||
{{0x00008A03, 0x00008A03, 0x00008A03, 0x00008A03, 0x00008A03, 0x00008A03}},
|
||||
Title::Mode::All},
|
||||
{"New 3DS Safe Mode Fatal error viewer",
|
||||
SYSTEM_APPLET_UPPER_TITLE_ID,
|
||||
{{0x20008A03, 0x20008A03, 0x20008A03, 0x0, 0x20008A03, 0x0}},
|
||||
Title::Mode::All},
|
||||
{"Friend List",
|
||||
SYSTEM_APPLET_UPPER_TITLE_ID,
|
||||
{{0x00008D02, 0x00009602, 0x00009F02, 0x0000A702, 0x0000AF02, 0x0000B702}},
|
||||
Title::Mode::Recommended},
|
||||
{"Notifications",
|
||||
SYSTEM_APPLET_UPPER_TITLE_ID,
|
||||
{{0x00008E02, 0x000009702, 0x0000A002, 0x0000A802, 0x0000B002, 0x0000B802}},
|
||||
Title::Mode::All},
|
||||
{"Software Keyboard",
|
||||
SYSTEM_APPLET_UPPER_TITLE_ID,
|
||||
{{0x00000C002, 0x0000C802, 0x0000D002, 0x0000D802, 0x0000DE02, 0x0000E402}},
|
||||
Title::Mode::Recommended},
|
||||
{"Safe Mode Software Keyboard",
|
||||
SYSTEM_APPLET_UPPER_TITLE_ID,
|
||||
{{0x00000C003, 0x0000C803, 0x0000D003, 0x0000D803, 0x0000DE03, 0x0000E403}},
|
||||
Title::Mode::All},
|
||||
{"New 3DS Safe Mode Software Keyboard",
|
||||
SYSTEM_APPLET_UPPER_TITLE_ID,
|
||||
{{0x2000C003, 0x2000C803, 0x2000D003, 0x0, 0x2000DE03, 0x0}},
|
||||
Title::Mode::All},
|
||||
{"Mii picker",
|
||||
SYSTEM_APPLET_UPPER_TITLE_ID,
|
||||
{{0x0000C102, 0x0000C902, 0x0000D102, 0x0000D902, 0x0000DF02, 0x0000E502}},
|
||||
Title::Mode::Recommended},
|
||||
{"Picture picker",
|
||||
SYSTEM_APPLET_UPPER_TITLE_ID,
|
||||
{{0x0000C302, 0x0000CB02, 0x0000D302, 0x0000DB02, 0x0000E102, 0x0000E702}},
|
||||
Title::Mode::All},
|
||||
{"Voice memo picker",
|
||||
SYSTEM_APPLET_UPPER_TITLE_ID,
|
||||
{{0x0000C402, 0x0000CC02, 0x0000D402, 0x0000DC02, 0x0000E202, 0x0000E802}},
|
||||
Title::Mode::All},
|
||||
{"Error display",
|
||||
SYSTEM_APPLET_UPPER_TITLE_ID,
|
||||
{{0x0000C502, 0x0000C502, 0x0000C502, 0x0000CF02, 0x0000CF02, 0x0000CF02}},
|
||||
Title::Mode::All},
|
||||
{"Safe mode error display",
|
||||
SYSTEM_APPLET_UPPER_TITLE_ID,
|
||||
{{0x0000C503, 0x0000C503, 0x0000C503, 0x0000CF03, 0x0000CF03, 0x0000CF03}},
|
||||
Title::Mode::All},
|
||||
{"New 3DS safe mode error display",
|
||||
SYSTEM_APPLET_UPPER_TITLE_ID,
|
||||
{{0x2000C503, 0x2000C503, 0x2000C503, 0x0, 0x2000CF03, 0x0}},
|
||||
Title::Mode::All},
|
||||
{"Circle Pad Pro test/calibration applet",
|
||||
SYSTEM_APPLET_UPPER_TITLE_ID,
|
||||
{{0x0000CD02, 0x0000CD02, 0x0000CD02, 0x0000D502, 0x0000D502, 0x0000D502}},
|
||||
Title::Mode::All},
|
||||
{"eShop applet",
|
||||
SYSTEM_APPLET_UPPER_TITLE_ID,
|
||||
{{0x0000C602, 0x0000CE02, 0x0000D602, 0x0, 0x0000E302, 0x0000E902}},
|
||||
Title::Mode::Recommended},
|
||||
{"Miiverse",
|
||||
SYSTEM_APPLET_UPPER_TITLE_ID,
|
||||
{{0x0000BC02, 0x0000BC02, 0x0000BC02, 0x0, 0x0, 0x0}},
|
||||
Title::Mode::All},
|
||||
{"Miiverse system library",
|
||||
SYSTEM_APPLET_UPPER_TITLE_ID,
|
||||
{{0x0000F602, 0x0000F602, 0x0000F602, 0x0, 0x0, 0x0}},
|
||||
Title::Mode::All},
|
||||
{"Miiverse-posting applet",
|
||||
SYSTEM_APPLET_UPPER_TITLE_ID,
|
||||
{{0x00008302, 0x00008B02, 0x0000BA02, 0x0, 0x0, 0x0}},
|
||||
Title::Mode::All},
|
||||
{"Amiibo Settings",
|
||||
SYSTEM_APPLET_UPPER_TITLE_ID,
|
||||
{{0x00009502, 0x00009E02, 0x0000B902, 0x0, 0x00008C02, 0x0000BF02}},
|
||||
Title::Mode::All}}};
|
||||
|
||||
static const std::array<Title, 25> SHARED_DATA_ARCHIVES = {
|
||||
{{"CFL_Res.dat",
|
||||
SHARED_DATA_ARCHIVE_UPPER_TITLE_ID,
|
||||
{{0x00010202, 0x00010202, 0x00010202, 0x00010202, 0x00010202, 0x00010202}},
|
||||
Title::Mode::All},
|
||||
{"Region Manifest",
|
||||
SHARED_DATA_ARCHIVE_UPPER_TITLE_ID,
|
||||
{{0x00010402, 0x00010402, 0x00010402, 0x00010402, 0x00010402, 0x00010402}},
|
||||
Title::Mode::All},
|
||||
{"Non-Nintendo TLS Root-CA Certificates",
|
||||
SHARED_DATA_ARCHIVE_UPPER_TITLE_ID,
|
||||
{{0x00010602, 0x00010602, 0x00010602, 0x00010602, 0x00010602, 0x00010602}},
|
||||
Title::Mode::Recommended},
|
||||
{"CHN/CN Dictionary",
|
||||
SHARED_DATA_ARCHIVE_UPPER_TITLE_ID,
|
||||
{{0x0, 0x0, 0x0, 0x00011002, 0x0, 0x0}},
|
||||
Title::Mode::All},
|
||||
{"TWN/TN dictionary",
|
||||
SHARED_DATA_ARCHIVE_UPPER_TITLE_ID,
|
||||
{{0x0, 0x0, 0x0, 0x0, 0x0, 0x00011102}},
|
||||
Title::Mode::All},
|
||||
{"NL/NL dictionary",
|
||||
SHARED_DATA_ARCHIVE_UPPER_TITLE_ID,
|
||||
{{0x0, 0x0, 0x00011202, 0x0, 0x0, 0x0}},
|
||||
Title::Mode::All},
|
||||
{"EN/GB dictionary",
|
||||
SHARED_DATA_ARCHIVE_UPPER_TITLE_ID,
|
||||
{{0x0, 0x0, 0x00011302, 0x0, 0x0, 0x0}},
|
||||
Title::Mode::All},
|
||||
{"EN/US dictionary",
|
||||
SHARED_DATA_ARCHIVE_UPPER_TITLE_ID,
|
||||
{{0x0, 0x00011402, 0x0, 0x0, 0x0, 0x0}},
|
||||
Title::Mode::All},
|
||||
{"FR/FR/regular dictionary",
|
||||
SHARED_DATA_ARCHIVE_UPPER_TITLE_ID,
|
||||
{{0x0, 0x0, 0x00011502, 0x0, 0x0, 0x0}},
|
||||
Title::Mode::All},
|
||||
{"FR/CA/regular dictionary",
|
||||
SHARED_DATA_ARCHIVE_UPPER_TITLE_ID,
|
||||
{{0x0, 0x00011602, 0x0, 0x0, 0x0, 0x0}},
|
||||
Title::Mode::All},
|
||||
{"DE/regular dictionary",
|
||||
SHARED_DATA_ARCHIVE_UPPER_TITLE_ID,
|
||||
{{0x0, 0x0, 0x00011702, 0x0, 0x0, 0x0}},
|
||||
Title::Mode::All},
|
||||
{"IT/IT dictionary",
|
||||
SHARED_DATA_ARCHIVE_UPPER_TITLE_ID,
|
||||
{{0x0, 0x0, 0x00011802, 0x0, 0x0, 0x0}},
|
||||
Title::Mode::All},
|
||||
{"JA_small/32 dictionary",
|
||||
SHARED_DATA_ARCHIVE_UPPER_TITLE_ID,
|
||||
{{0x00011902, 0x0, 0x0, 0x0, 0x0, 0x0}},
|
||||
Title::Mode::All},
|
||||
{"KO/KO dictionary",
|
||||
SHARED_DATA_ARCHIVE_UPPER_TITLE_ID,
|
||||
{{0x0, 0x0, 0x0, 0x0, 0x00011A02, 0x0}},
|
||||
Title::Mode::All},
|
||||
{"PT/PT/regular dictionary",
|
||||
SHARED_DATA_ARCHIVE_UPPER_TITLE_ID,
|
||||
{{0x0, 0x0, 0x00011B02, 0x0, 0x0, 0x0}},
|
||||
Title::Mode::All},
|
||||
{"RU/regular dictionary",
|
||||
SHARED_DATA_ARCHIVE_UPPER_TITLE_ID,
|
||||
{{0x0, 0x0, 0x00011C02, 0x0, 0x0, 0x0}},
|
||||
Title::Mode::All},
|
||||
{"ES/ES dictionary",
|
||||
SHARED_DATA_ARCHIVE_UPPER_TITLE_ID,
|
||||
{{0x0, 0x00011D02, 0x00011D02, 0x0, 0x0, 0x0}},
|
||||
Title::Mode::All},
|
||||
{"PT/BR/regular dictionary",
|
||||
SHARED_DATA_ARCHIVE_UPPER_TITLE_ID,
|
||||
{{0x0, 0x00011E02, 0x0, 0x0, 0x0, 0x0}},
|
||||
Title::Mode::All},
|
||||
{"error strings",
|
||||
SHARED_DATA_ARCHIVE_UPPER_TITLE_ID,
|
||||
{{0x00012202, 0x00012302, 0x00012102, 0x00012402, 0x00012502, 0x00012602}},
|
||||
Title::Mode::All},
|
||||
{"eula",
|
||||
SHARED_DATA_ARCHIVE_UPPER_TITLE_ID,
|
||||
{{0x00013202, 0x00013302, 0x00013102, 0x00013502, 0x0, 0x0}},
|
||||
Title::Mode::All},
|
||||
{"JPN/EUR/USA System Font",
|
||||
SHARED_DATA_ARCHIVE_UPPER_TITLE_ID,
|
||||
{{0x00014002, 0x00014002, 0x00014002, 0x00014002, 0x00014002, 0x00014002}},
|
||||
Title::Mode::Recommended},
|
||||
{"CHN System Font",
|
||||
SHARED_DATA_ARCHIVE_UPPER_TITLE_ID,
|
||||
{{0x00014102, 0x00014102, 0x00014102, 0x00014102, 0x00014102, 0x00014102}},
|
||||
Title::Mode::Recommended},
|
||||
{"KOR System Font",
|
||||
SHARED_DATA_ARCHIVE_UPPER_TITLE_ID,
|
||||
{{0x00014202, 0x00014202, 0x00014202, 0x00014202, 0x00014202, 0x00014202}},
|
||||
Title::Mode::Recommended},
|
||||
{"TWN System Font",
|
||||
SHARED_DATA_ARCHIVE_UPPER_TITLE_ID,
|
||||
{{0x00014302, 0x00014302, 0x00014302, 0x00014302, 0x00014302, 0x00014302}},
|
||||
Title::Mode::Recommended},
|
||||
{"rate",
|
||||
SHARED_DATA_ARCHIVE_UPPER_TITLE_ID,
|
||||
{{0x00015202, 0x00015302, 0x00015102, 0x0, 0x0015502, 0x00015602}},
|
||||
Title::Mode::All}}};
|
||||
|
||||
static const std::array<Title, 5> SYSTEM_DATA_ARCHIVES_2 = {
|
||||
{{"bad word list",
|
||||
SYSTEM_DATA_ARCHIVE_2_UPPER_TITLE_ID,
|
||||
{{0x00010302, 0x00010302, 0x00010302, 0x00010302, 0x00010302, 0x00010302}},
|
||||
Title::Mode::All},
|
||||
{"Nintendo Zone hotspot list",
|
||||
SYSTEM_DATA_ARCHIVE_2_UPPER_TITLE_ID,
|
||||
{{0x00010502, 0x00010502, 0x00010502, 0x00010502, 0x00010502, 0x00010502}},
|
||||
Title::Mode::All},
|
||||
{"NVer",
|
||||
SYSTEM_DATA_ARCHIVE_2_UPPER_TITLE_ID,
|
||||
{{0x00016102, 0x00016202, 0x00016302, 0x00016402, 0x00016502, 0x00016602}},
|
||||
Title::Mode::All},
|
||||
{"New_3DS NVer",
|
||||
SYSTEM_DATA_ARCHIVE_2_UPPER_TITLE_ID,
|
||||
{{0x20016102, 0x20016202, 0x20016302, 0x0, 0x20016502, 0x0}},
|
||||
Title::Mode::All},
|
||||
{"CVer",
|
||||
SYSTEM_DATA_ARCHIVE_2_UPPER_TITLE_ID,
|
||||
{{0x00017102, 0x00017202, 0x00017302, 0x00017402, 0x00017502, 0x00017602}},
|
||||
Title::Mode::All}}};
|
||||
|
||||
static const std::array<Title, 100> SYSTEM_MODULES = {
|
||||
{{"AM ( Application Manager )",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00001502, 0x00001502, 0x00001502, 0x00001502, 0x00001502, 0x00001502}},
|
||||
Title::Mode::All},
|
||||
{"Safe Mode AM",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00001503, 0x00001503, 0x00001503, 0x00001503, 0x00001503, 0x00001503}},
|
||||
Title::Mode::All},
|
||||
{"New_3DS Safe Mode AM",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x20001503, 0x20001503, 0x20001503, 0x20001503, 0x20001503, 0x20001503}},
|
||||
Title::Mode::All},
|
||||
{"Camera",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00001602, 0x00001602, 0x00001602, 0x00001602, 0x00001602, 0x00001602}},
|
||||
Title::Mode::All},
|
||||
{"New_3DS Camera",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x20001602, 0x20001602, 0x20001602, 0x20001602, 0x20001602, 0x20001602}},
|
||||
Title::Mode::All},
|
||||
{"Config (cfg)",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00001702, 0x00001702, 0x00001702, 0x00001702, 0x00001702, 0x00001702}},
|
||||
Title::Mode::All},
|
||||
{"Safe Mode Config (cfg)",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00001703, 0x00001703, 0x00001703, 0x00001703, 0x00001703, 0x00001703}},
|
||||
Title::Mode::All},
|
||||
{"New_3DS Safe Mode Config (cfg)",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x20001703, 0x20001703, 0x20001703, 0x20001703, 0x20001703, 0x20001703}},
|
||||
Title::Mode::All},
|
||||
{"Codec",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00001802, 0x00001802, 0x00001802, 0x00001802, 0x00001802, 0x00001802}},
|
||||
Title::Mode::All},
|
||||
{"Safe Mode Codec",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00001803, 0x00001803, 0x00001803, 0x00001803, 0x00001803, 0x00001803}},
|
||||
Title::Mode::All},
|
||||
{"New_3DS Safe Mode Codec",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x20001803, 0x20001803, 0x20001803, 0x20001803, 0x20001803, 0x20001803}},
|
||||
Title::Mode::All},
|
||||
{"DSP",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00001A02, 0x00001A02, 0x00001A02, 0x00001A02, 0x00001A02, 0x00001A02}},
|
||||
Title::Mode::All},
|
||||
{"Safe Mode DSP",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00001A03, 0x00001A03, 0x00001A03, 0x00001A03, 0x00001A03, 0x00001A03}},
|
||||
Title::Mode::All},
|
||||
{"New_3DS Safe Mode DSP",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x20001A03, 0x20001A03, 0x20001A03, 0x20001A03, 0x20001A03, 0x20001A03}},
|
||||
Title::Mode::All},
|
||||
{"GPIO",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00001B02, 0x00001B02, 0x00001B02, 0x00001B02, 0x00001B02, 0x00001B02}},
|
||||
Title::Mode::All},
|
||||
{"Safe Mode GPIO",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00001B03, 0x00001B03, 0x00001B03, 0x00001B03, 0x00001B03, 0x00001B03}},
|
||||
Title::Mode::All},
|
||||
{"New_3DS Safe Mode GPIO",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x20001B03, 0x20001B03, 0x20001B03, 0x20001B03, 0x20001B03, 0x20001B03}},
|
||||
Title::Mode::All},
|
||||
{"GSP",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00001C02, 0x00001C02, 0x00001C02, 0x00001C02, 0x00001C02, 0x00001C02}},
|
||||
Title::Mode::All},
|
||||
{"New_3DS GSP",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x20001C02, 0x20001C02, 0x20001C02, 0x20001C02, 0x20001C02, 0x20001C02}},
|
||||
Title::Mode::All},
|
||||
{"Safe Mode GSP",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00001C03, 0x00001C03, 0x00001C03, 0x00001C03, 0x00001C03, 0x00001C03}},
|
||||
Title::Mode::All},
|
||||
{"New_3DS Safe Mode GSP",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x20001C03, 0x20001C03, 0x20001C03, 0x20001C03, 0x20001C03, 0x20001C03}},
|
||||
Title::Mode::All},
|
||||
{"HID (Human Interface Devices)",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00001D02, 0x00001D02, 0x00001D02, 0x00001D02, 0x00001D02, 0x00001D02}},
|
||||
Title::Mode::All},
|
||||
{"Safe Mode HID",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00001D03, 0x00001D03, 0x00001D03, 0x00001D03, 0x00001D03, 0x00001D03}},
|
||||
Title::Mode::All},
|
||||
{"New_3DS Safe Mode HID",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x20001D03, 0x20001D03, 0x20001D03, 0x20001D03, 0x20001D03, 0x20001D03}},
|
||||
Title::Mode::All},
|
||||
{"i2c",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00001E02, 0x00001E02, 0x00001E02, 0x00001E02, 0x00001E02, 0x00001E02}},
|
||||
Title::Mode::All},
|
||||
{"New_3DS i2c",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x20001E02, 0x20001E02, 0x20001E02, 0x20001E02, 0x20001E02, 0x20001E02}},
|
||||
Title::Mode::All},
|
||||
{"Safe Mode i2c",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00001E03, 0x00001E03, 0x00001E03, 0x00001E03, 0x00001E03, 0x00001E03}},
|
||||
Title::Mode::All},
|
||||
{"New_3DS Safe Mode i2c",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x20001E03, 0x20001E03, 0x20001E03, 0x20001E03, 0x20001E03, 0x20001E03}},
|
||||
Title::Mode::All},
|
||||
{"MCU",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00001F02, 0x00001F02, 0x00001F02, 0x00001F02, 0x00001F02, 0x00001F02}},
|
||||
Title::Mode::All},
|
||||
{"New_3DS MCU",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x20001F02, 0x20001F02, 0x20001F02, 0x20001F02, 0x20001F02, 0x20001F02}},
|
||||
Title::Mode::All},
|
||||
{"Safe Mode MCU",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00001F03, 0x00001F03, 0x00001F03, 0x00001F03, 0x00001F03, 0x00001F03}},
|
||||
Title::Mode::All},
|
||||
{"New_3DS Safe Mode MCU",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x20001F03, 0x20001F03, 0x20001F03, 0x20001F03, 0x20001F03, 0x20001F03}},
|
||||
Title::Mode::All},
|
||||
{"MIC (Microphone)",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00002002, 0x00002002, 0x00002002, 0x00002002, 0x00002002, 0x00002002}},
|
||||
Title::Mode::All},
|
||||
{"PDN",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00002102, 0x00002102, 0x00002102, 0x00002102, 0x00002102, 0x00002102}},
|
||||
Title::Mode::All},
|
||||
{"Safe Mode PDN",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00002103, 0x00002103, 0x00002103, 0x00002103, 0x00002103, 0x00002103}},
|
||||
Title::Mode::All},
|
||||
{"New_3DS Safe Mode PDN",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x20002103, 0x20002103, 0x20002103, 0x20002103, 0x20002103, 0x20002103}},
|
||||
Title::Mode::All},
|
||||
{"PTM (Play time, pedometer, and battery manager)",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00002202, 0x00002202, 0x00002202, 0x00002202, 0x00002202, 0x00002202}},
|
||||
Title::Mode::All},
|
||||
{"New_3DS PTM (Play time, pedometer, and battery manager)",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x20002202, 0x20002202, 0x20002202, 0x20002202, 0x20002202, 0x20002202}},
|
||||
Title::Mode::All},
|
||||
{"Safe Mode PTM",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00002203, 0x00002203, 0x00002203, 0x00002203, 0x00002203, 0x00002203}},
|
||||
Title::Mode::All},
|
||||
{"New_3DS Safe Mode PTM",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x20002203, 0x20002203, 0x20002203, 0x20002203, 0x20002203, 0x20002203}},
|
||||
Title::Mode::All},
|
||||
{"spi",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00002302, 0x00002302, 0x00002302, 0x00002302, 0x00002302, 0x00002302}},
|
||||
Title::Mode::All},
|
||||
{"New_3DS spi",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x20002302, 0x20002302, 0x20002302, 0x20002302, 0x20002302, 0x20002302}},
|
||||
Title::Mode::All},
|
||||
{"Safe Mode spi",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00002303, 0x00002303, 0x00002303, 0x00002303, 0x00002303, 0x00002303}},
|
||||
Title::Mode::All},
|
||||
{"New_3DS Safe Mode spi",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x20002303, 0x20002303, 0x20002303, 0x20002303, 0x20002303, 0x20002303}},
|
||||
Title::Mode::All},
|
||||
{"AC (Network manager)",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00002402, 0x00002402, 0x00002402, 0x00002402, 0x00002402, 0x00002402}},
|
||||
Title::Mode::All},
|
||||
{"Safe Mode AC",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00002403, 0x00002403, 0x00002403, 0x00002403, 0x00002403, 0x00002403}},
|
||||
Title::Mode::All},
|
||||
{"New_3DS Safe Mode AC",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x20002403, 0x20002403, 0x20002403, 0x20002403, 0x20002403, 0x20002403}},
|
||||
Title::Mode::All},
|
||||
{"Cecd (StreetPass)",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00002602, 0x00002602, 0x00002602, 0x00002602, 0x00002602, 0x00002602}},
|
||||
Title::Mode::All},
|
||||
{"CSND",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00002702, 0x00002702, 0x00002702, 0x00002702, 0x00002702, 0x00002702}},
|
||||
Title::Mode::All},
|
||||
{"Safe Mode CSND",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00002703, 0x00002703, 0x00002703, 0x00002703, 0x00002703, 0x00002703}},
|
||||
Title::Mode::All},
|
||||
{"New_3DS Safe Mode CSND",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x20002703, 0x20002703, 0x20002703, 0x20002703, 0x20002703, 0x20002703}},
|
||||
Title::Mode::All},
|
||||
{"DLP (Download Play)",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00002802, 0x00002802, 0x00002802, 0x00002802, 0x00002802, 0x00002802}},
|
||||
Title::Mode::Recommended},
|
||||
{"HTTP",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00002902, 0x00002902, 0x00002902, 0x00002902, 0x00002902, 0x00002902}},
|
||||
Title::Mode::All},
|
||||
{"Safe Mode HTTP",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00002903, 0x00002903, 0x00002903, 0x00002903, 0x00002903, 0x00002903}},
|
||||
Title::Mode::All},
|
||||
{"New_3DS Safe Mode HTTP",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x20002903, 0x20002903, 0x20002903, 0x20002903, 0x20002903, 0x20002903}},
|
||||
Title::Mode::All},
|
||||
{"MP",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00002A02, 0x00002A02, 0x00002A02, 0x00002A02, 0x00002A02, 0x00002A02}},
|
||||
Title::Mode::All},
|
||||
{"Safe Mode MP",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00002A03, 0x00002A03, 0x00002A03, 0x00002A03, 0x00002A03, 0x00002A03}},
|
||||
Title::Mode::All},
|
||||
{"NDM",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00002B02, 0x00002B02, 0x00002B02, 0x00002B02, 0x00002B02, 0x00002B02}},
|
||||
Title::Mode::All},
|
||||
{"NIM",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00002C02, 0x00002C02, 0x00002C02, 0x00002C02, 0x00002C02, 0x00002C02}},
|
||||
Title::Mode::All},
|
||||
{"Safe Mode NIM",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00002C03, 0x00002C03, 0x00002C03, 0x00002C03, 0x00002C03, 0x00002C03}},
|
||||
Title::Mode::All},
|
||||
{"New_3DS Safe Mode NIM",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x20002C03, 0x20002C03, 0x20002C03, 0x20002C03, 0x20002C03, 0x20002C03}},
|
||||
Title::Mode::All},
|
||||
{"NWM ( Low-level wifi manager )",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00002D02, 0x00002D02, 0x00002D02, 0x00002D02, 0x00002D02, 0x00002D02}},
|
||||
Title::Mode::All},
|
||||
{"Safe Mode NWM",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00002D03, 0x00002D03, 0x00002D03, 0x00002D03, 0x00002D03, 0x00002D03}},
|
||||
Title::Mode::All},
|
||||
{"New_3DS Safe Mode NWM",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x20002D03, 0x20002D03, 0x20002D03, 0x20002D03, 0x20002D03, 0x20002D03}},
|
||||
Title::Mode::All},
|
||||
{"Sockets",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00002E02, 0x00002E02, 0x00002E02, 0x00002E02, 0x00002E02, 0x00002E02}},
|
||||
Title::Mode::All},
|
||||
{"Safe Mode Sockets",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00002E03, 0x00002E03, 0x00002E03, 0x00002E03, 0x00002E03, 0x00002E03}},
|
||||
Title::Mode::All},
|
||||
{"New_3DS Safe Mode Sockets",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x20002E03, 0x20002E03, 0x20002E03, 0x20002E03, 0x20002E03, 0x20002E03}},
|
||||
Title::Mode::All},
|
||||
{"SSL",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00002F02, 0x00002F02, 0x00002F02, 0x00002F02, 0x00002F02, 0x00002F02}},
|
||||
Title::Mode::All},
|
||||
{"Safe Mode SSL",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00002F03, 0x00002F03, 0x00002F03, 0x00002F03, 0x00002F03, 0x00002F03}},
|
||||
Title::Mode::All},
|
||||
{"New_3DS Safe Mode SSL",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x20002F03, 0x20002F03, 0x20002F03, 0x20002F03, 0x20002F03, 0x20002F03}},
|
||||
Title::Mode::All},
|
||||
{"PS ( Process Manager )",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00003102, 0x00003102, 0x00003102, 0x00003102, 0x00003102, 0x00003102}},
|
||||
Title::Mode::All},
|
||||
{"Safe Mode PS",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00003103, 0x00003103, 0x00003103, 0x00003103, 0x00003103, 0x00003103}},
|
||||
Title::Mode::All},
|
||||
{"New_3DS Safe Mode PS",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x20003103, 0x20003103, 0x20003103, 0x20003103, 0x20003103, 0x20003103}},
|
||||
Title::Mode::All},
|
||||
{"friends (Friends list)",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00003202, 0x00003202, 0x00003202, 0x00003202, 0x00003202, 0x00003202}},
|
||||
Title::Mode::All},
|
||||
{"Safe Mode friends (Friends list)",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00003203, 0x00003203, 0x00003203, 0x00003203, 0x00003203, 0x00003203}},
|
||||
Title::Mode::All},
|
||||
{"New_3DS Safe Mode friends (Friends list)",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x20003203, 0x20003203, 0x20003203, 0x20003203, 0x20003203, 0x20003203}},
|
||||
Title::Mode::All},
|
||||
{"IR (Infrared)",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00003302, 0x00003302, 0x00003302, 0x00003302, 0x00003302, 0x00003302}},
|
||||
Title::Mode::All},
|
||||
{"Safe Mode IR",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00003303, 0x00003303, 0x00003303, 0x00003303, 0x00003303, 0x00003303}},
|
||||
Title::Mode::All},
|
||||
{"New_3DS Safe Mode IR",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x20003303, 0x20003303, 0x20003303, 0x20003303, 0x20003303, 0x20003303}},
|
||||
Title::Mode::All},
|
||||
{"BOSS (SpotPass)",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00003402, 0x00003402, 0x00003402, 0x00003402, 0x00003402, 0x00003402}},
|
||||
Title::Mode::All},
|
||||
{"News (Notifications)",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00003502, 0x00003502, 0x00003502, 0x00003502, 0x00003502, 0x00003502}},
|
||||
Title::Mode::All},
|
||||
{"RO",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00003702, 0x00003702, 0x00003702, 0x00003702, 0x00003702, 0x00003702}},
|
||||
Title::Mode::All},
|
||||
{"act",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00003802, 0x00003802, 0x00003802, 0x00003802, 0x00003802, 0x00003802}},
|
||||
Title::Mode::All},
|
||||
{"nfc",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00004002, 0x00004002, 0x00004002, 0x00004002, 0x00004002, 0x00004002}},
|
||||
Title::Mode::All},
|
||||
{"New_3DS mvd",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x20004102, 0x20004102, 0x20004102, 0x20004102, 0x20004102, 0x20004102}},
|
||||
Title::Mode::All},
|
||||
{"New_3DS qtm",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x20004202, 0x20004202, 0x20004202, 0x20004202, 0x20004202, 0x20004202}},
|
||||
Title::Mode::All},
|
||||
{"NS",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00008002, 0x00008002, 0x00008002, 0x00008002, 0x00008002, 0x00008002}},
|
||||
Title::Mode::All},
|
||||
{"Safe Mode NS",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x00008003, 0x00008003, 0x00008003, 0x00008003, 0x00008003, 0x00008003}},
|
||||
Title::Mode::All},
|
||||
{"New_3DS Safe Mode NS",
|
||||
SYSTEM_MODULE_UPPER_TITLE_ID,
|
||||
{{0x20008003, 0x20008003, 0x20008003, 0x20008003, 0x20008003, 0x20008003}},
|
||||
Title::Mode::All}}};
|
||||
|
||||
std::vector<u64> BuildFirmwareTitleList(const Title::Mode& mode, u32 region) {
|
||||
// Since Australia and Europe share the same title,
|
||||
// offset down by one for Australia and above.
|
||||
const u32 region_index = region >= 3 ? region - 1 : region;
|
||||
|
||||
const auto titles_with_mode = [mode, region_index](const Title& title) {
|
||||
return mode <= title.mode && title.lower_title_id[region_index] != 0;
|
||||
};
|
||||
|
||||
std::vector<Title> titles;
|
||||
const auto inserter = std::back_inserter(titles);
|
||||
std::copy_if(SYSTEM_FIRMWARE.begin(), SYSTEM_FIRMWARE.end(), inserter, titles_with_mode);
|
||||
std::copy_if(SYSTEM_APPLICATIONS.begin(), SYSTEM_APPLICATIONS.end(), inserter,
|
||||
titles_with_mode);
|
||||
std::copy_if(SYSTEM_DATA_ARCHIVES.begin(), SYSTEM_DATA_ARCHIVES.end(), inserter,
|
||||
titles_with_mode);
|
||||
std::copy_if(SYSTEM_APPLETS.begin(), SYSTEM_APPLETS.end(), inserter, titles_with_mode);
|
||||
std::copy_if(SHARED_DATA_ARCHIVES.begin(), SHARED_DATA_ARCHIVES.end(), inserter,
|
||||
titles_with_mode);
|
||||
std::copy_if(SYSTEM_DATA_ARCHIVES_2.begin(), SYSTEM_DATA_ARCHIVES_2.end(), inserter,
|
||||
titles_with_mode);
|
||||
std::copy_if(SYSTEM_MODULES.begin(), SYSTEM_MODULES.end(), inserter, titles_with_mode);
|
||||
|
||||
const auto get_title_id = [region_index](const Title& title) {
|
||||
return (static_cast<u64>(title.upper_title_id) << 32) +
|
||||
static_cast<u64>(title.lower_title_id[region_index]);
|
||||
};
|
||||
|
||||
std::vector<u64> title_ids;
|
||||
std::transform(titles.begin(), titles.end(), std::back_inserter(title_ids), get_title_id);
|
||||
return title_ids;
|
||||
}
|
Reference in New Issue