relative.h 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. #pragma once
  2. #include <cstddef>
  3. #include <cstdint>
  4. #include "memory.h"
  5. namespace sunrise::client::content::items::details::relative {
  6. /**
  7. * Finds one optional self-relative definition member.
  8. * @param source Installed item-detail source.
  9. * @param definition Loaded item definition address.
  10. * @param memberOffset Byte offset of the signed relative member.
  11. * @param present Receives whether the relative member is nonzero.
  12. * @param block Receives the block address when present.
  13. * @return True when the member reads and any nonzero offset is safe.
  14. */
  15. [[nodiscard]] inline bool resolve_block(const investment::Source& source,
  16. std::uintptr_t definition,
  17. std::size_t memberOffset,
  18. bool& present,
  19. std::uintptr_t& block) noexcept {
  20. present = false;
  21. block = 0;
  22. std::int64_t displacement = 0;
  23. std::uintptr_t memberAddress = 0;
  24. if (!memory::member_address(definition, memberOffset, memberAddress)
  25. || !memory::read_value(source, memberAddress, displacement)) {
  26. return false;
  27. }
  28. if (displacement == 0) {
  29. return true;
  30. }
  31. present = true;
  32. return memory::add_signed_fits(memberAddress, displacement, block);
  33. }
  34. } // namespace sunrise::client::content::items::details::relative