forked from ShuriZma/suyu
patch_manager: Dump NSO name with build ID
This commit is contained in:
parent
41d2565f29
commit
552d5071fa
|
@ -156,7 +156,7 @@ std::vector<VirtualFile> PatchManager::CollectPatches(const std::vector<VirtualD
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<u8> PatchManager::PatchNSO(const std::vector<u8>& nso) const {
|
std::vector<u8> PatchManager::PatchNSO(const std::vector<u8>& nso, const std::string& name) const {
|
||||||
if (nso.size() < sizeof(Loader::NSOHeader)) {
|
if (nso.size() < sizeof(Loader::NSOHeader)) {
|
||||||
return nso;
|
return nso;
|
||||||
}
|
}
|
||||||
|
@ -172,18 +172,19 @@ std::vector<u8> PatchManager::PatchNSO(const std::vector<u8>& nso) const {
|
||||||
const auto build_id = build_id_raw.substr(0, build_id_raw.find_last_not_of('0') + 1);
|
const auto build_id = build_id_raw.substr(0, build_id_raw.find_last_not_of('0') + 1);
|
||||||
|
|
||||||
if (Settings::values.dump_nso) {
|
if (Settings::values.dump_nso) {
|
||||||
LOG_INFO(Loader, "Dumping NSO for build_id={}, title_id={:016X}", build_id, title_id);
|
LOG_INFO(Loader, "Dumping NSO for name={}, build_id={}, title_id={:016X}", name, build_id,
|
||||||
|
title_id);
|
||||||
const auto dump_dir = Service::FileSystem::GetModificationDumpRoot(title_id);
|
const auto dump_dir = Service::FileSystem::GetModificationDumpRoot(title_id);
|
||||||
if (dump_dir != nullptr) {
|
if (dump_dir != nullptr) {
|
||||||
const auto nso_dir = GetOrCreateDirectoryRelative(dump_dir, "/nso");
|
const auto nso_dir = GetOrCreateDirectoryRelative(dump_dir, "/nso");
|
||||||
const auto file = nso_dir->CreateFile(fmt::format("{}.nso", build_id));
|
const auto file = nso_dir->CreateFile(fmt::format("{}-{}.nso", name, build_id));
|
||||||
|
|
||||||
file->Resize(nso.size());
|
file->Resize(nso.size());
|
||||||
file->WriteBytes(nso);
|
file->WriteBytes(nso);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_INFO(Loader, "Patching NSO for build_id={}", build_id);
|
LOG_INFO(Loader, "Patching NSO for name={}, build_id={}", name, build_id);
|
||||||
|
|
||||||
const auto load_dir = Service::FileSystem::GetModificationLoadRoot(title_id);
|
const auto load_dir = Service::FileSystem::GetModificationLoadRoot(title_id);
|
||||||
auto patch_dirs = load_dir->GetSubdirectories();
|
auto patch_dirs = load_dir->GetSubdirectories();
|
||||||
|
|
|
@ -44,7 +44,7 @@ public:
|
||||||
// Currently tracked NSO patches:
|
// Currently tracked NSO patches:
|
||||||
// - IPS
|
// - IPS
|
||||||
// - IPSwitch
|
// - IPSwitch
|
||||||
std::vector<u8> PatchNSO(const std::vector<u8>& nso) const;
|
std::vector<u8> PatchNSO(const std::vector<u8>& nso, const std::string& name) const;
|
||||||
|
|
||||||
// Checks to see if PatchNSO() will have any effect given the NSO's build ID.
|
// Checks to see if PatchNSO() will have any effect given the NSO's build ID.
|
||||||
// Used to prevent expensive copies in NSO loader.
|
// Used to prevent expensive copies in NSO loader.
|
||||||
|
|
|
@ -154,8 +154,7 @@ void WebBrowser::Execute() {
|
||||||
|
|
||||||
auto& frontend{Core::System::GetInstance().GetWebBrowser()};
|
auto& frontend{Core::System::GetInstance().GetWebBrowser()};
|
||||||
|
|
||||||
frontend.OpenPage(
|
frontend.OpenPage(filename, [this] { UnpackRomFS(); }, [this] { Finalize(); });
|
||||||
filename, [this] { UnpackRomFS(); }, [this] { Finalize(); });
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebBrowser::UnpackRomFS() {
|
void WebBrowser::UnpackRomFS() {
|
||||||
|
|
|
@ -20,6 +20,8 @@
|
||||||
#include "core/memory.h"
|
#include "core/memory.h"
|
||||||
#include "core/settings.h"
|
#include "core/settings.h"
|
||||||
|
|
||||||
|
#pragma optimize("", off)
|
||||||
|
|
||||||
namespace Loader {
|
namespace Loader {
|
||||||
namespace {
|
namespace {
|
||||||
struct MODHeader {
|
struct MODHeader {
|
||||||
|
@ -139,13 +141,13 @@ std::optional<VAddr> AppLoader_NSO::LoadModule(Kernel::Process& process,
|
||||||
|
|
||||||
// Apply patches if necessary
|
// Apply patches if necessary
|
||||||
if (pm && (pm->HasNSOPatch(nso_header.build_id) || Settings::values.dump_nso)) {
|
if (pm && (pm->HasNSOPatch(nso_header.build_id) || Settings::values.dump_nso)) {
|
||||||
std::vector<u8> pi_header(sizeof(NSOHeader) + program_image.size());
|
std::vector<u8> pi_header;
|
||||||
pi_header.insert(pi_header.begin(), reinterpret_cast<u8*>(&nso_header),
|
pi_header.insert(pi_header.begin(), reinterpret_cast<u8*>(&nso_header),
|
||||||
reinterpret_cast<u8*>(&nso_header) + sizeof(NSOHeader));
|
reinterpret_cast<u8*>(&nso_header) + sizeof(NSOHeader));
|
||||||
pi_header.insert(pi_header.begin() + sizeof(NSOHeader), program_image.begin(),
|
pi_header.insert(pi_header.begin() + sizeof(NSOHeader), program_image.begin(),
|
||||||
program_image.end());
|
program_image.end());
|
||||||
|
|
||||||
pi_header = pm->PatchNSO(pi_header);
|
pi_header = pm->PatchNSO(pi_header, file.GetName());
|
||||||
|
|
||||||
std::copy(pi_header.begin() + sizeof(NSOHeader), pi_header.end(), program_image.begin());
|
std::copy(pi_header.begin() + sizeof(NSOHeader), pi_header.end(), program_image.begin());
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue