Merge pull request #2025 from DarkLordZach/loader-banner-logo

loader: Add getters for application banner and logo
This commit is contained in:
bunnei 2019-01-20 13:26:27 -05:00 committed by GitHub
commit f9e69faf4a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
11 changed files with 77 additions and 0 deletions

View file

@ -359,6 +359,8 @@ bool NCA::ReadPFS0Section(const NCASectionHeader& section, const NCASectionTable
dirs.push_back(std::move(npfs)); dirs.push_back(std::move(npfs));
if (IsDirectoryExeFS(dirs.back())) if (IsDirectoryExeFS(dirs.back()))
exefs = dirs.back(); exefs = dirs.back();
else if (IsDirectoryLogoPartition(dirs.back()))
logo = dirs.back();
} else { } else {
if (has_rights_id) if (has_rights_id)
status = Loader::ResultStatus::ErrorIncorrectTitlekeyOrTitlekek; status = Loader::ResultStatus::ErrorIncorrectTitlekeyOrTitlekek;
@ -546,4 +548,8 @@ u64 NCA::GetBaseIVFCOffset() const {
return ivfc_offset; return ivfc_offset;
} }
VirtualDir NCA::GetLogoPartition() const {
return logo;
}
} // namespace FileSys } // namespace FileSys

View file

@ -74,6 +74,13 @@ inline bool IsDirectoryExeFS(const std::shared_ptr<VfsDirectory>& pfs) {
return pfs->GetFile("main") != nullptr && pfs->GetFile("main.npdm") != nullptr; 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. // 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. // After construction, use GetStatus to determine if the file is valid and ready to be used.
class NCA : public ReadOnlyVfsDirectory { class NCA : public ReadOnlyVfsDirectory {
@ -102,6 +109,8 @@ public:
// Returns the base ivfc offset used in BKTR patching. // Returns the base ivfc offset used in BKTR patching.
u64 GetBaseIVFCOffset() const; u64 GetBaseIVFCOffset() const;
VirtualDir GetLogoPartition() const;
private: private:
bool CheckSupportedNCA(const NCAHeader& header); bool CheckSupportedNCA(const NCAHeader& header);
bool HandlePotentialHeaderDecryption(); bool HandlePotentialHeaderDecryption();
@ -122,6 +131,7 @@ private:
VirtualFile romfs = nullptr; VirtualFile romfs = nullptr;
VirtualDir exefs = nullptr; VirtualDir exefs = nullptr;
VirtualDir logo = nullptr;
VirtualFile file; VirtualFile file;
VirtualFile bktr_base_romfs; VirtualFile bktr_base_romfs;
u64 ivfc_offset = 0; u64 ivfc_offset = 0;

View file

@ -178,6 +178,8 @@ public:
/** /**
* Get the banner (typically banner section) of the application * 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 * @param buffer Reference to buffer to store data
* @return ResultStatus result of function * @return ResultStatus result of function
*/ */
@ -187,6 +189,8 @@ public:
/** /**
* Get the logo (typically logo section) of the application * 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 * @param buffer Reference to buffer to store data
* @return ResultStatus result of function * @return ResultStatus result of function
*/ */

View file

@ -79,4 +79,13 @@ u64 AppLoader_NAX::ReadRomFSIVFCOffset() const {
ResultStatus AppLoader_NAX::ReadProgramId(u64& out_program_id) { ResultStatus AppLoader_NAX::ReadProgramId(u64& out_program_id) {
return nca_loader->ReadProgramId(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 } // namespace Loader

View file

@ -39,6 +39,9 @@ public:
u64 ReadRomFSIVFCOffset() const override; u64 ReadRomFSIVFCOffset() const override;
ResultStatus ReadProgramId(u64& out_program_id) override; ResultStatus ReadProgramId(u64& out_program_id) override;
ResultStatus ReadBanner(std::vector<u8>& buffer) override;
ResultStatus ReadLogo(std::vector<u8>& buffer) override;
private: private:
std::unique_ptr<FileSys::NAX> nax; std::unique_ptr<FileSys::NAX> nax;
std::unique_ptr<AppLoader_NCA> nca_loader; std::unique_ptr<AppLoader_NCA> nca_loader;

View file

@ -84,4 +84,23 @@ ResultStatus AppLoader_NCA::ReadProgramId(u64& out_program_id) {
return ResultStatus::Success; 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 } // namespace Loader

View file

@ -39,6 +39,9 @@ public:
u64 ReadRomFSIVFCOffset() const override; u64 ReadRomFSIVFCOffset() const override;
ResultStatus ReadProgramId(u64& out_program_id) override; ResultStatus ReadProgramId(u64& out_program_id) override;
ResultStatus ReadBanner(std::vector<u8>& buffer) override;
ResultStatus ReadLogo(std::vector<u8>& buffer) override;
private: private:
std::unique_ptr<FileSys::NCA> nca; std::unique_ptr<FileSys::NCA> nca;
std::unique_ptr<AppLoader_DeconstructedRomDirectory> directory_loader; std::unique_ptr<AppLoader_DeconstructedRomDirectory> directory_loader;

View file

@ -166,4 +166,13 @@ ResultStatus AppLoader_NSP::ReadManualRomFS(FileSys::VirtualFile& file) {
file = nca->GetRomFS(); file = nca->GetRomFS();
return file == nullptr ? ResultStatus::ErrorNoRomFS : ResultStatus::Success; 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 } // namespace Loader

View file

@ -46,6 +46,9 @@ public:
ResultStatus ReadControlData(FileSys::NACP& nacp) override; ResultStatus ReadControlData(FileSys::NACP& nacp) override;
ResultStatus ReadManualRomFS(FileSys::VirtualFile& file) override; ResultStatus ReadManualRomFS(FileSys::VirtualFile& file) override;
ResultStatus ReadBanner(std::vector<u8>& buffer) override;
ResultStatus ReadLogo(std::vector<u8>& buffer) override;
private: private:
std::unique_ptr<FileSys::NSP> nsp; std::unique_ptr<FileSys::NSP> nsp;
std::unique_ptr<AppLoader> secondary_loader; std::unique_ptr<AppLoader> secondary_loader;

View file

@ -137,4 +137,12 @@ ResultStatus AppLoader_XCI::ReadManualRomFS(FileSys::VirtualFile& file) {
return file == nullptr ? ResultStatus::ErrorNoRomFS : ResultStatus::Success; 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 } // namespace Loader

View file

@ -46,6 +46,9 @@ public:
ResultStatus ReadControlData(FileSys::NACP& control) override; ResultStatus ReadControlData(FileSys::NACP& control) override;
ResultStatus ReadManualRomFS(FileSys::VirtualFile& file) override; ResultStatus ReadManualRomFS(FileSys::VirtualFile& file) override;
ResultStatus ReadBanner(std::vector<u8>& buffer) override;
ResultStatus ReadLogo(std::vector<u8>& buffer) override;
private: private:
std::unique_ptr<FileSys::XCI> xci; std::unique_ptr<FileSys::XCI> xci;
std::unique_ptr<AppLoader_NCA> nca_loader; std::unique_ptr<AppLoader_NCA> nca_loader;