Fix import thunk resolving.

This commit is contained in:
Skyth 2024-09-22 13:32:38 +03:00
parent 918e09d380
commit 510cff56f2
5 changed files with 11 additions and 5 deletions

View File

@ -1765,7 +1765,7 @@ bool Recompiler::Recompile(const Function& fn)
if (insn.opcode == nullptr) if (insn.opcode == nullptr)
{ {
println("\t// {}", insn.op_str); println("\t// {}", insn.op_str);
#if 0 #if 1
if (*(data - 1) != 0) if (*(data - 1) != 0)
std::println("Unable to decode instruction {:X} at {:X}", *(data - 1), base - 4); std::println("Unable to decode instruction {:X} at {:X}", *(data - 1), base - 4);
#endif #endif

View File

@ -163,6 +163,11 @@ void SWARecompiler::Analyse()
continue; continue;
} }
if (*(uint32_t*)data == 0x45564800)
{
break;
}
auto fnSymbol = image.symbols.find(base); auto fnSymbol = image.symbols.find(base);
if (fnSymbol != image.symbols.end() && fnSymbol->address == base && fnSymbol->type == Symbol_Function) if (fnSymbol != image.symbols.end() && fnSymbol->address == base && fnSymbol->type == Symbol_Function)
{ {

View File

@ -11,7 +11,7 @@ void Image::Map(const std::string_view& name, size_t base, uint32_t size, uint8_
const void* Image::Find(size_t address) const const void* Image::Find(size_t address) const
{ {
const auto section = sections.find(address); const auto section = sections.lower_bound(address);
if (section == sections.end()) if (section == sections.end())
{ {
return nullptr; return nullptr;

View File

@ -39,7 +39,7 @@ struct SectionComparer
bool operator()(const Section& lhs, size_t rhs) const bool operator()(const Section& lhs, size_t rhs) const
{ {
return rhs > lhs.base + lhs.size; return lhs.base < rhs;
} }
bool operator()(size_t lhs, const Section& rhs) const bool operator()(size_t lhs, const Section& rhs) const
@ -49,6 +49,6 @@ struct SectionComparer
bool operator()(const Section& lhs, const Section& rhs) const bool operator()(const Section& lhs, const Section& rhs) const
{ {
return (lhs.base + lhs.size) < rhs.base; return lhs.base < rhs.base;
} }
}; };

View File

@ -101,12 +101,13 @@ Image Xex2LoadImage(const uint8_t* data)
auto originalThunk = (XEX_THUNK_DATA*)image.Find(descriptors[im].FirstThunk); auto originalThunk = (XEX_THUNK_DATA*)image.Find(descriptors[im].FirstThunk);
auto thunkType = originalThunk->Function >> 24; auto thunkType = originalThunk->Function >> 24;
if (thunkType == 1) if (thunkType != 0)
{ {
uint32_t thunk[4] = { 0x00000060, 0x00000060, 0x00000060, 0x2000804E }; uint32_t thunk[4] = { 0x00000060, 0x00000060, 0x00000060, 0x2000804E };
memcpy(originalThunk, thunk, sizeof(thunk)); memcpy(originalThunk, thunk, sizeof(thunk));
} }
} }
library = (XEX_IMPORT_LIBRARY*)((char*)(library + 1) + library->NumberOfImports * sizeof(XEX_IMPORT_DESCRIPTOR));
} }
} }