20 void exec(
const ptr32_t basePc,
const uint8_t* code,
size_t len);
22 template<
class R,
class...Args>
24 register_stdcall_inner(addr, [callback](
Cpu32& cpu32) {
25 cpu32.callExternal<R,Args...>(callback);
29 template<
class R,
class...Args>
31 register_stdcall_inner(addr, [callback](
Cpu32& cpu32) {
32 cpu32.stack.push_back(cpu32.ecx);
33 cpu32.callExternal<R,Args...>(callback);
37 template<
class R,
class...Args>
39 register_stdcall_inner(addr, [callback](
Cpu32& cpu32) {
40 cpu32.callExternal<R,Args...>(callback);
62 std::vector<uint32_t> stack;
68 std::unordered_map<
ptr32_t, std::function<void(
Cpu32&)>> stdcall_Overrides;
70 bool exec1Byte(
const ptr32_t basePc,
ptr32_t& pc,
const uint8_t* code,
size_t len);
71 bool exec2Byte(
const ptr32_t basePc,
ptr32_t& pc,
const uint8_t* code,
size_t len);
72 bool exec3Byte(
const ptr32_t basePc,
ptr32_t& pc,
const uint8_t* code,
size_t len);
74 uint8_t readUInt8 (
const uint8_t* code,
size_t offset,
size_t len);
75 uint16_t readUInt16(
const uint8_t* code,
size_t offset,
size_t len);
76 uint32_t readUInt24(
const uint8_t* code,
size_t offset,
size_t len);
77 uint32_t readUInt32(
const uint8_t* code,
size_t offset,
size_t len);
79 void register_stdcall_inner(
ptr32_t addr, std::function<
void(
Cpu32&)> f);
81 void callFunction(
ptr32_t addr);
83 template<
class R,
class...Args>
84 void callExternal(
const std::function<R(Args...)>& callback) {
85 auto v = std::make_tuple(this->pop<Args>()...);
86 if constexpr(std::is_same<void,R>::value) {
87 std::apply(callback, std::move(v));
89 auto r = std::apply(callback, std::move(v));
90 this->eax = uint32_t(r);
97 std::string popString();
101inline int32_t Cpu32::pop<int>() {
104 auto ret = stack.back();
113 auto ret = stack.back();
119inline std::string Cpu32::pop<std::string>() {
void exec(const ptr32_t basePc, const uint8_t *code, size_t len)
void register_cdecl(ptr32_t addr, const std::function< R(Args...)> &callback)
void register_cdecl(ptr32_t addr, const T &cb)
void register_stdcall(ptr32_t addr, const std::function< R(Args...)> &callback)
Compatibility::ptr32_t ptr32_t
void register_stdcall(ptr32_t addr, const T &cb)
void register_thiscall(ptr32_t addr, const std::function< R(Args...)> &callback)
void register_thiscall(ptr32_t addr, const T &cb)