diff --git a/src/core/file_sys/ncch_container.cpp b/src/core/file_sys/ncch_container.cpp index a67f4de0c4..fc84979f04 100644 --- a/src/core/file_sys/ncch_container.cpp +++ b/src/core/file_sys/ncch_container.cpp @@ -24,6 +24,53 @@ namespace FileSys { static const int kMaxSections = 8; ///< Maximum number of sections (files) in an ExeFs static const int kBlockSize = 0x200; ///< Size of ExeFS blocks (in bytes) +/** + * Attempts to patch a buffer using an IPS + * @param ips Vector of the patches to apply + * @param buffer Vector to patch data into + */ +static void ApplyIPS(std::vector& ips, std::vector& buffer) { + u32 cursor = 5; + u32 patch_length = ips.size() - 3; + std::string ips_header(ips.begin(), ips.begin() + 5); + + if (ips_header != "PATCH") { + LOG_INFO(Service_FS, "Attempted to load invalid IPS"); + return; + } + + while (cursor < patch_length) { + std::string eof_check(ips.begin() + cursor, ips.begin() + cursor + 3); + + if (eof_check == "EOF") + return; + + u32 offset = ips[cursor] << 16 | ips[cursor + 1] << 8 | ips[cursor + 2]; + std::size_t length = ips[cursor + 3] << 8 | ips[cursor + 4]; + + // check for an rle record + if (length == 0) { + length = ips[cursor + 5] << 8 | ips[cursor + 6]; + + if (buffer.size() < offset + length) + return; + + for (u32 i = 0; i < length; ++i) + buffer[offset + i] = ips[cursor + 7]; + + cursor += 8; + + continue; + } + + if (buffer.size() < offset + length) + return; + + std::memcpy(&buffer[offset], &ips[cursor + 5], length); + cursor += length + 5; + } +} + /** * Get the decompressed size of an LZSS compressed ExeFS file * @param buffer Buffer of compressed file @@ -534,48 +581,6 @@ Loader::ResultStatus NCCHContainer::LoadOverrideExeFSSection(const char* name, return Loader::ResultStatus::ErrorNotUsed; } -void NCCHContainer::ApplyIPS(std::vector& ips, std::vector& buffer) { - u32 cursor = 5; - u32 patch_length = ips.size() - 3; - std::string ips_header(ips.begin(), ips.begin() + 5); - - if (ips_header != "PATCH") { - LOG_INFO(Service_FS, "Attempted to load invalid IPS"); - return; - } - - while (cursor < patch_length) { - std::string eof_check(ips.begin() + cursor, ips.begin() + cursor + 3); - - if (eof_check == "EOF") - return; - - u32 offset = ips[cursor] << 16 | ips[cursor + 1] << 8 | ips[cursor + 2]; - std::size_t length = ips[cursor + 3] << 8 | ips[cursor + 4]; - - // check for an rle record - if (length == 0) { - length = ips[cursor + 5] << 8 | ips[cursor + 6]; - - if (buffer.size() < offset + length) - return; - - for (u32 i = 0; i < length; ++i) - buffer[offset + i] = ips[cursor + 7]; - - cursor += 8; - - continue; - } - - if (buffer.size() < offset + length) - return; - - std::memcpy(&buffer[offset], &ips[cursor + 5], length); - cursor += length + 5; - } -} - Loader::ResultStatus NCCHContainer::ReadRomFS(std::shared_ptr& romfs_file) { Loader::ResultStatus result = Load(); if (result != Loader::ResultStatus::Success) diff --git a/src/core/file_sys/ncch_container.h b/src/core/file_sys/ncch_container.h index c1ee7f2c46..79f87a6efd 100644 --- a/src/core/file_sys/ncch_container.h +++ b/src/core/file_sys/ncch_container.h @@ -294,12 +294,6 @@ public: ExHeader_Header exheader_header; private: - /** - * Attempts to patch a buffer using an IPS - * @param ips Vector of the patches to apply - * @param buffer Vector to patch data into - */ - static void ApplyIPS(std::vector& ips, std::vector& buffer); bool has_header = false; bool has_exheader = false; bool has_exefs = false;