| 
									
										
										
										
											2018-01-20 15:48:37 -05:00
										 |  |  | // Copyright 2018 yuzu emulator team
 | 
					
						
							| 
									
										
										
										
											2014-12-16 21:38:14 -08:00
										 |  |  | // Licensed under GPLv2 or any later version
 | 
					
						
							| 
									
										
										
										
											2014-04-08 19:15:46 -04:00
										 |  |  | // Refer to the license.txt file included.
 | 
					
						
							| 
									
										
										
										
											2013-09-19 23:21:22 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-08 19:15:46 -04:00
										 |  |  | #pragma once
 | 
					
						
							| 
									
										
										
										
											2013-09-19 23:21:22 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-15 05:38:37 -04:00
										 |  |  | #include <iosfwd>
 | 
					
						
							| 
									
										
										
										
											2015-06-21 13:40:28 +01:00
										 |  |  | #include <memory>
 | 
					
						
							| 
									
										
										
										
											2018-10-30 05:03:25 +01:00
										 |  |  | #include <optional>
 | 
					
						
							| 
									
										
										
										
											2015-06-21 14:58:59 +01:00
										 |  |  | #include <string>
 | 
					
						
							| 
									
										
										
										
											2017-03-08 20:21:31 -05:00
										 |  |  | #include <utility>
 | 
					
						
							| 
									
										
										
										
											2014-06-18 18:58:09 -04:00
										 |  |  | #include <vector>
 | 
					
						
							| 
									
										
										
										
											2018-10-30 05:03:25 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-02 12:59:36 -05:00
										 |  |  | #include "common/common_funcs.h"
 | 
					
						
							| 
									
										
										
										
											2015-05-06 04:06:12 -03:00
										 |  |  | #include "common/common_types.h"
 | 
					
						
							| 
									
										
										
										
											2018-11-28 14:01:56 -05:00
										 |  |  | #include "core/file_sys/control_metadata.h"
 | 
					
						
							| 
									
										
										
										
											2018-07-18 21:07:11 -04:00
										 |  |  | #include "core/file_sys/vfs.h"
 | 
					
						
							| 
									
										
										
										
											2013-09-19 23:21:22 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-16 08:19:25 -04:00
										 |  |  | namespace Core { | 
					
						
							|  |  |  | class System; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-06 20:27:50 -05:00
										 |  |  | namespace FileSys { | 
					
						
							|  |  |  | class NACP; | 
					
						
							|  |  |  | } // namespace FileSys
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-21 14:58:59 +01:00
										 |  |  | namespace Kernel { | 
					
						
							|  |  |  | struct AddressMapping; | 
					
						
							| 
									
										
										
										
											2021-04-23 22:04:28 -07:00
										 |  |  | class KProcess; | 
					
						
							| 
									
										
										
										
											2017-09-26 18:17:47 -05:00
										 |  |  | } // namespace Kernel
 | 
					
						
							| 
									
										
										
										
											2015-05-04 00:01:16 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-19 23:21:22 -04:00
										 |  |  | namespace Loader { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-18 18:58:09 -04:00
										 |  |  | /// File types supported by CTR
 | 
					
						
							|  |  |  | enum class FileType { | 
					
						
							|  |  |  |     Error, | 
					
						
							|  |  |  |     Unknown, | 
					
						
							|  |  |  |     ELF, | 
					
						
							| 
									
										
										
										
											2017-09-24 11:08:31 -04:00
										 |  |  |     NSO, | 
					
						
							| 
									
										
										
										
											2017-10-05 23:30:08 -04:00
										 |  |  |     NRO, | 
					
						
							| 
									
										
										
										
											2018-06-21 11:16:23 -04:00
										 |  |  |     NCA, | 
					
						
							| 
									
										
										
										
											2018-08-25 11:44:14 -04:00
										 |  |  |     NSP, | 
					
						
							| 
									
										
										
										
											2018-07-27 23:55:23 -04:00
										 |  |  |     XCI, | 
					
						
							| 
									
										
										
										
											2018-08-16 17:02:31 -04:00
										 |  |  |     NAX, | 
					
						
							| 
									
										
										
										
											2019-06-05 00:22:07 -04:00
										 |  |  |     KIP, | 
					
						
							| 
									
										
										
										
											2018-01-20 14:59:17 -05:00
										 |  |  |     DeconstructedRomDirectory, | 
					
						
							| 
									
										
										
										
											2014-06-18 18:58:09 -04:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-31 18:28:37 -07:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * Identifies the type of a bootable file based on the magic value in its header. | 
					
						
							|  |  |  |  * @param file open file | 
					
						
							|  |  |  |  * @return FileType of file | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2018-07-18 21:07:11 -04:00
										 |  |  | FileType IdentifyFile(FileSys::VirtualFile file); | 
					
						
							| 
									
										
										
										
											2015-08-31 18:28:37 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2018-07-18 21:07:11 -04:00
										 |  |  |  * Guess the type of a bootable file from its name | 
					
						
							|  |  |  |  * @param name String name of bootable file | 
					
						
							| 
									
										
										
										
											2015-08-31 18:28:37 -07:00
										 |  |  |  * @return FileType of file. Note: this will return FileType::Unknown if it is unable to determine | 
					
						
							|  |  |  |  * a filetype, and will never return FileType::Error. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2018-07-18 21:07:11 -04:00
										 |  |  | FileType GuessFromFilename(const std::string& name); | 
					
						
							| 
									
										
										
										
											2015-08-31 18:28:37 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * Convert a FileType into a string which can be displayed to the user. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2018-07-28 12:32:16 -04:00
										 |  |  | std::string GetFileTypeString(FileType type); | 
					
						
							| 
									
										
										
										
											2015-08-31 18:28:37 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-18 18:58:09 -04:00
										 |  |  | /// Return type for functions in Loader namespace
 | 
					
						
							| 
									
										
										
										
											2018-08-12 14:56:22 +10:00
										 |  |  | enum class ResultStatus : u16 { | 
					
						
							| 
									
										
										
										
											2014-06-18 18:58:09 -04:00
										 |  |  |     Success, | 
					
						
							|  |  |  |     ErrorAlreadyLoaded, | 
					
						
							| 
									
										
										
										
											2018-08-09 21:06:44 -04:00
										 |  |  |     ErrorNotImplemented, | 
					
						
							|  |  |  |     ErrorNotInitialized, | 
					
						
							|  |  |  |     ErrorBadNPDMHeader, | 
					
						
							|  |  |  |     ErrorBadACIDHeader, | 
					
						
							|  |  |  |     ErrorBadACIHeader, | 
					
						
							|  |  |  |     ErrorBadFileAccessControl, | 
					
						
							|  |  |  |     ErrorBadFileAccessHeader, | 
					
						
							| 
									
										
										
										
											2018-12-19 23:50:20 -05:00
										 |  |  |     ErrorBadKernelCapabilityDescriptors, | 
					
						
							| 
									
										
										
										
											2018-08-09 21:06:44 -04:00
										 |  |  |     ErrorBadPFSHeader, | 
					
						
							|  |  |  |     ErrorIncorrectPFSFileSize, | 
					
						
							|  |  |  |     ErrorBadNCAHeader, | 
					
						
							|  |  |  |     ErrorMissingProductionKeyFile, | 
					
						
							|  |  |  |     ErrorMissingHeaderKey, | 
					
						
							|  |  |  |     ErrorIncorrectHeaderKey, | 
					
						
							|  |  |  |     ErrorNCA2, | 
					
						
							|  |  |  |     ErrorNCA0, | 
					
						
							|  |  |  |     ErrorMissingTitlekey, | 
					
						
							|  |  |  |     ErrorMissingTitlekek, | 
					
						
							|  |  |  |     ErrorInvalidRightsID, | 
					
						
							|  |  |  |     ErrorMissingKeyAreaKey, | 
					
						
							|  |  |  |     ErrorIncorrectKeyAreaKey, | 
					
						
							|  |  |  |     ErrorIncorrectTitlekeyOrTitlekek, | 
					
						
							|  |  |  |     ErrorXCIMissingProgramNCA, | 
					
						
							|  |  |  |     ErrorNCANotProgram, | 
					
						
							|  |  |  |     ErrorNoExeFS, | 
					
						
							|  |  |  |     ErrorBadXCIHeader, | 
					
						
							|  |  |  |     ErrorXCIMissingPartition, | 
					
						
							|  |  |  |     ErrorNullFile, | 
					
						
							|  |  |  |     ErrorMissingNPDM, | 
					
						
							|  |  |  |     Error32BitISA, | 
					
						
							| 
									
										
										
										
											2018-12-19 23:50:20 -05:00
										 |  |  |     ErrorUnableToParseKernelMetadata, | 
					
						
							| 
									
										
										
										
											2018-08-09 21:06:44 -04:00
										 |  |  |     ErrorNoRomFS, | 
					
						
							|  |  |  |     ErrorIncorrectELFFileSize, | 
					
						
							|  |  |  |     ErrorLoadingNRO, | 
					
						
							| 
									
										
										
										
											2018-10-14 21:41:58 -04:00
										 |  |  |     ErrorLoadingNSO, | 
					
						
							| 
									
										
										
										
											2018-08-09 21:06:44 -04:00
										 |  |  |     ErrorNoIcon, | 
					
						
							|  |  |  |     ErrorNoControl, | 
					
						
							| 
									
										
										
										
											2018-08-16 17:02:50 -04:00
										 |  |  |     ErrorBadNAXHeader, | 
					
						
							|  |  |  |     ErrorIncorrectNAXFileSize, | 
					
						
							|  |  |  |     ErrorNAXKeyHMACFailed, | 
					
						
							|  |  |  |     ErrorNAXValidationHMACFailed, | 
					
						
							|  |  |  |     ErrorNAXKeyDerivationFailed, | 
					
						
							|  |  |  |     ErrorNAXInconvertibleToNCA, | 
					
						
							|  |  |  |     ErrorBadNAXFilePath, | 
					
						
							|  |  |  |     ErrorMissingSDSeed, | 
					
						
							|  |  |  |     ErrorMissingSDKEKSource, | 
					
						
							|  |  |  |     ErrorMissingAESKEKGenerationSource, | 
					
						
							|  |  |  |     ErrorMissingAESKeyGenerationSource, | 
					
						
							|  |  |  |     ErrorMissingSDSaveKeySource, | 
					
						
							|  |  |  |     ErrorMissingSDNCAKeySource, | 
					
						
							| 
									
										
										
										
											2018-08-25 11:44:14 -04:00
										 |  |  |     ErrorNSPMissingProgramNCA, | 
					
						
							| 
									
										
										
										
											2018-08-25 19:05:22 -04:00
										 |  |  |     ErrorBadBKTRHeader, | 
					
						
							|  |  |  |     ErrorBKTRSubsectionNotAfterRelocation, | 
					
						
							|  |  |  |     ErrorBKTRSubsectionNotAtEnd, | 
					
						
							|  |  |  |     ErrorBadRelocationBlock, | 
					
						
							|  |  |  |     ErrorBadSubsectionBlock, | 
					
						
							|  |  |  |     ErrorBadRelocationBuckets, | 
					
						
							|  |  |  |     ErrorBadSubsectionBuckets, | 
					
						
							|  |  |  |     ErrorMissingBKTRBaseRomFS, | 
					
						
							| 
									
										
										
										
											2018-09-25 09:18:55 -04:00
										 |  |  |     ErrorNoPackedUpdate, | 
					
						
							| 
									
										
										
										
											2019-06-05 00:21:44 -04:00
										 |  |  |     ErrorBadKIPHeader, | 
					
						
							|  |  |  |     ErrorBLZDecompressionFailed, | 
					
						
							|  |  |  |     ErrorBadINIHeader, | 
					
						
							|  |  |  |     ErrorINITooManyKIPs, | 
					
						
							| 
									
										
										
										
											2014-06-18 18:58:09 -04:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-03 13:18:02 -05:00
										 |  |  | std::string GetResultStatusString(ResultStatus status); | 
					
						
							| 
									
										
										
										
											2018-08-15 05:38:37 -04:00
										 |  |  | std::ostream& operator<<(std::ostream& os, ResultStatus status); | 
					
						
							| 
									
										
										
										
											2018-08-09 21:06:44 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-18 18:58:09 -04:00
										 |  |  | /// Interface for loading an application
 | 
					
						
							| 
									
										
										
										
											2022-02-02 12:59:36 -05:00
										 |  |  | class AppLoader { | 
					
						
							| 
									
										
										
										
											2014-06-18 18:58:09 -04:00
										 |  |  | public: | 
					
						
							| 
									
										
										
										
											2022-02-02 12:59:36 -05:00
										 |  |  |     YUZU_NON_COPYABLE(AppLoader); | 
					
						
							|  |  |  |     YUZU_NON_MOVEABLE(AppLoader); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-09 17:03:04 -04:00
										 |  |  |     struct LoadParameters { | 
					
						
							|  |  |  |         s32 main_thread_priority; | 
					
						
							|  |  |  |         u64 main_thread_stack_size; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |     using LoadResult = std::pair<ResultStatus, std::optional<LoadParameters>>; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-16 01:46:30 -04:00
										 |  |  |     explicit AppLoader(FileSys::VirtualFile file_); | 
					
						
							| 
									
										
										
										
											2018-09-02 10:53:06 -04:00
										 |  |  |     virtual ~AppLoader(); | 
					
						
							| 
									
										
										
										
											2014-06-18 18:58:09 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-17 23:30:44 +01:00
										 |  |  |     /**
 | 
					
						
							|  |  |  |      * Returns the type of this file | 
					
						
							| 
									
										
										
										
											2021-04-27 12:05:34 -04:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2016-05-17 23:30:44 +01:00
										 |  |  |      * @return FileType corresponding to the loaded file | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2018-12-05 17:42:41 -05:00
										 |  |  |     virtual FileType GetFileType() const = 0; | 
					
						
							| 
									
										
										
										
											2016-05-17 23:30:44 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-18 18:58:09 -04:00
										 |  |  |     /**
 | 
					
						
							| 
									
										
										
										
											2017-09-26 18:17:47 -05:00
										 |  |  |      * Load the application and return the created Process instance | 
					
						
							| 
									
										
										
										
											2021-04-27 12:05:34 -04:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2017-09-26 18:17:47 -05:00
										 |  |  |      * @param process The newly created process. | 
					
						
							| 
									
										
										
										
											2020-09-16 08:19:25 -04:00
										 |  |  |      * @param system  The system that this process is being loaded under. | 
					
						
							| 
									
										
										
										
											2021-04-27 12:05:34 -04:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2017-09-26 18:17:47 -05:00
										 |  |  |      * @return The status result of the operation. | 
					
						
							| 
									
										
										
										
											2014-06-18 18:58:09 -04:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2021-04-23 22:04:28 -07:00
										 |  |  |     virtual LoadResult Load(Kernel::KProcess& process, Core::System& system) = 0; | 
					
						
							| 
									
										
										
										
											2014-06-18 18:58:09 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |      * Get the code (typically .code section) of the application | 
					
						
							| 
									
										
										
										
											2021-04-27 12:05:34 -04:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @param[out] buffer Reference to buffer to store data | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2014-06-27 15:33:23 -04:00
										 |  |  |      * @return ResultStatus result of function | 
					
						
							| 
									
										
										
										
											2014-06-18 18:58:09 -04:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2015-07-11 19:16:33 -03:00
										 |  |  |     virtual ResultStatus ReadCode(std::vector<u8>& buffer) { | 
					
						
							| 
									
										
										
										
											2014-06-27 15:33:23 -04:00
										 |  |  |         return ResultStatus::ErrorNotImplemented; | 
					
						
							| 
									
										
										
										
											2014-06-18 18:58:09 -04:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							| 
									
										
										
										
											2014-06-22 15:40:21 -04:00
										 |  |  |      * Get the icon (typically icon section) of the application | 
					
						
							| 
									
										
										
										
											2021-04-27 12:05:34 -04:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @param[out] buffer Reference to buffer to store data | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2014-06-27 15:33:23 -04:00
										 |  |  |      * @return ResultStatus result of function | 
					
						
							| 
									
										
										
										
											2014-06-18 18:58:09 -04:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2015-07-11 19:16:33 -03:00
										 |  |  |     virtual ResultStatus ReadIcon(std::vector<u8>& buffer) { | 
					
						
							| 
									
										
										
										
											2014-06-27 15:33:23 -04:00
										 |  |  |         return ResultStatus::ErrorNotImplemented; | 
					
						
							| 
									
										
										
										
											2014-06-18 18:58:09 -04:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							| 
									
										
										
										
											2014-06-22 15:40:21 -04:00
										 |  |  |      * Get the banner (typically banner section) of the application | 
					
						
							| 
									
										
										
										
											2019-01-15 15:56:52 -05:00
										 |  |  |      * In the context of NX, this is the animation that displays in the bottom right of the screen | 
					
						
							|  |  |  |      * when a game boots. Stored in GIF format. | 
					
						
							| 
									
										
										
										
											2021-04-27 12:05:34 -04:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @param[out] buffer Reference to buffer to store data | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2014-06-27 15:33:23 -04:00
										 |  |  |      * @return ResultStatus result of function | 
					
						
							| 
									
										
										
										
											2014-06-18 18:58:09 -04:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2015-07-11 19:16:33 -03:00
										 |  |  |     virtual ResultStatus ReadBanner(std::vector<u8>& buffer) { | 
					
						
							| 
									
										
										
										
											2014-06-27 15:33:23 -04:00
										 |  |  |         return ResultStatus::ErrorNotImplemented; | 
					
						
							| 
									
										
										
										
											2014-06-18 18:58:09 -04:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							| 
									
										
										
										
											2014-06-22 15:40:21 -04:00
										 |  |  |      * Get the logo (typically logo section) of the application | 
					
						
							| 
									
										
										
										
											2019-01-15 15:56:52 -05:00
										 |  |  |      * In the context of NX, this is the static image that displays in the top left of the screen | 
					
						
							|  |  |  |      * when a game boots. Stored in JPEG format. | 
					
						
							| 
									
										
										
										
											2021-04-27 12:05:34 -04:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @param[out] buffer Reference to buffer to store data | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2014-06-27 15:33:23 -04:00
										 |  |  |      * @return ResultStatus result of function | 
					
						
							| 
									
										
										
										
											2014-06-18 18:58:09 -04:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2015-07-11 19:16:33 -03:00
										 |  |  |     virtual ResultStatus ReadLogo(std::vector<u8>& buffer) { | 
					
						
							| 
									
										
										
										
											2014-06-27 15:33:23 -04:00
										 |  |  |         return ResultStatus::ErrorNotImplemented; | 
					
						
							| 
									
										
										
										
											2014-06-18 18:58:09 -04:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2013-09-19 23:21:22 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-15 09:54:25 +00:00
										 |  |  |     /**
 | 
					
						
							|  |  |  |      * Get the program id of the application | 
					
						
							| 
									
										
										
										
											2021-04-27 12:05:34 -04:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @param[out] out_program_id Reference to store program id into | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2016-12-15 09:54:25 +00:00
										 |  |  |      * @return ResultStatus result of function | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     virtual ResultStatus ReadProgramId(u64& out_program_id) { | 
					
						
							|  |  |  |         return ResultStatus::ErrorNotImplemented; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-20 13:10:05 +08:00
										 |  |  |     /**
 | 
					
						
							|  |  |  |      * Get the program ids of the application | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param[out] out_program_ids Reference to store program ids into | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return ResultStatus result of function | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     virtual ResultStatus ReadProgramIds(std::vector<u64>& out_program_ids) { | 
					
						
							|  |  |  |         return ResultStatus::ErrorNotImplemented; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-18 18:58:09 -04:00
										 |  |  |     /**
 | 
					
						
							| 
									
										
										
										
											2014-06-27 15:33:23 -04:00
										 |  |  |      * Get the RomFS of the application | 
					
						
							| 
									
										
										
										
											2015-07-10 00:55:23 +03:00
										 |  |  |      * Since the RomFS can be huge, we return a file reference instead of copying to a buffer | 
					
						
							| 
									
										
										
										
											2021-04-27 12:05:34 -04:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @param[out] out_file The directory containing the RomFS | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2014-06-27 15:33:23 -04:00
										 |  |  |      * @return ResultStatus result of function | 
					
						
							| 
									
										
										
										
											2014-06-18 18:58:09 -04:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2021-04-27 12:05:34 -04:00
										 |  |  |     virtual ResultStatus ReadRomFS(FileSys::VirtualFile& out_file) { | 
					
						
							| 
									
										
										
										
											2018-09-25 09:18:55 -04:00
										 |  |  |         return ResultStatus::ErrorNotImplemented; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /**
 | 
					
						
							|  |  |  |      * Get the raw update of the application, should it come packed with one | 
					
						
							| 
									
										
										
										
											2021-04-27 12:05:34 -04:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @param[out] out_file The raw update NCA file (Program-type) | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2018-09-25 09:18:55 -04:00
										 |  |  |      * @return ResultStatus result of function | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2021-04-27 12:05:34 -04:00
										 |  |  |     virtual ResultStatus ReadUpdateRaw(FileSys::VirtualFile& out_file) { | 
					
						
							| 
									
										
										
										
											2014-06-27 15:33:23 -04:00
										 |  |  |         return ResultStatus::ErrorNotImplemented; | 
					
						
							| 
									
										
										
										
											2014-06-18 18:58:09 -04:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-01-06 21:30:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-25 00:17:38 -06:00
										 |  |  |     /**
 | 
					
						
							| 
									
										
										
										
											2018-08-25 19:05:22 -04:00
										 |  |  |      * Get whether or not updates can be applied to the RomFS. | 
					
						
							|  |  |  |      * By default, this is true, however for formats where it cannot be guaranteed that the RomFS is | 
					
						
							|  |  |  |      * the base game it should be set to false. | 
					
						
							| 
									
										
										
										
											2021-04-27 12:05:34 -04:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @return bool indicating whether or not the RomFS is updatable. | 
					
						
							| 
									
										
										
										
											2017-09-25 00:17:38 -06:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2018-08-26 10:53:31 -04:00
										 |  |  |     virtual bool IsRomFSUpdatable() const { | 
					
						
							| 
									
										
										
										
											2018-08-25 19:05:22 -04:00
										 |  |  |         return true; | 
					
						
							| 
									
										
										
										
											2017-09-25 00:17:38 -06:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-28 22:37:42 -04:00
										 |  |  |     /**
 | 
					
						
							|  |  |  |      * Gets the difference between the start of the IVFC header and the start of level 6 (RomFS) | 
					
						
							| 
									
										
										
										
											2021-04-27 12:05:34 -04:00
										 |  |  |      * data. Needed for BKTR patching. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return IVFC offset for RomFS. | 
					
						
							| 
									
										
										
										
											2018-08-28 22:37:42 -04:00
										 |  |  |      */ | 
					
						
							|  |  |  |     virtual u64 ReadRomFSIVFCOffset() const { | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-01 19:51:44 -04:00
										 |  |  |     /**
 | 
					
						
							|  |  |  |      * Get the title of the application | 
					
						
							| 
									
										
										
										
											2021-04-27 12:05:34 -04:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @param[out] title Reference to store the application title into | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2017-08-01 19:51:44 -04:00
										 |  |  |      * @return ResultStatus result of function | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     virtual ResultStatus ReadTitle(std::string& title) { | 
					
						
							|  |  |  |         return ResultStatus::ErrorNotImplemented; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-28 14:01:56 -05:00
										 |  |  |     /**
 | 
					
						
							| 
									
										
										
										
											2018-12-06 20:27:50 -05:00
										 |  |  |      * Get the control data (CNMT) of the application | 
					
						
							| 
									
										
										
										
											2021-04-27 12:05:34 -04:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @param[out] control Reference to store the application control data into | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2018-11-28 14:01:56 -05:00
										 |  |  |      * @return ResultStatus result of function | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2018-12-06 20:27:50 -05:00
										 |  |  |     virtual ResultStatus ReadControlData(FileSys::NACP& control) { | 
					
						
							| 
									
										
										
										
											2018-11-28 14:01:56 -05:00
										 |  |  |         return ResultStatus::ErrorNotImplemented; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-24 16:19:41 -05:00
										 |  |  |     /**
 | 
					
						
							|  |  |  |      * Get the RomFS of the manual of the application | 
					
						
							| 
									
										
										
										
											2021-04-27 12:05:34 -04:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @param[out] out_file The raw manual RomFS of the game | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2018-12-24 16:19:41 -05:00
										 |  |  |      * @return ResultStatus result of function | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2021-04-27 12:05:34 -04:00
										 |  |  |     virtual ResultStatus ReadManualRomFS(FileSys::VirtualFile& out_file) { | 
					
						
							| 
									
										
										
										
											2018-12-24 16:19:41 -05:00
										 |  |  |         return ResultStatus::ErrorNotImplemented; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-26 11:40:41 -04:00
										 |  |  |     using Modules = std::map<VAddr, std::string>; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     virtual ResultStatus ReadNSOModules(Modules& modules) { | 
					
						
							|  |  |  |         return ResultStatus::ErrorNotImplemented; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-06 21:30:40 +00:00
										 |  |  | protected: | 
					
						
							| 
									
										
										
										
											2018-07-18 21:07:11 -04:00
										 |  |  |     FileSys::VirtualFile file; | 
					
						
							| 
									
										
										
										
											2015-07-11 19:16:33 -03:00
										 |  |  |     bool is_loaded = false; | 
					
						
							| 
									
										
										
										
											2013-09-19 23:21:22 -04:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2016-05-17 23:06:33 +01:00
										 |  |  |  * Identifies a bootable file and return a suitable loader | 
					
						
							| 
									
										
										
										
											2020-11-18 07:53:10 -05:00
										 |  |  |  * | 
					
						
							|  |  |  |  * @param system The system context. | 
					
						
							|  |  |  |  * @param file   The bootable file. | 
					
						
							| 
									
										
										
										
											2020-11-24 15:16:24 -08:00
										 |  |  |  * @param program_index Specifies the index within the container of the program to launch. | 
					
						
							| 
									
										
										
										
											2020-11-18 07:53:10 -05:00
										 |  |  |  * | 
					
						
							|  |  |  |  * @return the best loader for this file. | 
					
						
							| 
									
										
										
										
											2013-09-19 23:21:22 -04:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2020-11-24 15:16:24 -08:00
										 |  |  | std::unique_ptr<AppLoader> GetLoader(Core::System& system, FileSys::VirtualFile file, | 
					
						
							| 
									
										
										
										
											2021-07-20 13:10:05 +08:00
										 |  |  |                                      u64 program_id = 0, std::size_t program_index = 0); | 
					
						
							| 
									
										
										
										
											2013-09-19 23:21:22 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-26 18:17:47 -05:00
										 |  |  | } // namespace Loader
 |