diff options
author | Zach Hilman <zachhilman@gmail.com> | 2018-09-30 04:16:09 +0200 |
---|---|---|
committer | Zach Hilman <zachhilman@gmail.com> | 2018-10-01 22:02:50 +0200 |
commit | 003b44822a309c0ef57fc6dd41e401e18ecb92bf (patch) | |
tree | 1f03a2398e48b4795d38ce9e6d235f297c8a9eec | |
parent | patch_manager: Add PatchNSO function (diff) | |
download | yuzu-003b44822a309c0ef57fc6dd41e401e18ecb92bf.tar yuzu-003b44822a309c0ef57fc6dd41e401e18ecb92bf.tar.gz yuzu-003b44822a309c0ef57fc6dd41e401e18ecb92bf.tar.bz2 yuzu-003b44822a309c0ef57fc6dd41e401e18ecb92bf.tar.lz yuzu-003b44822a309c0ef57fc6dd41e401e18ecb92bf.tar.xz yuzu-003b44822a309c0ef57fc6dd41e401e18ecb92bf.tar.zst yuzu-003b44822a309c0ef57fc6dd41e401e18ecb92bf.zip |
-rw-r--r-- | src/core/loader/nso.cpp | 15 | ||||
-rw-r--r-- | src/core/loader/nso.h | 4 |
2 files changed, 17 insertions, 2 deletions
diff --git a/src/core/loader/nso.cpp b/src/core/loader/nso.cpp index 512954d40..d22a88af1 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" @@ -92,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, + std::shared_ptr<FileSys::PatchManager> pm) { if (file == nullptr) return {}; @@ -141,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 != nullptr && 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)); diff --git a/src/core/loader/nso.h b/src/core/loader/nso.h index 7f142405b..7c26aa4ba 100644 --- a/src/core/loader/nso.h +++ b/src/core/loader/nso.h @@ -5,6 +5,7 @@ #pragma once #include "common/common_types.h" +#include "core/file_sys/patch_manager.h" #include "core/loader/linker.h" #include "core/loader/loader.h" @@ -26,7 +27,8 @@ public: return IdentifyType(file); } - static VAddr LoadModule(FileSys::VirtualFile file, VAddr load_base); + static VAddr LoadModule(FileSys::VirtualFile file, VAddr load_base, + std::shared_ptr<FileSys::PatchManager> pm = nullptr); ResultStatus Load(Kernel::Process& process) override; }; |