From e175a7db5c3fb55b777e77043658530149f7f68b Mon Sep 17 00:00:00 2001 From: Pavol Marko Date: Sun, 1 May 2005 18:04:18 +0000 Subject: [PATCH] Fixes --HG-- extra : convert_revision : svn%3Ac2935e3e-5518-0410-8daf-afa5dab7d4e3/trunk%4051 --- sourcehook/generate/sourcehook.hxx | 14 ++ sourcehook/sh_memory.h | 4 +- sourcehook/sourcehook.cpp | 7 +- sourcehook/sourcehook.h | 238 +++++++++++++++++++++++++++++ sourcehook/test/Makefile | 2 +- sourcehook/test/main.cpp | 4 + sourcehook/test/testevents.h | 4 + 7 files changed, 268 insertions(+), 5 deletions(-) diff --git a/sourcehook/generate/sourcehook.hxx b/sourcehook/generate/sourcehook.hxx index b1da7e1..c37061c 100755 --- a/sourcehook/generate/sourcehook.hxx +++ b/sourcehook/generate/sourcehook.hxx @@ -699,6 +699,20 @@ SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(@Param%%|, @)const) return SourceHook::ExecutableClass, RetType, RetType (X::*)(@Param%%|, @) const>(ptr, mfp); } +template +SourceHook::ExecutableClass, RetType, RetType (X::*)(@Param%%|, @@, @...)> +SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(@Param%%|, @@, @...)) +{ + return SourceHook::ExecutableClass, RetType, RetType (X::*)(@Param%%|, @@, @...)>(ptr, mfp); +} + +template +SourceHook::ExecutableClass, RetType, RetType (X::*)(@Param%%|, @@, @...) const> +SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(@Param%%|, @@, @...)const) +{ + return SourceHook::ExecutableClass, RetType, RetType (X::*)(@Param%%|, @@, @...) const>(ptr, mfp); +} + @ENDARGS@ #undef SH_MAKE_EXECUTABLECLASS_BODY diff --git a/sourcehook/sh_memory.h b/sourcehook/sh_memory.h index 41659a2..04d9644 100644 --- a/sourcehook/sh_memory.h +++ b/sourcehook/sh_memory.h @@ -35,7 +35,7 @@ // We need to align addr down to pagesize on linux // We assume PAGESIZE is a power of two # define SH_LALIGN(x) (void*)((int)(x) & ~(PAGESIZE-1)) - +# define SH_LALDIF(x) ((int)(x) & (PAGESIZE-1)) # else # error Unsupported OS/Compiler # endif @@ -46,7 +46,7 @@ namespace SourceHook inline bool SetMemAccess(void *addr, size_t len, int access) { # ifdef __linux__ - return mprotect(SH_LALIGN(addr), len, access)==0 ? true : false; + return mprotect(SH_LALIGN(addr), len + SH_LALDIF(addr), access)==0 ? true : false; # else DWORD tmp; DWORD prot; diff --git a/sourcehook/sourcehook.cpp b/sourcehook/sourcehook.cpp index e5375d0..f878569 100644 --- a/sourcehook/sourcehook.cpp +++ b/sourcehook/sourcehook.cpp @@ -209,12 +209,15 @@ namespace SourceHook HookManagerInfo::VfnPtr vfp; vfp.vfnptr = cur_vfnptr; vfp.orig_entry = *reinterpret_cast(cur_vfnptr); - hookman->vfnptrs.push_back(vfp); // Alter vtable entry - SetMemAccess(cur_vtptr, sizeof(void*) * (tmp.vtbl_idx + 1), SH_MEM_READ | SH_MEM_WRITE); + if (!SetMemAccess(cur_vtptr, sizeof(void*) * (tmp.vtbl_idx + 1), SH_MEM_READ | SH_MEM_WRITE)) + return false; + *reinterpret_cast(cur_vfnptr) = *reinterpret_cast(hookman->hookfunc_vfnptr); + hookman->vfnptrs.push_back(vfp); + // Make vfnptr_iter point to the new element vfnptr_iter = hookman->vfnptrs.end(); --vfnptr_iter; diff --git a/sourcehook/sourcehook.h b/sourcehook/sourcehook.h index f7cd29f..b251d9f 100644 --- a/sourcehook/sourcehook.h +++ b/sourcehook/sourcehook.h @@ -1574,6 +1574,20 @@ SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)()const) return SourceHook::ExecutableClass, RetType, RetType (X::*)() const>(ptr, mfp); } +template +SourceHook::ExecutableClass, RetType, RetType (X::*)(...)> +SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(...)) +{ + return SourceHook::ExecutableClass, RetType, RetType (X::*)(...)>(ptr, mfp); +} + +template +SourceHook::ExecutableClass, RetType, RetType (X::*)(...) const> +SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(...)const) +{ + return SourceHook::ExecutableClass, RetType, RetType (X::*)(...) const>(ptr, mfp); +} + // Support for 1 arguments template SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1)> @@ -1589,6 +1603,20 @@ SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(Param1)const) return SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1) const>(ptr, mfp); } +template +SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, ...)> +SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(Param1, ...)) +{ + return SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, ...)>(ptr, mfp); +} + +template +SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, ...) const> +SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(Param1, ...)const) +{ + return SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, ...) const>(ptr, mfp); +} + // Support for 2 arguments template SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2)> @@ -1604,6 +1632,20 @@ SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(Param1, Param2)const) return SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2) const>(ptr, mfp); } +template +SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, ...)> +SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(Param1, Param2, ...)) +{ + return SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, ...)>(ptr, mfp); +} + +template +SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, ...) const> +SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(Param1, Param2, ...)const) +{ + return SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, ...) const>(ptr, mfp); +} + // Support for 3 arguments template SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3)> @@ -1619,6 +1661,20 @@ SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3)c return SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3) const>(ptr, mfp); } +template +SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, ...)> +SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, ...)) +{ + return SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, ...)>(ptr, mfp); +} + +template +SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, ...) const> +SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, ...)const) +{ + return SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, ...) const>(ptr, mfp); +} + // Support for 4 arguments template SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4)> @@ -1634,6 +1690,20 @@ SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, return SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4) const>(ptr, mfp); } +template +SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, ...)> +SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, ...)) +{ + return SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, ...)>(ptr, mfp); +} + +template +SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, ...) const> +SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, ...)const) +{ + return SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, ...) const>(ptr, mfp); +} + // Support for 5 arguments template SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5)> @@ -1649,6 +1719,20 @@ SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, return SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5) const>(ptr, mfp); } +template +SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, ...)> +SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, ...)) +{ + return SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, ...)>(ptr, mfp); +} + +template +SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, ...) const> +SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, ...)const) +{ + return SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, ...) const>(ptr, mfp); +} + // Support for 6 arguments template SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6)> @@ -1664,6 +1748,20 @@ SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, return SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6) const>(ptr, mfp); } +template +SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, ...)> +SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, ...)) +{ + return SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, ...)>(ptr, mfp); +} + +template +SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, ...) const> +SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, ...)const) +{ + return SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, ...) const>(ptr, mfp); +} + // Support for 7 arguments template SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7)> @@ -1679,6 +1777,20 @@ SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, return SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7) const>(ptr, mfp); } +template +SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, ...)> +SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, ...)) +{ + return SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, ...)>(ptr, mfp); +} + +template +SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, ...) const> +SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, ...)const) +{ + return SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, ...) const>(ptr, mfp); +} + // Support for 8 arguments template SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8)> @@ -1694,6 +1806,20 @@ SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, return SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8) const>(ptr, mfp); } +template +SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, ...)> +SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, ...)) +{ + return SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, ...)>(ptr, mfp); +} + +template +SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, ...) const> +SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, ...)const) +{ + return SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, ...) const>(ptr, mfp); +} + // Support for 9 arguments template SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9)> @@ -1709,6 +1835,20 @@ SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, return SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9) const>(ptr, mfp); } +template +SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, ...)> +SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, ...)) +{ + return SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, ...)>(ptr, mfp); +} + +template +SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, ...) const> +SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, ...)const) +{ + return SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, ...) const>(ptr, mfp); +} + // Support for 10 arguments template SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)> @@ -1724,6 +1864,20 @@ SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, return SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10) const>(ptr, mfp); } +template +SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, ...)> +SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, ...)) +{ + return SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, ...)>(ptr, mfp); +} + +template +SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, ...) const> +SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, ...)const) +{ + return SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, ...) const>(ptr, mfp); +} + // Support for 11 arguments template SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11)> @@ -1739,6 +1893,20 @@ SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, return SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11) const>(ptr, mfp); } +template +SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, ...)> +SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, ...)) +{ + return SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, ...)>(ptr, mfp); +} + +template +SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, ...) const> +SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, ...)const) +{ + return SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, ...) const>(ptr, mfp); +} + // Support for 12 arguments template SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12)> @@ -1754,6 +1922,20 @@ SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, return SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12) const>(ptr, mfp); } +template +SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, ...)> +SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, ...)) +{ + return SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, ...)>(ptr, mfp); +} + +template +SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, ...) const> +SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, ...)const) +{ + return SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, ...) const>(ptr, mfp); +} + // Support for 13 arguments template SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13)> @@ -1769,6 +1951,20 @@ SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, return SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13) const>(ptr, mfp); } +template +SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, ...)> +SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, ...)) +{ + return SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, ...)>(ptr, mfp); +} + +template +SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, ...) const> +SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, ...)const) +{ + return SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, ...) const>(ptr, mfp); +} + // Support for 14 arguments template SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14)> @@ -1784,6 +1980,20 @@ SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, return SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14) const>(ptr, mfp); } +template +SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, ...)> +SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, ...)) +{ + return SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, ...)>(ptr, mfp); +} + +template +SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, ...) const> +SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, ...)const) +{ + return SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, ...) const>(ptr, mfp); +} + // Support for 15 arguments template SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15)> @@ -1799,6 +2009,20 @@ SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, return SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15) const>(ptr, mfp); } +template +SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, ...)> +SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, ...)) +{ + return SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, ...)>(ptr, mfp); +} + +template +SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, ...) const> +SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, ...)const) +{ + return SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, ...) const>(ptr, mfp); +} + // Support for 16 arguments template SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16)> @@ -1814,6 +2038,20 @@ SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, return SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16) const>(ptr, mfp); } +template +SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, ...)> +SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, ...)) +{ + return SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, ...)>(ptr, mfp); +} + +template +SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, ...) const> +SH_CALL(SourceHook::CallClass *ptr, RetType(X::*mfp)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, ...)const) +{ + return SourceHook::ExecutableClass, RetType, RetType (X::*)(Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15, Param16, ...) const>(ptr, mfp); +} + #undef SH_MAKE_EXECUTABLECLASS_BODY diff --git a/sourcehook/test/Makefile b/sourcehook/test/Makefile index 0cd9705..74087fa 100644 --- a/sourcehook/test/Makefile +++ b/sourcehook/test/Makefile @@ -1,5 +1,5 @@ CC=gcc -CCFLAGS=-c -I.. -DSH_DEBUG +CCFLAGS=-c -g -I.. -DSH_DEBUG test.bin: bin bin/main.o bin/test1.o bin/test2.o bin/sourcehook.o $(CC) bin/main.o bin/test1.o bin/test2.o bin/sourcehook.o -lstdc++ -o test.bin diff --git a/sourcehook/test/main.cpp b/sourcehook/test/main.cpp index e92d6ce..99e0259 100644 --- a/sourcehook/test/main.cpp +++ b/sourcehook/test/main.cpp @@ -8,6 +8,8 @@ using namespace std; +bool g_Verbose; + class Test { typedef bool (*TestProto)(std::string&); @@ -65,6 +67,8 @@ int main(int argc, char *argv[]) std::string error; int passed=0, failed=0; + g_Verbose = false; + Test::DoTests(); cout << "Press enter to continue" << endl; diff --git a/sourcehook/test/testevents.h b/sourcehook/test/testevents.h index 4006efa..3289e3a 100644 --- a/sourcehook/test/testevents.h +++ b/sourcehook/test/testevents.h @@ -3,6 +3,9 @@ #include #include +#include + +extern bool g_Verbose; namespace { @@ -70,6 +73,7 @@ namespace } } +//#define CHECK_STATES(mwah, myerr) if (!StatesOk mwah) { error=myerr; return false; } else if (g_Verbose) { std::cout << "No error: " << myerr << std::endl; } #define CHECK_STATES(mwah, myerr) if (!StatesOk mwah) { error=myerr; return false; } #define MAKE_STATE(name) struct name : State {};