| | |
| | |
| |
|
| | #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); |
| |
|
| | } |
| |
|