From 361c5982f20e7f805cf3f7c1fee47b5d11e6b023 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Wed, 5 Dec 2018 00:05:01 -0500 Subject: [PATCH 1/2] service/ldr: Corrent padding within the NRR header layout The padding after the magic signature value should be 12 bytes rather than 28 bytes. The other 16 should be placed after the title ID pattern. --- src/core/hle/service/ldr/ldr.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/core/hle/service/ldr/ldr.cpp b/src/core/hle/service/ldr/ldr.cpp index ca119dd3a6..2f66134767 100644 --- a/src/core/hle/service/ldr/ldr.cpp +++ b/src/core/hle/service/ldr/ldr.cpp @@ -436,9 +436,10 @@ private: struct NRRHeader { u32_le magic; - INSERT_PADDING_BYTES(0x1C); + INSERT_PADDING_BYTES(12); u64_le title_id_mask; u64_le title_id_pattern; + INSERT_PADDING_BYTES(16); std::array modulus; std::array signature_1; std::array signature_2; From 2e01f8fdcd33c06eb0ec77fae0aae1e6646184c9 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Wed, 5 Dec 2018 00:16:47 -0500 Subject: [PATCH 2/2] service/ldr: Amend layout of the NRO header The first word is just a padding byte, it's not an actual entry instruction. Also renames the rest of the entries according to SwitchBrew. --- src/core/hle/service/ldr/ldr.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/core/hle/service/ldr/ldr.cpp b/src/core/hle/service/ldr/ldr.cpp index 2f66134767..a81699a5a3 100644 --- a/src/core/hle/service/ldr/ldr.cpp +++ b/src/core/hle/service/ldr/ldr.cpp @@ -414,13 +414,13 @@ private: using SHA256Hash = std::array; struct NROHeader { - u32_le entrypoint_insn; + INSERT_PADDING_WORDS(1); u32_le mod_offset; INSERT_PADDING_WORDS(2); u32_le magic; - INSERT_PADDING_WORDS(1); + u32_le version; u32_le nro_size; - INSERT_PADDING_WORDS(1); + u32_le flags; u32_le text_offset; u32_le text_size; u32_le ro_offset;