fixed a bug when retroactively applying unk2 patches

This commit is contained in:
Subv 2015-07-16 20:40:36 -05:00
parent bb58f2d1dd
commit bb29ac7a26

View file

@ -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) { for (u32 base : loaded_cros) {
CROHeader* header = reinterpret_cast<CROHeader*>(Memory::GetPointer(base)); CROHeader* header = reinterpret_cast<CROHeader*>(Memory::GetPointer(base));
if (!strcmp(reinterpret_cast<char*>(header) + header->name_offset, name)) char* cro_name = reinterpret_cast<char*>(header) + header->name_offset;
if (relocated)
cro_name = reinterpret_cast<char*>(Memory::GetPointer(header->name_offset));
if (!strcmp(cro_name, name))
return base; return base;
} }
return 0; return 0;
@ -397,7 +401,7 @@ static u32 GetCROBaseByName(char* name) {
static void ApplyUnk2Patches(CROHeader* header, u32 base, bool relocated) { static void ApplyUnk2Patches(CROHeader* header, u32 base, bool relocated) {
for (int i = 0; i < header->unk2_num; ++i) { for (int i = 0; i < header->unk2_num; ++i) {
Unk2Patch* entry = header->GetUnk2PatchEntry(i); Unk2Patch* entry = header->GetUnk2PatchEntry(i);
u32 cro_base = GetCROBaseByName(reinterpret_cast<char*>(Memory::GetPointer(entry->string_offset))); u32 cro_base = GetCROBaseByName(reinterpret_cast<char*>(Memory::GetPointer(entry->string_offset)), relocated);
if (cro_base == 0) if (cro_base == 0)
continue; continue;
@ -421,7 +425,11 @@ static void ApplyUnk2Patches(CROHeader* header, u32 base, bool relocated) {
u32 target_segment_offset = table2_entry->offset_or_index >> 4; u32 target_segment_offset = table2_entry->offset_or_index >> 4;
SegmentTableEntry* target_base_segment = patch_cro->GetSegmentTableEntry(target_segment_id, relocated); SegmentTableEntry* target_base_segment = patch_cro->GetSegmentTableEntry(target_segment_id, relocated);
Patch* first_patch = reinterpret_cast<Patch*>(Memory::GetPointer(base + table2_entry->patches_offset)); Patch* first_patch = nullptr;
if (relocated)
first_patch = reinterpret_cast<Patch*>(Memory::GetPointer(table2_entry->patches_offset));
else
first_patch = reinterpret_cast<Patch*>(Memory::GetPointer(base + table2_entry->patches_offset));
ApplyListPatches(header, first_patch, target_base_segment->segment_offset + target_segment_offset, relocated); 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) { for (u32 cro_base : loaded_cros) {
CROHeader* cro_header = reinterpret_cast<CROHeader*>(Memory::GetPointer(cro_base)); CROHeader* cro_header = reinterpret_cast<CROHeader*>(Memory::GetPointer(cro_base));
ApplyImportTable1Patches(cro_header, cro_base, true); ApplyImportTable1Patches(cro_header, cro_base, true);
ApplyUnk2Patches(header, cro_base, true); ApplyUnk2Patches(cro_header, cro_base, true);
} }
// Relocate all offsets // Relocate all offsets
@ -679,7 +687,7 @@ const Interface::FunctionInfo FunctionTable[] = {
{0x00060042, nullptr, "CRO_Load?"}, {0x00060042, nullptr, "CRO_Load?"},
{0x00070042, nullptr, "LoadCROSymbols"}, {0x00070042, nullptr, "LoadCROSymbols"},
{0x00080042, nullptr, "Shutdown"}, {0x00080042, nullptr, "Shutdown"},
{0x000902C2, nullptr, "LoadExeCRO_New?"}, {0x000902C2, LoadExeCRO, "LoadExeCRO_New?"},
}; };
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////