mirror of
https://github.com/Laupetin/OpenAssetTools.git
synced 2025-06-07 21:38:01 -05:00
fix: try fixing alias resolving via redirection for x64 for real
This commit is contained in:
parent
f1a95997fe
commit
1697409cc2
@ -67,7 +67,8 @@ namespace
|
|||||||
m_pointer_byte_count(pointerBitCount / 8u),
|
m_pointer_byte_count(pointerBitCount / 8u),
|
||||||
m_block_mask((std::numeric_limits<uintptr_t>::max() >> (sizeof(uintptr_t) * 8 - blockBitCount)) << (pointerBitCount - blockBitCount)),
|
m_block_mask((std::numeric_limits<uintptr_t>::max() >> (sizeof(uintptr_t) * 8 - blockBitCount)) << (pointerBitCount - blockBitCount)),
|
||||||
m_block_shift(pointerBitCount - blockBitCount),
|
m_block_shift(pointerBitCount - blockBitCount),
|
||||||
m_offset_mask(std::numeric_limits<uintptr_t>::max() >> (sizeof(uintptr_t) * 8 - (pointerBitCount - blockBitCount)))
|
m_offset_mask(std::numeric_limits<uintptr_t>::max() >> (sizeof(uintptr_t) * 8 - (pointerBitCount - blockBitCount))),
|
||||||
|
m_alias_mask(1uz << (pointerBitCount - 1uz))
|
||||||
{
|
{
|
||||||
assert(pointerBitCount % 8u == 0u);
|
assert(pointerBitCount % 8u == 0u);
|
||||||
assert(insertBlock < static_cast<block_t>(blocks.size()));
|
assert(insertBlock < static_cast<block_t>(blocks.size()));
|
||||||
@ -294,7 +295,7 @@ namespace
|
|||||||
|
|
||||||
IncBlockPos(*m_insert_block, m_pointer_byte_count);
|
IncBlockPos(*m_insert_block, m_pointer_byte_count);
|
||||||
|
|
||||||
const auto newLookupIndex = static_cast<uintptr_t>(m_alias_lookup.size()) + 1;
|
const auto newLookupIndex = static_cast<uintptr_t>(m_alias_lookup.size()) | m_alias_mask;
|
||||||
m_alias_lookup.emplace_back(nullptr);
|
m_alias_lookup.emplace_back(nullptr);
|
||||||
|
|
||||||
std::memcpy(ptr, &newLookupIndex, m_pointer_byte_count);
|
std::memcpy(ptr, &newLookupIndex, m_pointer_byte_count);
|
||||||
@ -304,10 +305,13 @@ namespace
|
|||||||
|
|
||||||
void SetInsertedPointerAliasLookup(const uintptr_t lookupEntry, void* value) override
|
void SetInsertedPointerAliasLookup(const uintptr_t lookupEntry, void* value) override
|
||||||
{
|
{
|
||||||
assert(lookupEntry > 0);
|
assert(lookupEntry & m_alias_mask);
|
||||||
assert(lookupEntry <= m_alias_lookup.size());
|
|
||||||
|
|
||||||
m_alias_lookup[lookupEntry - 1] = value;
|
const auto aliasIndex = lookupEntry & ~m_alias_mask;
|
||||||
|
|
||||||
|
assert(aliasIndex < m_alias_lookup.size());
|
||||||
|
|
||||||
|
m_alias_lookup[aliasIndex] = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
void* ConvertOffsetToPointerNative(const void* offset) override
|
void* ConvertOffsetToPointerNative(const void* offset) override
|
||||||
@ -410,10 +414,23 @@ namespace
|
|||||||
|
|
||||||
if (lookupEntry == 0)
|
if (lookupEntry == 0)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
if (lookupEntry > m_pointer_redirect_lookup.size())
|
|
||||||
throw InvalidAliasLookupException(lookupEntry - 1, m_pointer_redirect_lookup.size());
|
|
||||||
|
|
||||||
return *m_pointer_redirect_lookup[lookupEntry - 1];
|
if (lookupEntry & m_alias_mask)
|
||||||
|
{
|
||||||
|
const auto aliasIndex = lookupEntry & ~m_alias_mask;
|
||||||
|
|
||||||
|
if (aliasIndex >= m_alias_lookup.size())
|
||||||
|
throw InvalidAliasLookupException(aliasIndex, m_alias_lookup.size());
|
||||||
|
|
||||||
|
return m_alias_lookup[aliasIndex];
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto redirectIndex = lookupEntry - 1;
|
||||||
|
|
||||||
|
if (redirectIndex >= m_pointer_redirect_lookup.size())
|
||||||
|
throw InvalidAliasLookupException(redirectIndex, m_pointer_redirect_lookup.size());
|
||||||
|
|
||||||
|
return *m_pointer_redirect_lookup[redirectIndex];
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -470,6 +487,7 @@ namespace
|
|||||||
std::vector<uint8_t> m_fill_buffer;
|
std::vector<uint8_t> m_fill_buffer;
|
||||||
std::vector<void**> m_pointer_redirect_lookup;
|
std::vector<void**> m_pointer_redirect_lookup;
|
||||||
std::vector<void*> m_alias_lookup;
|
std::vector<void*> m_alias_lookup;
|
||||||
|
size_t m_alias_mask;
|
||||||
};
|
};
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user