diff options
author | bunnei <bunneidev@gmail.com> | 2018-10-04 09:42:37 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-10-04 09:42:37 -0400 |
commit | f85f2b372807b9785bfe30b2b1e2f342d58bddf6 (patch) | |
tree | 90fbcbdc532c106407503531e38c736471272e1e /src/core/loader/nso.cpp | |
parent | cf3a6dd4a175cfc18a856b071ceff9c5e4833eca (diff) | |
parent | 215b65fe75810b72bb76ae8dbb75ea59ac16f13f (diff) |
Merge pull request #1415 from DarkLordZach/ips
file_sys: Add support for loading IPS patches
Diffstat (limited to 'src/core/loader/nso.cpp')
-rw-r--r-- | src/core/loader/nso.cpp | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/src/core/loader/nso.cpp b/src/core/loader/nso.cpp index cbe2a3e53..2186b02af 100644 --- a/src/core/loader/nso.cpp +++ b/src/core/loader/nso.cpp @@ -10,6 +10,7 @@ #include "common/logging/log.h" #include "common/swap.h" #include "core/core.h" +#include "core/file_sys/patch_manager.h" #include "core/gdbstub/gdbstub.h" #include "core/hle/kernel/kernel.h" #include "core/hle/kernel/process.h" @@ -36,8 +37,7 @@ struct NsoHeader { INSERT_PADDING_WORDS(1); u8 flags; std::array<NsoSegmentHeader, 3> segments; // Text, RoData, Data (in that order) - u32_le bss_size; - INSERT_PADDING_BYTES(0x1c); + std::array<u8, 0x20> build_id; std::array<u32_le, 3> segments_compressed_size; bool IsSegmentCompressed(size_t segment_num) const { @@ -93,7 +93,8 @@ static constexpr u32 PageAlignSize(u32 size) { return (size + Memory::PAGE_MASK) & ~Memory::PAGE_MASK; } -VAddr AppLoader_NSO::LoadModule(FileSys::VirtualFile file, VAddr load_base) { +VAddr AppLoader_NSO::LoadModule(FileSys::VirtualFile file, VAddr load_base, + boost::optional<FileSys::PatchManager> pm) { if (file == nullptr) return {}; @@ -142,6 +143,17 @@ VAddr AppLoader_NSO::LoadModule(FileSys::VirtualFile file, VAddr load_base) { const u32 image_size{PageAlignSize(static_cast<u32>(program_image.size()) + bss_size)}; program_image.resize(image_size); + // Apply patches if necessary + if (pm != boost::none && pm->HasNSOPatch(nso_header.build_id)) { + std::vector<u8> pi_header(program_image.size() + 0x100); + std::memcpy(pi_header.data(), &nso_header, sizeof(NsoHeader)); + std::memcpy(pi_header.data() + 0x100, program_image.data(), program_image.size()); + + pi_header = pm->PatchNSO(pi_header); + + std::memcpy(program_image.data(), pi_header.data() + 0x100, program_image.size()); + } + // Load codeset for current process codeset->name = file->GetName(); codeset->memory = std::make_shared<std::vector<u8>>(std::move(program_image)); |