From bb29ac7a2604d1c5850736f8e8ef7a20d859cb75 Mon Sep 17 00:00:00 2001 From: Subv Date: Thu, 16 Jul 2015 20:40:36 -0500 Subject: [PATCH] fixed a bug when retroactively applying unk2 patches --- src/core/hle/service/ldr_ro.cpp | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/core/hle/service/ldr_ro.cpp b/src/core/hle/service/ldr_ro.cpp index 980685ab8..11b9cc400 100644 --- a/src/core/hle/service/ldr_ro.cpp +++ b/src/core/hle/service/ldr_ro.cpp @@ -385,10 +385,14 @@ static void ApplyImportTable1Patches(CROHeader* header, u32 base, bool relocated } } -static u32 GetCROBaseByName(char* name) { +static u32 GetCROBaseByName(char* name, bool relocated) { for (u32 base : loaded_cros) { CROHeader* header = reinterpret_cast(Memory::GetPointer(base)); - if (!strcmp(reinterpret_cast(header) + header->name_offset, name)) + char* cro_name = reinterpret_cast(header) + header->name_offset; + if (relocated) + cro_name = reinterpret_cast(Memory::GetPointer(header->name_offset)); + + if (!strcmp(cro_name, name)) return base; } return 0; @@ -397,7 +401,7 @@ static u32 GetCROBaseByName(char* name) { static void ApplyUnk2Patches(CROHeader* header, u32 base, bool relocated) { for (int i = 0; i < header->unk2_num; ++i) { Unk2Patch* entry = header->GetUnk2PatchEntry(i); - u32 cro_base = GetCROBaseByName(reinterpret_cast(Memory::GetPointer(entry->string_offset))); + u32 cro_base = GetCROBaseByName(reinterpret_cast(Memory::GetPointer(entry->string_offset)), relocated); if (cro_base == 0) continue; @@ -421,7 +425,11 @@ static void ApplyUnk2Patches(CROHeader* header, u32 base, bool relocated) { u32 target_segment_offset = table2_entry->offset_or_index >> 4; SegmentTableEntry* target_base_segment = patch_cro->GetSegmentTableEntry(target_segment_id, relocated); - Patch* first_patch = reinterpret_cast(Memory::GetPointer(base + table2_entry->patches_offset)); + Patch* first_patch = nullptr; + if (relocated) + first_patch = reinterpret_cast(Memory::GetPointer(table2_entry->patches_offset)); + else + first_patch = reinterpret_cast(Memory::GetPointer(base + table2_entry->patches_offset)); ApplyListPatches(header, first_patch, target_base_segment->segment_offset + target_segment_offset, relocated); } } @@ -527,7 +535,7 @@ static void LoadCRO(u32 base, u8* cro, bool relocate_segments, u32 data_section0 for (u32 cro_base : loaded_cros) { CROHeader* cro_header = reinterpret_cast(Memory::GetPointer(cro_base)); ApplyImportTable1Patches(cro_header, cro_base, true); - ApplyUnk2Patches(header, cro_base, true); + ApplyUnk2Patches(cro_header, cro_base, true); } // Relocate all offsets @@ -679,7 +687,7 @@ const Interface::FunctionInfo FunctionTable[] = { {0x00060042, nullptr, "CRO_Load?"}, {0x00070042, nullptr, "LoadCROSymbols"}, {0x00080042, nullptr, "Shutdown"}, - {0x000902C2, nullptr, "LoadExeCRO_New?"}, + {0x000902C2, LoadExeCRO, "LoadExeCRO_New?"}, }; ////////////////////////////////////////////////////////////////////////////////////////////////////