mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 13:50:03 +00:00 
			
		
		
		
	Rework system title handling with up-to-date title list and region detection support. (#6356)
This commit is contained in:
		
							parent
							
								
									b5d6f645bd
								
							
						
					
					
						commit
						5346ca27b5
					
				
					 12 changed files with 1292 additions and 806 deletions
				
			
		|  | @ -15,10 +15,8 @@ | ||||||
| #include "core/hle/service/cfg/cfg.h" | #include "core/hle/service/cfg/cfg.h" | ||||||
| #include "core/hle/service/ptm/ptm.h" | #include "core/hle/service/ptm/ptm.h" | ||||||
| #include "core/hw/aes/key.h" | #include "core/hw/aes/key.h" | ||||||
|  | #include "core/system_titles.h" | ||||||
| #include "ui_configure_system.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 = {{ | static const std::array<int, 12> days_in_month = {{ | ||||||
|     31, |     31, | ||||||
|  | @ -246,7 +244,9 @@ ConfigureSystem::ConfigureSystem(QWidget* parent) | ||||||
| 
 | 
 | ||||||
|     SetupPerGameUI(); |     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; |     bool keys_available = true; | ||||||
|     HW::AES::InitKeys(true); |     HW::AES::InitKeys(true); | ||||||
|     for (u8 i = 0; i < HW::AES::MaxCommonKeySlot; i++) { |     for (u8 i = 0; i < HW::AES::MaxCommonKeySlot; i++) { | ||||||
|  | @ -258,11 +258,13 @@ ConfigureSystem::ConfigureSystem(QWidget* parent) | ||||||
|     } |     } | ||||||
|     if (keys_available) { |     if (keys_available) { | ||||||
|         ui->button_start_download->setEnabled(true); |         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")); |         ui->label_nus_download->setText(tr("Download System Files from Nintendo servers")); | ||||||
|     } else { |     } else { | ||||||
|         ui->button_start_download->setEnabled(false); |         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->setTextInteractionFlags(Qt::TextBrowserInteraction); | ||||||
|         ui->label_nus_download->setOpenExternalLinks(true); |         ui->label_nus_download->setOpenExternalLinks(true); | ||||||
|         ui->label_nus_download->setText( |         ui->label_nus_download->setText( | ||||||
|  | @ -343,6 +345,9 @@ void ConfigureSystem::ReadSystemSettings() { | ||||||
|     // set play coin
 |     // set play coin
 | ||||||
|     play_coin = Service::PTM::Module::GetPlayCoins(); |     play_coin = Service::PTM::Module::GetPlayCoins(); | ||||||
|     ui->spinBox_play_coins->setValue(play_coin); |     ui->spinBox_play_coins->setValue(play_coin); | ||||||
|  | 
 | ||||||
|  |     // set firmware download region
 | ||||||
|  |     ui->combo_download_region->setCurrentIndex(static_cast<int>(cfg->GetRegionValue())); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void ConfigureSystem::ApplyConfiguration() { | void ConfigureSystem::ApplyConfiguration() { | ||||||
|  | @ -535,8 +540,10 @@ void ConfigureSystem::DownloadFromNUS() { | ||||||
| #ifdef ENABLE_WEB_SERVICE | #ifdef ENABLE_WEB_SERVICE | ||||||
|     ui->button_start_download->setEnabled(false); |     ui->button_start_download->setEnabled(false); | ||||||
| 
 | 
 | ||||||
|     const auto mode = static_cast<Title::Mode>(ui->combo_download_mode->currentIndex()); |     const auto mode = | ||||||
|     const std::vector<u64> titles = BuildFirmwareTitleList(mode, cfg->GetRegionValue()); |         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, |     QProgressDialog progress(tr("Downloading files..."), tr("Cancel"), 0, | ||||||
|                              static_cast<int>(titles.size()), this); |                              static_cast<int>(titles.size()), this); | ||||||
|  |  | ||||||
|  | @ -371,22 +371,61 @@ | ||||||
|         <item row="15" column="1"> |         <item row="15" column="1"> | ||||||
|          <layout class="QHBoxLayout" name="horizontalLayout_nus_download"> |          <layout class="QHBoxLayout" name="horizontalLayout_nus_download"> | ||||||
|           <item> |           <item> | ||||||
|            <widget class="QComboBox" name="combo_download_mode"> |            <widget class="QComboBox" name="combo_download_set"> | ||||||
|             <item> |  | ||||||
|              <property name="text"> |  | ||||||
|               <string>All</string> |  | ||||||
|              </property> |  | ||||||
|             </item> |  | ||||||
|             <item> |  | ||||||
|              <property name="text"> |  | ||||||
|               <string>Recommended</string> |  | ||||||
|              </property> |  | ||||||
|             </item> |  | ||||||
|             <item> |             <item> | ||||||
|              <property name="text"> |              <property name="text"> | ||||||
|               <string>Minimal</string> |               <string>Minimal</string> | ||||||
|              </property> |              </property> | ||||||
|             </item> |             </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> |            </widget> | ||||||
|           </item> |           </item> | ||||||
|           <item> |           <item> | ||||||
|  |  | ||||||
|  | @ -94,6 +94,7 @@ | ||||||
| #include "core/loader/loader.h" | #include "core/loader/loader.h" | ||||||
| #include "core/movie.h" | #include "core/movie.h" | ||||||
| #include "core/savestate.h" | #include "core/savestate.h" | ||||||
|  | #include "core/system_titles.h" | ||||||
| #include "game_list_p.h" | #include "game_list_p.h" | ||||||
| #include "input_common/main.h" | #include "input_common/main.h" | ||||||
| #include "network/network_settings.h" | #include "network/network_settings.h" | ||||||
|  | @ -747,7 +748,10 @@ void GMainWindow::ConnectMenuEvents() { | ||||||
|     // File
 |     // File
 | ||||||
|     connect_menu(ui->action_Load_File, &GMainWindow::OnMenuLoadFile); |     connect_menu(ui->action_Load_File, &GMainWindow::OnMenuLoadFile); | ||||||
|     connect_menu(ui->action_Install_CIA, &GMainWindow::OnMenuInstallCIA); |     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_Exit, &QMainWindow::close); | ||||||
|     connect_menu(ui->action_Load_Amiibo, &GMainWindow::OnLoadAmiibo); |     connect_menu(ui->action_Load_Amiibo, &GMainWindow::OnLoadAmiibo); | ||||||
|     connect_menu(ui->action_Remove_Amiibo, &GMainWindow::OnRemoveAmiibo); |     connect_menu(ui->action_Remove_Amiibo, &GMainWindow::OnRemoveAmiibo); | ||||||
|  | @ -1633,18 +1637,8 @@ void GMainWindow::OnMenuInstallCIA() { | ||||||
|     InstallCIA(filepaths); |     InstallCIA(filepaths); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static std::string GetHomeMenuPath() { | void GMainWindow::OnMenuBootHomeMenu(u32 region) { | ||||||
|     static const std::array<u64, 7> home_menu_tids = { |     BootGame(QString::fromStdString(Core::GetHomeMenuNcchPath(region))); | ||||||
|         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::InstallCIA(QStringList filepaths) { | void GMainWindow::InstallCIA(QStringList filepaths) { | ||||||
|  | @ -2292,9 +2286,13 @@ void GMainWindow::UpdateStatusBar() { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void GMainWindow::UpdateBootHomeMenuState() { | void GMainWindow::UpdateBootHomeMenuState() { | ||||||
|     const std::string home_menu_path = GetHomeMenuPath(); |     const auto current_region = Settings::values.region_value.GetValue(); | ||||||
|     ui->action_Boot_Home_Menu->setEnabled(!home_menu_path.empty() && |     for (u32 region = 0; region < Core::NUM_SYSTEM_TITLE_REGIONS; region++) { | ||||||
|                                           FileUtil::Exists(GetHomeMenuPath())); |         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() { | void GMainWindow::HideMouseCursor() { | ||||||
|  |  | ||||||
|  | @ -196,7 +196,7 @@ private slots: | ||||||
|     void OnConfigurePerGame(); |     void OnConfigurePerGame(); | ||||||
|     void OnMenuLoadFile(); |     void OnMenuLoadFile(); | ||||||
|     void OnMenuInstallCIA(); |     void OnMenuInstallCIA(); | ||||||
|     void OnMenuBootHomeMenu(); |     void OnMenuBootHomeMenu(u32 region); | ||||||
|     void OnUpdateProgress(std::size_t written, std::size_t total); |     void OnUpdateProgress(std::size_t written, std::size_t total); | ||||||
|     void OnCIAInstallReport(Service::AM::InstallStatus status, QString filepath); |     void OnCIAInstallReport(Service::AM::InstallStatus status, QString filepath); | ||||||
|     void OnCIAInstallFinished(); |     void OnCIAInstallFinished(); | ||||||
|  |  | ||||||
|  | @ -52,6 +52,18 @@ | ||||||
|     <property name="title"> |     <property name="title"> | ||||||
|      <string>&File</string> |      <string>&File</string> | ||||||
|     </property> |     </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"> |     <widget class="QMenu" name="menu_recent_files"> | ||||||
|      <property name="title"> |      <property name="title"> | ||||||
|       <string>Recent Files</string> |       <string>Recent Files</string> | ||||||
|  | @ -66,7 +78,7 @@ | ||||||
|     </widget> |     </widget> | ||||||
|     <addaction name="action_Load_File"/> |     <addaction name="action_Load_File"/> | ||||||
|     <addaction name="action_Install_CIA"/> |     <addaction name="action_Install_CIA"/> | ||||||
|     <addaction name="action_Boot_Home_Menu"/> |     <addaction name="menu_Boot_Home_Menu"/> | ||||||
|     <addaction name="separator"/> |     <addaction name="separator"/> | ||||||
|     <addaction name="menu_recent_files"/> |     <addaction name="menu_recent_files"/> | ||||||
|     <addaction name="separator"/> |     <addaction name="separator"/> | ||||||
|  | @ -210,9 +222,39 @@ | ||||||
|     <string>Install CIA...</string> |     <string>Install CIA...</string> | ||||||
|    </property> |    </property> | ||||||
|   </action> |   </action> | ||||||
|   <action name="action_Boot_Home_Menu"> |   <action name="action_Boot_Home_Menu_JPN"> | ||||||
|    <property name="text"> |    <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> |    </property> | ||||||
|   </action> |   </action> | ||||||
|   <action name="action_Exit"> |   <action name="action_Exit"> | ||||||
|  |  | ||||||
|  | @ -458,6 +458,8 @@ add_library(core STATIC | ||||||
|     rpc/udp_server.h |     rpc/udp_server.h | ||||||
|     savestate.cpp |     savestate.cpp | ||||||
|     savestate.h |     savestate.h | ||||||
|  |     system_titles.cpp | ||||||
|  |     system_titles.h | ||||||
|     telemetry_session.cpp |     telemetry_session.cpp | ||||||
|     telemetry_session.h |     telemetry_session.h | ||||||
|     tracer/citrace.h |     tracer/citrace.h | ||||||
|  |  | ||||||
|  | @ -25,6 +25,7 @@ | ||||||
| #include "core/loader/ncch.h" | #include "core/loader/ncch.h" | ||||||
| #include "core/loader/smdh.h" | #include "core/loader/smdh.h" | ||||||
| #include "core/memory.h" | #include "core/memory.h" | ||||||
|  | #include "core/system_titles.h" | ||||||
| #include "network/network.h" | #include "network/network.h" | ||||||
| 
 | 
 | ||||||
| ////////////////////////////////////////////////////////////////////////////////////////////////////
 | ////////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||||
|  | @ -162,7 +163,10 @@ ResultStatus AppLoader_NCCH::LoadExec(std::shared_ptr<Kernel::Process>& process) | ||||||
|     return ResultStatus::Error; |     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; |     std::vector<u8> smdh_buffer; | ||||||
|     if (ReadIcon(smdh_buffer) == ResultStatus::Success && smdh_buffer.size() >= sizeof(SMDH)) { |     if (ReadIcon(smdh_buffer) == ResultStatus::Success && smdh_buffer.size() >= sizeof(SMDH)) { | ||||||
|         SMDH smdh; |         SMDH smdh; | ||||||
|  | @ -176,9 +180,12 @@ void AppLoader_NCCH::ParseRegionLockoutInfo() { | ||||||
|             } |             } | ||||||
|             region_lockout >>= 1; |             region_lockout >>= 1; | ||||||
|         } |         } | ||||||
|         auto cfg = Service::CFG::GetModule(Core::System::GetInstance()); |  | ||||||
|         ASSERT_MSG(cfg, "CFG Module missing!"); |  | ||||||
|         cfg->SetPreferredRegionCodes(regions); |         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); |     system.ArchiveManager().RegisterSelfNCCH(*this); | ||||||
| 
 | 
 | ||||||
|     ParseRegionLockoutInfo(); |     ParseRegionLockoutInfo(ncch_program_id); | ||||||
| 
 | 
 | ||||||
|     return ResultStatus::Success; |     return ResultStatus::Success; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -76,7 +76,9 @@ private: | ||||||
|     ResultStatus LoadExec(std::shared_ptr<Kernel::Process>& process); |     ResultStatus LoadExec(std::shared_ptr<Kernel::Process>& process); | ||||||
| 
 | 
 | ||||||
|     /// Reads the region lockout info in the SMDH and send it to CFG service
 |     /// 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.
 |     /// Detects whether the NCCH contains GBA Virtual Console.
 | ||||||
|     bool IsGbaVirtualConsole(const std::vector<u8>& code); |     bool IsGbaVirtualConsole(const std::vector<u8>& code); | ||||||
|  |  | ||||||
							
								
								
									
										1123
									
								
								src/core/system_titles.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1123
									
								
								src/core/system_titles.cpp
									
										
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										28
									
								
								src/core/system_titles.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								src/core/system_titles.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -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 |     announce_room_json.h | ||||||
|     nus_download.cpp |     nus_download.cpp | ||||||
|     nus_download.h |     nus_download.h | ||||||
|     nus_titles.h |  | ||||||
|     precompiled_headers.h |     precompiled_headers.h | ||||||
|     telemetry_json.cpp |     telemetry_json.cpp | ||||||
|     telemetry_json.h |     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; |  | ||||||
| } |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue