1#include "ut/preprocessor.h"
3namespace hedgedev::csl::
mem
41 return in_address && read<uint8_t>(in_address) == 0x90;
51 const auto b0 = read<uint8_t>(in_address);
52 const auto b1 = read<uint8_t>(
reinterpret_cast<uint8_t*>(in_address) + 1);
54 if ((b0 & 0xF0) == 0x70 || b0 == 0x0F)
62 result.opcode_length = 2;
63 result.instr_length = 6;
69 result.opcode_length = 1;
70 result.instr_length = 2;
80 result.opcode_length = 6;
81 result.instr_length = 14;
83 result.opcode_length = 2;
84 result.instr_length = 6;
91 result.opcode_length = 1;
92 result.instr_length = 2;
98 result.opcode_length = 1;
99 result.instr_length = 5;
103 const auto imm_offset = uintptr_t(in_address) + result.opcode_length;
107 switch (result.distance)
110 rva = *
reinterpret_cast<int8_t*>(imm_offset);
114 rva = *
reinterpret_cast<int32_t*>(imm_offset);
118 result.destination =
reinterpret_cast<
void*>(*
reinterpret_cast<uintptr_t*>(imm_offset));
122 result.destination =
reinterpret_cast<
void*>(uintptr_t(in_address) + rva + result.instr_length);
127 template <
typename T>
133 return reinterpret_cast<
void*>((uintptr_t(in_address) + *
reinterpret_cast<T*>(uintptr_t(in_address) + in_offset)) + in_stride);
138 return read_jump(in_address);
143 return get_branch_info(in_address).destination;
146 inline bool write_call(
void* in_address,
void* in_destination)
148 return write_jump(in_address, in_destination,
true);
151 inline bool write_jump(
void* in_address,
void* in_destination,
bool in_isCall)
156 const auto rva = ptrdiff_t(in_destination) - ptrdiff_t(in_address);
158 if (rva - 2 <= 0x7F && !in_isCall)
161 ASSERT_RETURN_FALSE(write<int8_t>(
reinterpret_cast<uint8_t*>(in_address) + 1, int8_t(rva - 2)));
165 if (rva - 5 <= 0x7FFFFFFF)
168 ASSERT_RETURN_FALSE(write<int32_t>(
reinterpret_cast<uint8_t*>(in_address) + 1, int32_t(rva - 5)));
173 ASSERT_RETURN_FALSE(write<uint8_t>(
reinterpret_cast<uint8_t*>(in_address) + 1, in_isCall ? 0x15 : 0x25));
175 ASSERT_RETURN_FALSE(write<uint32_t>(
reinterpret_cast<uint8_t*>(in_address) + 2, 0));
177 const ptrdiff_t imm_offset = 6;
179 const ptrdiff_t imm_offset = 2;
181 ASSERT_RETURN_FALSE(write<uintptr_t>(
reinterpret_cast<uint8_t*>(in_address) + imm_offset, uintptr_t(in_destination)));
188 inline bool write_nop(
void* in_address, size_t in_count)
190 return write<uint8_t>(in_address, 0x90, in_count);
void * read_jump(void *in_address)
Definition mem_x86.inl:141
void * read_call(void *in_address)
Definition mem_x86.inl:136
void * read_instr_address(void *in_address, ptrdiff_t in_offset, size_t in_stride)
Definition mem_x86.inl:128
branch_info get_branch_info(void *in_address)
Definition mem_x86.inl:44
bool write_jump(void *in_address, void *in_destination, bool in_call=false)
Definition mem_x86.inl:151
branch_distance
Definition mem_x86.inl:13
@ near_branch
Definition mem_x86.inl:15
@ short_branch
Definition mem_x86.inl:14
@ far_branch
Definition mem_x86.inl:16
bool write_nop(void *in_address, size_t in_count=1)
Definition mem_x86.inl:188
bool is_nop(void *in_address)
Definition mem_x86.inl:39
bool write_call(void *in_address, void *in_destination)
Definition mem_x86.inl:146
branch_condition
Definition mem_x86.inl:20
@ sign
Definition mem_x86.inl:29
@ overflow
Definition mem_x86.inl:21
@ equal
Definition mem_x86.inl:25
@ above
Definition mem_x86.inl:28
@ not_below
Definition mem_x86.inl:24
@ below
Definition mem_x86.inl:23
@ greater
Definition mem_x86.inl:36
@ not_equal
Definition mem_x86.inl:26
@ parity
Definition mem_x86.inl:31
@ not_parity
Definition mem_x86.inl:32
@ not_greater
Definition mem_x86.inl:35
@ not_overflow
Definition mem_x86.inl:22
@ not_less
Definition mem_x86.inl:34
@ less
Definition mem_x86.inl:33
@ below_or_equal
Definition mem_x86.inl:27
@ not_sign
Definition mem_x86.inl:30
branch_type
Definition mem_x86.inl:6
@ call
Definition mem_x86.inl:9
@ conditional
Definition mem_x86.inl:7
@ jump
Definition mem_x86.inl:8
#define ASSERT_RETURN_FALSE(CONDITION)
Definition preprocessor.h:33