| |
| |
|
|
| #pragma once |
|
|
| #include <functional> |
| #include <iosfwd> |
| #include <memory> |
| #include <optional> |
| #include <string> |
| #include <utility> |
| #include <vector> |
|
|
| #include "common/common_funcs.h" |
| #include "common/common_types.h" |
| #include "core/file_sys/control_metadata.h" |
| #include "core/file_sys/vfs/vfs.h" |
|
|
| namespace Core { |
| class System; |
| } |
|
|
| namespace FileSys { |
| class NACP; |
| } |
|
|
| namespace Kernel { |
| struct AddressMapping; |
| class KProcess; |
| } |
|
|
| namespace Loader { |
|
|
| |
| enum class FileType { |
| Error, |
| Unknown, |
| NSO, |
| NRO, |
| NCA, |
| NSP, |
| XCI, |
| NAX, |
| KIP, |
| DeconstructedRomDirectory, |
| }; |
|
|
| |
| |
| |
| |
| |
| FileType IdentifyFile(FileSys::VirtualFile file); |
|
|
| |
| |
| |
| |
| |
| |
| FileType GuessFromFilename(const std::string& name); |
|
|
| |
| |
| |
| std::string GetFileTypeString(FileType type); |
|
|
| |
| enum class ResultStatus : u16 { |
| Success, |
| ErrorAlreadyLoaded, |
| ErrorNotImplemented, |
| ErrorNotInitialized, |
| ErrorBadNPDMHeader, |
| ErrorBadACIDHeader, |
| ErrorBadACIHeader, |
| ErrorBadFileAccessControl, |
| ErrorBadFileAccessHeader, |
| ErrorBadKernelCapabilityDescriptors, |
| ErrorBadPFSHeader, |
| ErrorIncorrectPFSFileSize, |
| ErrorBadNCAHeader, |
| ErrorMissingProductionKeyFile, |
| ErrorMissingHeaderKey, |
| ErrorIncorrectHeaderKey, |
| ErrorNCA2, |
| ErrorNCA0, |
| ErrorMissingTitlekey, |
| ErrorMissingTitlekek, |
| ErrorInvalidRightsID, |
| ErrorMissingKeyAreaKey, |
| ErrorIncorrectKeyAreaKey, |
| ErrorIncorrectTitlekeyOrTitlekek, |
| ErrorXCIMissingProgramNCA, |
| ErrorNCANotProgram, |
| ErrorNoExeFS, |
| ErrorBadXCIHeader, |
| ErrorXCIMissingPartition, |
| ErrorNullFile, |
| ErrorMissingNPDM, |
| Error32BitISA, |
| ErrorUnableToParseKernelMetadata, |
| ErrorNoRomFS, |
| ErrorIncorrectELFFileSize, |
| ErrorLoadingNRO, |
| ErrorLoadingNSO, |
| ErrorNoIcon, |
| ErrorNoControl, |
| ErrorBadNAXHeader, |
| ErrorIncorrectNAXFileSize, |
| ErrorNAXKeyHMACFailed, |
| ErrorNAXValidationHMACFailed, |
| ErrorNAXKeyDerivationFailed, |
| ErrorNAXInconvertibleToNCA, |
| ErrorBadNAXFilePath, |
| ErrorMissingSDSeed, |
| ErrorMissingSDKEKSource, |
| ErrorMissingAESKEKGenerationSource, |
| ErrorMissingAESKeyGenerationSource, |
| ErrorMissingSDSaveKeySource, |
| ErrorMissingSDNCAKeySource, |
| ErrorNSPMissingProgramNCA, |
| ErrorBadBKTRHeader, |
| ErrorBKTRSubsectionNotAfterRelocation, |
| ErrorBKTRSubsectionNotAtEnd, |
| ErrorBadRelocationBlock, |
| ErrorBadSubsectionBlock, |
| ErrorBadRelocationBuckets, |
| ErrorBadSubsectionBuckets, |
| ErrorMissingBKTRBaseRomFS, |
| ErrorNoPackedUpdate, |
| ErrorBadKIPHeader, |
| ErrorBLZDecompressionFailed, |
| ErrorBadINIHeader, |
| ErrorINITooManyKIPs, |
| ErrorIntegrityVerificationNotImplemented, |
| ErrorIntegrityVerificationFailed, |
| }; |
|
|
| std::string GetResultStatusString(ResultStatus status); |
| std::ostream& operator<<(std::ostream& os, ResultStatus status); |
|
|
| |
| class AppLoader { |
| public: |
| YUZU_NON_COPYABLE(AppLoader); |
| YUZU_NON_MOVEABLE(AppLoader); |
|
|
| struct LoadParameters { |
| s32 main_thread_priority; |
| u64 main_thread_stack_size; |
| }; |
| using LoadResult = std::pair<ResultStatus, std::optional<LoadParameters>>; |
|
|
| explicit AppLoader(FileSys::VirtualFile file_); |
| virtual ~AppLoader(); |
|
|
| |
| |
| |
| |
| |
| virtual FileType GetFileType() const = 0; |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| virtual LoadResult Load(Kernel::KProcess& process, Core::System& system) = 0; |
|
|
| |
| |
| |
| virtual ResultStatus VerifyIntegrity(std::function<bool(size_t, size_t)> progress_callback) { |
| return ResultStatus::ErrorIntegrityVerificationNotImplemented; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| virtual ResultStatus ReadCode(std::vector<u8>& buffer) { |
| return ResultStatus::ErrorNotImplemented; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| virtual ResultStatus ReadIcon(std::vector<u8>& buffer) { |
| return ResultStatus::ErrorNotImplemented; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| virtual ResultStatus ReadBanner(std::vector<u8>& buffer) { |
| return ResultStatus::ErrorNotImplemented; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| virtual ResultStatus ReadLogo(std::vector<u8>& buffer) { |
| return ResultStatus::ErrorNotImplemented; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| virtual ResultStatus ReadProgramId(u64& out_program_id) { |
| return ResultStatus::ErrorNotImplemented; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| virtual ResultStatus ReadProgramIds(std::vector<u64>& out_program_ids) { |
| return ResultStatus::ErrorNotImplemented; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| virtual ResultStatus ReadRomFS(FileSys::VirtualFile& out_file) { |
| return ResultStatus::ErrorNotImplemented; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| virtual ResultStatus ReadUpdateRaw(FileSys::VirtualFile& out_file) { |
| return ResultStatus::ErrorNotImplemented; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| virtual bool IsRomFSUpdatable() const { |
| return true; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| virtual ResultStatus ReadTitle(std::string& title) { |
| return ResultStatus::ErrorNotImplemented; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| virtual ResultStatus ReadControlData(FileSys::NACP& control) { |
| return ResultStatus::ErrorNotImplemented; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| virtual ResultStatus ReadManualRomFS(FileSys::VirtualFile& out_file) { |
| return ResultStatus::ErrorNotImplemented; |
| } |
|
|
| using Modules = std::map<VAddr, std::string>; |
|
|
| virtual ResultStatus ReadNSOModules(Modules& modules) { |
| return ResultStatus::ErrorNotImplemented; |
| } |
|
|
| protected: |
| FileSys::VirtualFile file; |
| bool is_loaded = false; |
| }; |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| std::unique_ptr<AppLoader> GetLoader(Core::System& system, FileSys::VirtualFile file, |
| u64 program_id = 0, std::size_t program_index = 0); |
|
|
| } |
|
|