#ifndef __LIBRADHOOK_PRIVATE_DISASSEMBLE_H__ #define __LIBRADHOOK_PRIVATE_DISASSEMBLE_H__ #include "radhook/defines.h" #if defined(RADIUM_PLATFORM_WINDOWS) # ifndef WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN # endif # include #elif defined(RADIUM_PLATFORM_ANDROID) # include # include #endif #if defined(RADHOOK_ARCH_X64) struct X64Insn { size_t length = 0; bool ripRelative = false; size_t dispOffset = 0; bool relativeControlFlow = false; bool isReturn = false; bool isPadding = false; bool branchDisp = false; size_t branchDispOffset = 0; uint8_t branchDispSize = 0; bool valid = false; }; X64Insn DecodeX64( const uint8_t* p, size_t avail ); constexpr size_t kX64StubLen = 14; // FF25 00000000 + imm64 constexpr size_t kX64StubLenShort = 5; // E9 rel32 constexpr size_t kX64MaxStolen = 32; constexpr size_t kX64MaxRipFixups = 8; constexpr size_t kX64MaxBranchFixups = 8; enum class StolenBytesError { None, BadDecode, RelativeControlFlow, TooManyRipFixups, ExceedsMaxStolen, InsufficientLength, }; struct BranchFixup { size_t offset; size_t dispOffset; uint8_t dispSize; }; StolenBytesError BuildStolenBytesX64( const uint8_t* target, size_t minLen, uint8_t* outBytes, size_t& outLen, size_t* outRipOffsets, size_t& outRipCount, BranchFixup* outBranches, size_t& outBranchCount ); #endif // defined(RADHOOK_ARCH_X64) #endif // __LIBRADHOOK_PRIVATE_DISASSEMBLE_H__