diff options
Diffstat (limited to 'src/core/file_sys')
| -rw-r--r-- | src/core/file_sys/bis_factory.cpp | 9 | ||||
| -rw-r--r-- | src/core/file_sys/bis_factory.h | 4 | ||||
| -rw-r--r-- | src/core/file_sys/patch_manager.cpp | 13 | 
3 files changed, 24 insertions, 2 deletions
| diff --git a/src/core/file_sys/bis_factory.cpp b/src/core/file_sys/bis_factory.cpp index 76a2b7e86..e29f70b3a 100644 --- a/src/core/file_sys/bis_factory.cpp +++ b/src/core/file_sys/bis_factory.cpp @@ -8,8 +8,9 @@  namespace FileSys { -BISFactory::BISFactory(VirtualDir nand_root_, VirtualDir load_root_) +BISFactory::BISFactory(VirtualDir nand_root_, VirtualDir load_root_, VirtualDir dump_root_)      : nand_root(std::move(nand_root_)), load_root(std::move(load_root_)), +      dump_root(std::move(dump_root_)),        sysnand_cache(std::make_unique<RegisteredCache>(            GetOrCreateDirectoryRelative(nand_root, "/system/Contents/registered"))),        usrnand_cache(std::make_unique<RegisteredCache>( @@ -32,4 +33,10 @@ VirtualDir BISFactory::GetModificationLoadRoot(u64 title_id) const {      return GetOrCreateDirectoryRelative(load_root, fmt::format("/{:016X}", title_id));  } +VirtualDir BISFactory::GetModificationDumpRoot(u64 title_id) const { +    if (title_id == 0) +        return nullptr; +    return GetOrCreateDirectoryRelative(dump_root, fmt::format("/{:016X}", title_id)); +} +  } // namespace FileSys diff --git a/src/core/file_sys/bis_factory.h b/src/core/file_sys/bis_factory.h index 364d309bd..453c11ad2 100644 --- a/src/core/file_sys/bis_factory.h +++ b/src/core/file_sys/bis_factory.h @@ -17,17 +17,19 @@ class RegisteredCache;  /// registered caches.  class BISFactory {  public: -    explicit BISFactory(VirtualDir nand_root, VirtualDir load_root); +    explicit BISFactory(VirtualDir nand_root, VirtualDir load_root, VirtualDir dump_root);      ~BISFactory();      RegisteredCache* GetSystemNANDContents() const;      RegisteredCache* GetUserNANDContents() const;      VirtualDir GetModificationLoadRoot(u64 title_id) const; +    VirtualDir GetModificationDumpRoot(u64 title_id) const;  private:      VirtualDir nand_root;      VirtualDir load_root; +    VirtualDir dump_root;      std::unique_ptr<RegisteredCache> sysnand_cache;      std::unique_ptr<RegisteredCache> usrnand_cache; diff --git a/src/core/file_sys/patch_manager.cpp b/src/core/file_sys/patch_manager.cpp index 0c1156989..8d062eb3e 100644 --- a/src/core/file_sys/patch_manager.cpp +++ b/src/core/file_sys/patch_manager.cpp @@ -19,6 +19,7 @@  #include "core/file_sys/vfs_vector.h"  #include "core/hle/service/filesystem/filesystem.h"  #include "core/loader/loader.h" +#include "core/settings.h"  namespace FileSys { @@ -119,6 +120,18 @@ std::vector<u8> PatchManager::PatchNSO(const std::vector<u8>& nso) const {      const auto build_id_raw = Common::HexArrayToString(header.build_id);      const auto build_id = build_id_raw.substr(0, build_id_raw.find_last_not_of('0') + 1); +    if (Settings::values.dump_nso) { +        LOG_INFO(Loader, "Dumping NSO for build_id={}, title_id={:016X}", build_id, title_id); +        const auto dump_dir = Service::FileSystem::GetModificationDumpRoot(title_id); +        if (dump_dir != nullptr) { +            const auto nso_dir = GetOrCreateDirectoryRelative(dump_dir, "/nso"); +            const auto file = nso_dir->CreateFile(fmt::format("{}.nso", build_id)); + +            file->Resize(nso.size()); +            file->WriteBytes(nso); +        } +    } +      LOG_INFO(Loader, "Patching NSO for build_id={}", build_id);      const auto load_dir = Service::FileSystem::GetModificationLoadRoot(title_id); | 
