Merge pull request #2025 from DarkLordZach/loader-banner-logo
loader: Add getters for application banner and logo
This commit is contained in:
		
						commit
						f9e69faf4a
					
				@ -359,6 +359,8 @@ bool NCA::ReadPFS0Section(const NCASectionHeader& section, const NCASectionTable
 | 
			
		||||
            dirs.push_back(std::move(npfs));
 | 
			
		||||
            if (IsDirectoryExeFS(dirs.back()))
 | 
			
		||||
                exefs = dirs.back();
 | 
			
		||||
            else if (IsDirectoryLogoPartition(dirs.back()))
 | 
			
		||||
                logo = dirs.back();
 | 
			
		||||
        } else {
 | 
			
		||||
            if (has_rights_id)
 | 
			
		||||
                status = Loader::ResultStatus::ErrorIncorrectTitlekeyOrTitlekek;
 | 
			
		||||
@ -546,4 +548,8 @@ u64 NCA::GetBaseIVFCOffset() const {
 | 
			
		||||
    return ivfc_offset;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
VirtualDir NCA::GetLogoPartition() const {
 | 
			
		||||
    return logo;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace FileSys
 | 
			
		||||
 | 
			
		||||
@ -74,6 +74,13 @@ inline bool IsDirectoryExeFS(const std::shared_ptr<VfsDirectory>& pfs) {
 | 
			
		||||
    return pfs->GetFile("main") != nullptr && pfs->GetFile("main.npdm") != nullptr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline bool IsDirectoryLogoPartition(const VirtualDir& pfs) {
 | 
			
		||||
    // NintendoLogo is the static image in the top left corner while StartupMovie is the animation
 | 
			
		||||
    // in the bottom right corner.
 | 
			
		||||
    return pfs->GetFile("NintendoLogo.png") != nullptr &&
 | 
			
		||||
           pfs->GetFile("StartupMovie.gif") != nullptr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// An implementation of VfsDirectory that represents a Nintendo Content Archive (NCA) conatiner.
 | 
			
		||||
// After construction, use GetStatus to determine if the file is valid and ready to be used.
 | 
			
		||||
class NCA : public ReadOnlyVfsDirectory {
 | 
			
		||||
@ -102,6 +109,8 @@ public:
 | 
			
		||||
    // Returns the base ivfc offset used in BKTR patching.
 | 
			
		||||
    u64 GetBaseIVFCOffset() const;
 | 
			
		||||
 | 
			
		||||
    VirtualDir GetLogoPartition() const;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    bool CheckSupportedNCA(const NCAHeader& header);
 | 
			
		||||
    bool HandlePotentialHeaderDecryption();
 | 
			
		||||
@ -122,6 +131,7 @@ private:
 | 
			
		||||
 | 
			
		||||
    VirtualFile romfs = nullptr;
 | 
			
		||||
    VirtualDir exefs = nullptr;
 | 
			
		||||
    VirtualDir logo = nullptr;
 | 
			
		||||
    VirtualFile file;
 | 
			
		||||
    VirtualFile bktr_base_romfs;
 | 
			
		||||
    u64 ivfc_offset = 0;
 | 
			
		||||
 | 
			
		||||
@ -178,6 +178,8 @@ public:
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the banner (typically banner section) of the application
 | 
			
		||||
     * 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.
 | 
			
		||||
     * @param buffer Reference to buffer to store data
 | 
			
		||||
     * @return ResultStatus result of function
 | 
			
		||||
     */
 | 
			
		||||
@ -187,6 +189,8 @@ public:
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the logo (typically logo section) of the application
 | 
			
		||||
     * 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.
 | 
			
		||||
     * @param buffer Reference to buffer to store data
 | 
			
		||||
     * @return ResultStatus result of function
 | 
			
		||||
     */
 | 
			
		||||
 | 
			
		||||
@ -79,4 +79,13 @@ u64 AppLoader_NAX::ReadRomFSIVFCOffset() const {
 | 
			
		||||
ResultStatus AppLoader_NAX::ReadProgramId(u64& out_program_id) {
 | 
			
		||||
    return nca_loader->ReadProgramId(out_program_id);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ResultStatus AppLoader_NAX::ReadBanner(std::vector<u8>& buffer) {
 | 
			
		||||
    return nca_loader->ReadBanner(buffer);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ResultStatus AppLoader_NAX::ReadLogo(std::vector<u8>& buffer) {
 | 
			
		||||
    return nca_loader->ReadLogo(buffer);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace Loader
 | 
			
		||||
 | 
			
		||||
@ -39,6 +39,9 @@ public:
 | 
			
		||||
    u64 ReadRomFSIVFCOffset() const override;
 | 
			
		||||
    ResultStatus ReadProgramId(u64& out_program_id) override;
 | 
			
		||||
 | 
			
		||||
    ResultStatus ReadBanner(std::vector<u8>& buffer) override;
 | 
			
		||||
    ResultStatus ReadLogo(std::vector<u8>& buffer) override;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    std::unique_ptr<FileSys::NAX> nax;
 | 
			
		||||
    std::unique_ptr<AppLoader_NCA> nca_loader;
 | 
			
		||||
 | 
			
		||||
@ -84,4 +84,23 @@ ResultStatus AppLoader_NCA::ReadProgramId(u64& out_program_id) {
 | 
			
		||||
    return ResultStatus::Success;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ResultStatus AppLoader_NCA::ReadBanner(std::vector<u8>& buffer) {
 | 
			
		||||
    if (nca == nullptr || nca->GetStatus() != ResultStatus::Success)
 | 
			
		||||
        return ResultStatus::ErrorNotInitialized;
 | 
			
		||||
    const auto logo = nca->GetLogoPartition();
 | 
			
		||||
    if (logo == nullptr)
 | 
			
		||||
        return ResultStatus::ErrorNoIcon;
 | 
			
		||||
    buffer = logo->GetFile("StartupMovie.gif")->ReadAllBytes();
 | 
			
		||||
    return ResultStatus::Success;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ResultStatus AppLoader_NCA::ReadLogo(std::vector<u8>& buffer) {
 | 
			
		||||
    if (nca == nullptr || nca->GetStatus() != ResultStatus::Success)
 | 
			
		||||
        return ResultStatus::ErrorNotInitialized;
 | 
			
		||||
    const auto logo = nca->GetLogoPartition();
 | 
			
		||||
    if (logo == nullptr)
 | 
			
		||||
        return ResultStatus::ErrorNoIcon;
 | 
			
		||||
    buffer = logo->GetFile("NintendoLogo.png")->ReadAllBytes();
 | 
			
		||||
    return ResultStatus::Success;
 | 
			
		||||
}
 | 
			
		||||
} // namespace Loader
 | 
			
		||||
 | 
			
		||||
@ -39,6 +39,9 @@ public:
 | 
			
		||||
    u64 ReadRomFSIVFCOffset() const override;
 | 
			
		||||
    ResultStatus ReadProgramId(u64& out_program_id) override;
 | 
			
		||||
 | 
			
		||||
    ResultStatus ReadBanner(std::vector<u8>& buffer) override;
 | 
			
		||||
    ResultStatus ReadLogo(std::vector<u8>& buffer) override;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    std::unique_ptr<FileSys::NCA> nca;
 | 
			
		||||
    std::unique_ptr<AppLoader_DeconstructedRomDirectory> directory_loader;
 | 
			
		||||
 | 
			
		||||
@ -166,4 +166,13 @@ ResultStatus AppLoader_NSP::ReadManualRomFS(FileSys::VirtualFile& file) {
 | 
			
		||||
    file = nca->GetRomFS();
 | 
			
		||||
    return file == nullptr ? ResultStatus::ErrorNoRomFS : ResultStatus::Success;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ResultStatus AppLoader_NSP::ReadBanner(std::vector<u8>& buffer) {
 | 
			
		||||
    return secondary_loader->ReadBanner(buffer);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ResultStatus AppLoader_NSP::ReadLogo(std::vector<u8>& buffer) {
 | 
			
		||||
    return secondary_loader->ReadLogo(buffer);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace Loader
 | 
			
		||||
 | 
			
		||||
@ -46,6 +46,9 @@ public:
 | 
			
		||||
    ResultStatus ReadControlData(FileSys::NACP& nacp) override;
 | 
			
		||||
    ResultStatus ReadManualRomFS(FileSys::VirtualFile& file) override;
 | 
			
		||||
 | 
			
		||||
    ResultStatus ReadBanner(std::vector<u8>& buffer) override;
 | 
			
		||||
    ResultStatus ReadLogo(std::vector<u8>& buffer) override;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    std::unique_ptr<FileSys::NSP> nsp;
 | 
			
		||||
    std::unique_ptr<AppLoader> secondary_loader;
 | 
			
		||||
 | 
			
		||||
@ -137,4 +137,12 @@ ResultStatus AppLoader_XCI::ReadManualRomFS(FileSys::VirtualFile& file) {
 | 
			
		||||
    return file == nullptr ? ResultStatus::ErrorNoRomFS : ResultStatus::Success;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ResultStatus AppLoader_XCI::ReadBanner(std::vector<u8>& buffer) {
 | 
			
		||||
    return nca_loader->ReadBanner(buffer);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ResultStatus AppLoader_XCI::ReadLogo(std::vector<u8>& buffer) {
 | 
			
		||||
    return nca_loader->ReadLogo(buffer);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace Loader
 | 
			
		||||
 | 
			
		||||
@ -46,6 +46,9 @@ public:
 | 
			
		||||
    ResultStatus ReadControlData(FileSys::NACP& control) override;
 | 
			
		||||
    ResultStatus ReadManualRomFS(FileSys::VirtualFile& file) override;
 | 
			
		||||
 | 
			
		||||
    ResultStatus ReadBanner(std::vector<u8>& buffer) override;
 | 
			
		||||
    ResultStatus ReadLogo(std::vector<u8>& buffer) override;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    std::unique_ptr<FileSys::XCI> xci;
 | 
			
		||||
    std::unique_ptr<AppLoader_NCA> nca_loader;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user