| 1614 | } |
| 1615 | |
| 1616 | static ptrdiff_t SEH_SerializeToArray(void* bodyObj, uint8_t* buf, uint64_t expectedSize) { |
| 1617 | if (expectedSize > (uint64_t)INT_MAX) { |
| 1618 | LOG("[VtHook] SerializeToArray size %llu exceeds INT_MAX, rejecting", expectedSize); |
| 1619 | return -1; |
| 1620 | } |
| 1621 | |
| 1622 | __try { |
| 1623 | uintptr_t bufAddr = reinterpret_cast<uintptr_t>(buf); |
| 1624 | uintptr_t result = g_serializeToArray(bodyObj, buf, (int)expectedSize); |
| 1625 | if (!result) return -1; |
| 1626 | |
| 1627 | if (g_detectedSteamVersion.load(std::memory_order_relaxed) >= 1778281814ULL) { |
| 1628 | if ((result & 0xFF) != 0) return (ptrdiff_t)expectedSize; |
| 1629 | return -1; |
| 1630 | } |
| 1631 | |
| 1632 | if (result >= bufAddr && result <= bufAddr + expectedSize) { |
| 1633 | return static_cast<ptrdiff_t>(result - bufAddr); |
| 1634 | } |
| 1635 | |
| 1636 | if ((result & 0xFF) != 0) { |
| 1637 | return (ptrdiff_t)expectedSize; |
| 1638 | } |
| 1639 | |
| 1640 | if (result < bufAddr) { |
| 1641 | LOG("[VtHook] SerializeToArray returned invalid end pointer %p (buf=%p)", |
| 1642 | (void*)result, (void*)bufAddr); |
| 1643 | return -1; |
| 1644 | } |
| 1645 | |
| 1646 | LOG("[VtHook] SerializeToArray returned invalid end pointer %p (buf=%p)", |
| 1647 | (void*)result, (void*)bufAddr); |
| 1648 | return -1; |
| 1649 | } __except(EXCEPTION_EXECUTE_HANDLER) { |
| 1650 | LOG("[VtHook] EXCEPTION in SerializeToArray: code=0x%08X", GetExceptionCode()); |
| 1651 | return -1; |
| 1652 | } |
| 1653 | } |
| 1654 | |
| 1655 | static std::vector<uint8_t> SerializeBodyToBytes(void* bodyObj) { |
| 1656 | if (!bodyObj || !g_serializeToArray) return {}; |
no outgoing calls
no test coverage detected