summaryrefslogtreecommitdiff
path: root/src/core/file_sys
diff options
context:
space:
mode:
authorGravatar Lioncash2019-03-22 13:04:41 -0400
committerGravatar Lioncash2019-03-22 14:39:10 -0400
commit1cf90f45704373cd61d274d1e3c4dc6e5be87eaa (patch)
tree7654dab9069c34d32cd14f2ae3a025b7eaeff7b2 /src/core/file_sys
parentloader/nso: Fix definition of the NSO header struct (diff)
downloadyuzu-1cf90f45704373cd61d274d1e3c4dc6e5be87eaa.tar.gz
yuzu-1cf90f45704373cd61d274d1e3c4dc6e5be87eaa.tar.xz
yuzu-1cf90f45704373cd61d274d1e3c4dc6e5be87eaa.zip
file_sys/patch_manager: Deduplicate NSO header
This source file was utilizing its own version of the NSO header. Instead of keeping this around, we can have the patch manager also use the version of the header that we have defined in loader/nso.h
Diffstat (limited to 'src/core/file_sys')
-rw-r--r--src/core/file_sys/patch_manager.cpp22
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
25namespace FileSys { 26namespace 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
35struct NSOBuildHeader {
36 u32_le magic;
37 INSERT_PADDING_BYTES(0x3C);
38 std::array<u8, 0x20> build_id;
39 INSERT_PADDING_BYTES(0xA0);
40};
41static_assert(sizeof(NSOBuildHeader) == 0x100, "NSOBuildHeader has incorrect size.");
42
43std::string FormatTitleVersion(u32 version, TitleVersionFormat format) { 36std::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
165std::vector<u8> PatchManager::PatchNSO(const std::vector<u8>& nso) const { 158std::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