diff options
Diffstat (limited to 'src/core/file_sys')
| -rw-r--r-- | src/core/file_sys/patch_manager.cpp | 22 |
1 files changed, 8 insertions, 14 deletions
diff --git a/src/core/file_sys/patch_manager.cpp b/src/core/file_sys/patch_manager.cpp index efc572c72..fd21d3ad1 100644 --- a/src/core/file_sys/patch_manager.cpp +++ b/src/core/file_sys/patch_manager.cpp | |||
| @@ -20,6 +20,7 @@ | |||
| 20 | #include "core/file_sys/vfs_vector.h" | 20 | #include "core/file_sys/vfs_vector.h" |
| 21 | #include "core/hle/service/filesystem/filesystem.h" | 21 | #include "core/hle/service/filesystem/filesystem.h" |
| 22 | #include "core/loader/loader.h" | 22 | #include "core/loader/loader.h" |
| 23 | #include "core/loader/nso.h" | ||
| 23 | #include "core/settings.h" | 24 | #include "core/settings.h" |
| 24 | 25 | ||
| 25 | namespace FileSys { | 26 | namespace FileSys { |
| @@ -32,14 +33,6 @@ constexpr std::array<const char*, 14> EXEFS_FILE_NAMES{ | |||
| 32 | "subsdk3", "subsdk4", "subsdk5", "subsdk6", "subsdk7", "subsdk8", "subsdk9", | 33 | "subsdk3", "subsdk4", "subsdk5", "subsdk6", "subsdk7", "subsdk8", "subsdk9", |
| 33 | }; | 34 | }; |
| 34 | 35 | ||
| 35 | struct NSOBuildHeader { | ||
| 36 | u32_le magic; | ||
| 37 | INSERT_PADDING_BYTES(0x3C); | ||
| 38 | std::array<u8, 0x20> build_id; | ||
| 39 | INSERT_PADDING_BYTES(0xA0); | ||
| 40 | }; | ||
| 41 | static_assert(sizeof(NSOBuildHeader) == 0x100, "NSOBuildHeader has incorrect size."); | ||
| 42 | |||
| 43 | std::string FormatTitleVersion(u32 version, TitleVersionFormat format) { | 36 | std::string FormatTitleVersion(u32 version, TitleVersionFormat format) { |
| 44 | std::array<u8, sizeof(u32)> bytes{}; | 37 | std::array<u8, sizeof(u32)> bytes{}; |
| 45 | bytes[0] = version % SINGLE_BYTE_MODULUS; | 38 | bytes[0] = version % SINGLE_BYTE_MODULUS; |
| @@ -163,15 +156,16 @@ std::vector<VirtualFile> PatchManager::CollectPatches(const std::vector<VirtualD | |||
| 163 | } | 156 | } |
| 164 | 157 | ||
| 165 | std::vector<u8> PatchManager::PatchNSO(const std::vector<u8>& nso) const { | 158 | std::vector<u8> PatchManager::PatchNSO(const std::vector<u8>& nso) const { |
| 166 | if (nso.size() < sizeof(NSOBuildHeader)) { | 159 | if (nso.size() < sizeof(Loader::NSOHeader)) { |
| 167 | return nso; | 160 | return nso; |
| 168 | } | 161 | } |
| 169 | 162 | ||
| 170 | NSOBuildHeader header; | 163 | Loader::NSOHeader header; |
| 171 | std::memcpy(&header, nso.data(), sizeof(NSOBuildHeader)); | 164 | std::memcpy(&header, nso.data(), sizeof(header)); |
| 172 | 165 | ||
| 173 | if (header.magic != Common::MakeMagic('N', 'S', 'O', '0')) | 166 | if (header.magic != Common::MakeMagic('N', 'S', 'O', '0')) { |
| 174 | return nso; | 167 | return nso; |
| 168 | } | ||
| 175 | 169 | ||
| 176 | const auto build_id_raw = Common::HexArrayToString(header.build_id); | 170 | const auto build_id_raw = Common::HexArrayToString(header.build_id); |
| 177 | const auto build_id = build_id_raw.substr(0, build_id_raw.find_last_not_of('0') + 1); | 171 | const auto build_id = build_id_raw.substr(0, build_id_raw.find_last_not_of('0') + 1); |
| @@ -214,11 +208,11 @@ std::vector<u8> PatchManager::PatchNSO(const std::vector<u8>& nso) const { | |||
| 214 | } | 208 | } |
| 215 | } | 209 | } |
| 216 | 210 | ||
| 217 | if (out.size() < sizeof(NSOBuildHeader)) { | 211 | if (out.size() < sizeof(Loader::NSOHeader)) { |
| 218 | return nso; | 212 | return nso; |
| 219 | } | 213 | } |
| 220 | 214 | ||
| 221 | std::memcpy(out.data(), &header, sizeof(NSOBuildHeader)); | 215 | std::memcpy(out.data(), &header, sizeof(header)); |
| 222 | return out; | 216 | return out; |
| 223 | } | 217 | } |
| 224 | 218 | ||