From 00353e9a162763b5644cab0115bd82c177d1253e Mon Sep 17 00:00:00 2001 From: momo5502 Date: Thu, 17 Apr 2025 20:31:33 +0200 Subject: [PATCH] Fix argument adapters --- deps/unicorn | 2 +- .../unicorn-emulator/function_wrapper2.hpp | 53 +++++++++---------- 2 files changed, 27 insertions(+), 28 deletions(-) diff --git a/deps/unicorn b/deps/unicorn index 6011de1c..6f2156df 160000 --- a/deps/unicorn +++ b/deps/unicorn @@ -1 +1 @@ -Subproject commit 6011de1c1e31a4e4a10f4fe82a4ac063b71b55ed +Subproject commit 6f2156dfac3abad316a4f02bf609ec1bb700d02e diff --git a/src/backends/unicorn-emulator/function_wrapper2.hpp b/src/backends/unicorn-emulator/function_wrapper2.hpp index f9628bda..e7471580 100644 --- a/src/backends/unicorn-emulator/function_wrapper2.hpp +++ b/src/backends/unicorn-emulator/function_wrapper2.hpp @@ -5,28 +5,26 @@ #include -uint32_t resolve_indexed_argument_part(uint32_t* args, size_t& index) -{ - return args[index++]; -} - template -T resolve_indexed_argument_internal(uint32_t* args, size_t& index) +T resolve_indexed_argument_internal(size_t* args, size_t& index) { - const auto a1 = resolve_indexed_argument_part(args, index); + const auto a1 = args[index++]; - if(sizeof(T) <= sizeof(a1)) { - return (T)a1; + if constexpr (sizeof(T) <= sizeof(a1) || sizeof(size_t) > 4) + { + return (T)(a1); } + else + { + const auto a2 = args[index++]; - const auto a2 = resolve_indexed_argument_part(args, index); - - const auto arg = (a1 | ((uint64_t)a2 << 32)); - return (T)arg; + const auto arg = (a1 | (static_cast(a2) << 32)); + return (T)(arg); + } } template -T resolve_indexed_argument(uint32_t* args, size_t& index) +T resolve_indexed_argument(size_t* args, size_t& index) { auto arg = resolve_indexed_argument_internal(args, index); return arg; @@ -49,27 +47,28 @@ class function_wrapper2 : public utils::object c_function_type* get_c_function() const { - return (c_function_type*)(void*)+[](uint32_t a1, uint32_t a2, uint32_t a3, uint32_t a4,uint32_t a5,uint32_t a6,uint32_t a7,uint32_t a8,uint32_t a9,uint32_t a10,uint32_t a11,uint32_t a12)-> uint64_t { - - uint32_t real_args[] { - a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12 - }; + return (c_function_type*)(void*)+[](size_t a1, size_t a2, size_t a3, size_t a4, size_t a5, size_t a6, size_t a7, + size_t a8, size_t a9, size_t a10, size_t a11, size_t a12) -> uint64_t { + size_t real_args[]{a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12}; const auto lambda = +[](Args... args, user_data_pointer user_data) -> ReturnType { return (*static_cast(user_data))(std::forward(args)...); }; size_t index = 0; - std::tuple func_args{resolve_indexed_argument>>(real_args, index)..., resolve_indexed_argument(real_args, index)}; + std::tuple func_args{ + resolve_indexed_argument>>(real_args, index)..., + resolve_indexed_argument(real_args, index)}; - (void)index; + (void)index; - if constexpr(!std::is_void_v){ - return (uint64_t)std::apply(lambda, std::move(func_args)); - } - - std::apply(lambda, std::move(func_args)); - return 0; + if constexpr (!std::is_void_v) + { + return (uint64_t)std::apply(lambda, std::move(func_args)); + } + + std::apply(lambda, std::move(func_args)); + return 0; }; }