diff --git a/core/AMBuilder b/core/AMBuilder
index 471cecc..be83383 100644
--- a/core/AMBuilder
+++ b/core/AMBuilder
@@ -23,6 +23,10 @@ for i in MMS.sdkInfo:
'provider/provider_ep2.cpp',
'sourcehook/sourcehook.cpp',
'sourcehook/sourcehook_hookmangen.cpp',
+ 'sourcehook/sourcehook_impl_chookidman.cpp',
+ 'sourcehook/sourcehook_impl_chookmaninfo.cpp',
+ 'sourcehook/sourcehook_impl_cproto.cpp',
+ 'sourcehook/sourcehook_impl_cvfnptr.cpp',
'gamedll_bridge.cpp',
'vsp_bridge.cpp'
]
diff --git a/core/sourcehook/generate/sh_memfuncinfo.h b/core/sourcehook/generate/sh_memfuncinfo.h
index 8614d93..13c40a6 100644
--- a/core/sourcehook/generate/sh_memfuncinfo.h
+++ b/core/sourcehook/generate/sh_memfuncinfo.h
@@ -1,5 +1,5 @@
/* ======== SourceHook ========
-* Copyright (C) 2004-2008 Metamod:Source Development Team
+* Copyright (C) 2004-2010 Metamod:Source Development Team
* No warranties of any kind
*
* License: zlib/libpng
diff --git a/core/sourcehook/generate/sh_memfuncinfo.hxx b/core/sourcehook/generate/sh_memfuncinfo.hxx
index 19e6e1e..086a25d 100644
--- a/core/sourcehook/generate/sh_memfuncinfo.hxx
+++ b/core/sourcehook/generate/sh_memfuncinfo.hxx
@@ -1,5 +1,5 @@
/* ======== SourceHook ========
-* Copyright (C) 2004-2008 Metamod:Source Development Team
+* Copyright (C) 2004-2010 Metamod:Source Development Team
* No warranties of any kind
*
* License: zlib/libpng
diff --git a/core/sourcehook/generate/shworker.exe b/core/sourcehook/generate/shworker.exe
index a251da1..4362910 100644
Binary files a/core/sourcehook/generate/shworker.exe and b/core/sourcehook/generate/shworker.exe differ
diff --git a/core/sourcehook/generate/shworker/msvc9/shworker.sln b/core/sourcehook/generate/shworker/msvc9/shworker.sln
new file mode 100644
index 0000000..87f5ddc
--- /dev/null
+++ b/core/sourcehook/generate/shworker/msvc9/shworker.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "shworker", "shworker.vcproj", "{7CD76E64-A9DF-47DB-8A68-36297C67E557}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {7CD76E64-A9DF-47DB-8A68-36297C67E557}.Debug|Win32.ActiveCfg = Debug|Win32
+ {7CD76E64-A9DF-47DB-8A68-36297C67E557}.Debug|Win32.Build.0 = Debug|Win32
+ {7CD76E64-A9DF-47DB-8A68-36297C67E557}.Release|Win32.ActiveCfg = Release|Win32
+ {7CD76E64-A9DF-47DB-8A68-36297C67E557}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/core/sourcehook/generate/shworker/msvc9/shworker.vcproj b/core/sourcehook/generate/shworker/msvc9/shworker.vcproj
new file mode 100644
index 0000000..b174ea4
--- /dev/null
+++ b/core/sourcehook/generate/shworker/msvc9/shworker.vcproj
@@ -0,0 +1,207 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/core/sourcehook/generate/shworker/shworker.cpp b/core/sourcehook/generate/shworker/shworker.cpp
index be328ef..5e0047c 100644
--- a/core/sourcehook/generate/shworker/shworker.cpp
+++ b/core/sourcehook/generate/shworker/shworker.cpp
@@ -743,7 +743,7 @@ int main(int argc, const char **argv)
const char *action = argv[1];
- if (strcasecmp(action, "hopter") == 0)
+ if (stricmp(action, "hopter") == 0)
{
const char *filenamein = argv[2];
const char *filenameout = argv[3];
@@ -751,7 +751,7 @@ int main(int argc, const char **argv)
return action_hopter(argsnum, filenamein, filenameout);
}
- else if (strcasecmp(action, "iter") == 0)
+ else if (stricmp(action, "iter") == 0)
{
const char *filenamein = argv[2];
const char *filenameout = argv[3];
diff --git a/core/sourcehook/generate/sourcehook.h b/core/sourcehook/generate/sourcehook.h
index 275cdf4..ba28315 100644
--- a/core/sourcehook/generate/sourcehook.h
+++ b/core/sourcehook/generate/sourcehook.h
@@ -1,5 +1,5 @@
/* ======== SourceHook ========
-* Copyright (C) 2004-2008 Metamod:Source Development Team
+* Copyright (C) 2004-2010 Metamod:Source Development Team
* No warranties of any kind
*
* License: zlib/libpng
@@ -307,6 +307,20 @@ namespace SourceHook
};
};
+ template struct ReferenceUtil
+ {
+ typedef T plain_type;
+ typedef T* pointer_type;
+ typedef T& reference_type;
+ };
+
+ template struct ReferenceUtil
+ {
+ typedef T plain_type;
+ typedef T* pointer_type;
+ typedef T& reference_type;
+ };
+
struct IHookContext
{
virtual ISHDelegate *GetNext() = 0;
@@ -480,7 +494,7 @@ namespace SourceHook
* @return Override Return Pointer the hookfunc should use (may differ from overrideRetPtr
* when the hook func is being called as part of a recall
*/
- virtual IHookContext *SetupHookLoop(IHookManagerInfo *hi, void *vfnptr, void *thisptr, void **origentry,
+ virtual IHookContext *SetupHookLoop(IHookManagerInfo *hi, void *vfnptr, void *thisptr, void **origCallAddr,
META_RES *statusPtr, META_RES *prevResPtr, META_RES *curResPtr,
const void *origRetPtr, void *overrideRetPtr) = 0;
@@ -579,10 +593,14 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
// only call these from the hook handlers directly!
+#define MAKE_NOREF_VALUE(rettype) \
+ *reinterpret_cast< ::SourceHook::ReferenceUtil::pointer_type >(0)
+
// If a hook on a function which returns a reference does not want to specify a return value,
// it can use this macro.
// ONLY USE THIS WITH MRES_IGNORED AND MRES_HANDLED !!!
-#define RETURN_META_NOREF(result, rettype) do { SET_META_RESULT(result); return reinterpret_cast(*SH_GLOB_SHPTR); } while(0)
+#define RETURN_META_NOREF(result, rettype) \
+ RETURN_META_VALUE(result, MAKE_NOREF_VALUE(rettype))
// Why take a memfuncptr instead of iface and func when we have to deduce the iface anyway now?
// Well, without it, there'd be no way to specify which overloaded version we want in _VALUE
@@ -1163,7 +1181,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN0(hookname, rettype) \
@@ -1196,7 +1214,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN0_vafmt(hookname, rettype) \
@@ -1368,7 +1386,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN1(hookname, rettype, param1) \
@@ -1401,7 +1419,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN1_vafmt(hookname, rettype, param1) \
@@ -1573,7 +1591,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN2(hookname, rettype, param1, param2) \
@@ -1606,7 +1624,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN2_vafmt(hookname, rettype, param1, param2) \
@@ -1778,7 +1796,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN3(hookname, rettype, param1, param2, param3) \
@@ -1811,7 +1829,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN3_vafmt(hookname, rettype, param1, param2, param3) \
@@ -1983,7 +2001,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN4(hookname, rettype, param1, param2, param3, param4) \
@@ -2016,7 +2034,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN4_vafmt(hookname, rettype, param1, param2, param3, param4) \
@@ -2188,7 +2206,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN5(hookname, rettype, param1, param2, param3, param4, param5) \
@@ -2221,7 +2239,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN5_vafmt(hookname, rettype, param1, param2, param3, param4, param5) \
@@ -2393,7 +2411,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN6(hookname, rettype, param1, param2, param3, param4, param5, param6) \
@@ -2426,7 +2444,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN6_vafmt(hookname, rettype, param1, param2, param3, param4, param5, param6) \
@@ -2598,7 +2616,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN7(hookname, rettype, param1, param2, param3, param4, param5, param6, param7) \
@@ -2631,7 +2649,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN7_vafmt(hookname, rettype, param1, param2, param3, param4, param5, param6, param7) \
@@ -2803,7 +2821,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN8(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8) \
@@ -2836,7 +2854,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN8_vafmt(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8) \
@@ -3008,7 +3026,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN9(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9) \
@@ -3041,7 +3059,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN9_vafmt(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9) \
@@ -3213,7 +3231,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN10(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10) \
@@ -3246,7 +3264,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN10_vafmt(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10) \
@@ -3418,7 +3436,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN11(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11) \
@@ -3451,7 +3469,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN11_vafmt(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11) \
@@ -3623,7 +3641,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN12(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12) \
@@ -3656,7 +3674,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN12_vafmt(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12) \
@@ -3828,7 +3846,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN13(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13) \
@@ -3861,7 +3879,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN13_vafmt(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13) \
@@ -4033,7 +4051,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN14(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14) \
@@ -4066,7 +4084,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN14_vafmt(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14) \
@@ -4238,7 +4256,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN15(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15) \
@@ -4271,7 +4289,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN15_vafmt(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15) \
@@ -4443,7 +4461,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN16(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16) \
@@ -4476,7 +4494,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN16_vafmt(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16) \
@@ -6737,12 +6755,6 @@ SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Para
namespace SourceHook
{
- template
- void SetOverrideResult(ISourceHook *shptr, const RetType res)
- {
- *reinterpret_cast(shptr->GetOverrideRetPtr()) = res;
- }
-
// SetOverrideResult used to be implemented like this:
// SetOverrideResult(shptr, memfuncptr, return);
// normally the compiler can deduce the return type from memfuncptr, but (at least msvc8) failed when it was a reference
@@ -6767,6 +6779,14 @@ namespace SourceHook
}
};
+ // For manual hooks:
+ // The rettype is passed in manually
+ template
+ OverrideFunctor SetOverrideResult()
+ {
+ return OverrideFunctor();
+ }
+
template
OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)())
{
diff --git a/core/sourcehook/generate/sourcehook.hxx b/core/sourcehook/generate/sourcehook.hxx
index 60bf039..921942c 100755
--- a/core/sourcehook/generate/sourcehook.hxx
+++ b/core/sourcehook/generate/sourcehook.hxx
@@ -1,5 +1,5 @@
/* ======== SourceHook ========
-* Copyright (C) 2004-2008 Metamod:Source Development Team
+* Copyright (C) 2004-2010 Metamod:Source Development Team
* No warranties of any kind
*
* License: zlib/libpng
@@ -307,6 +307,20 @@ namespace SourceHook
};
};
+ template struct ReferenceUtil
+ {
+ typedef T plain_type;
+ typedef T* pointer_type;
+ typedef T& reference_type;
+ };
+
+ template struct ReferenceUtil
+ {
+ typedef T plain_type;
+ typedef T* pointer_type;
+ typedef T& reference_type;
+ };
+
struct IHookContext
{
virtual ISHDelegate *GetNext() = 0;
@@ -480,7 +494,7 @@ namespace SourceHook
* @return Override Return Pointer the hookfunc should use (may differ from overrideRetPtr
* when the hook func is being called as part of a recall
*/
- virtual IHookContext *SetupHookLoop(IHookManagerInfo *hi, void *vfnptr, void *thisptr, void **origentry,
+ virtual IHookContext *SetupHookLoop(IHookManagerInfo *hi, void *vfnptr, void *thisptr, void **origCallAddr,
META_RES *statusPtr, META_RES *prevResPtr, META_RES *curResPtr,
const void *origRetPtr, void *overrideRetPtr) = 0;
@@ -579,10 +593,14 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
// only call these from the hook handlers directly!
+#define MAKE_NOREF_VALUE(rettype) \
+ *reinterpret_cast< ::SourceHook::ReferenceUtil::pointer_type >(0)
+
// If a hook on a function which returns a reference does not want to specify a return value,
// it can use this macro.
// ONLY USE THIS WITH MRES_IGNORED AND MRES_HANDLED !!!
-#define RETURN_META_NOREF(result, rettype) do { SET_META_RESULT(result); return reinterpret_cast(*SH_GLOB_SHPTR); } while(0)
+#define RETURN_META_NOREF(result, rettype) \
+ RETURN_META_VALUE(result, MAKE_NOREF_VALUE(rettype))
// Why take a memfuncptr instead of iface and func when we have to deduce the iface anyway now?
// Well, without it, there'd be no way to specify which overloaded version we want in _VALUE
@@ -1163,7 +1181,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN$1(hookname, rettype@[$2,1,$1:, param$2@]) \
@@ -1196,7 +1214,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN$1_vafmt(hookname, rettype@[$2,1,$1:, param$2@]) \
@@ -1415,12 +1433,6 @@ SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(@[$2,1,$1|, :Param$2@]@[$1!=0:, @]..
namespace SourceHook
{
- template
- void SetOverrideResult(ISourceHook *shptr, const RetType res)
- {
- *reinterpret_cast(shptr->GetOverrideRetPtr()) = res;
- }
-
// SetOverrideResult used to be implemented like this:
// SetOverrideResult(shptr, memfuncptr, return);
// normally the compiler can deduce the return type from memfuncptr, but (at least msvc8) failed when it was a reference
@@ -1444,6 +1456,14 @@ namespace SourceHook
*reinterpret_cast::type *>(shptr->GetOverrideRetPtr()) = res;
}
};
+
+ // For manual hooks:
+ // The rettype is passed in manually
+ template
+ OverrideFunctor SetOverrideResult()
+ {
+ return OverrideFunctor();
+ }
@[$1,0,$a:
template
OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(@[$2,1,$1|, :Param$2@]))
diff --git a/core/sourcehook/sh_list.h b/core/sourcehook/sh_list.h
index 1e56b9d..21d57c0 100644
--- a/core/sourcehook/sh_list.h
+++ b/core/sourcehook/sh_list.h
@@ -1,5 +1,5 @@
/* ======== SourceMM ========
-* Copyright (C) 2004-2008 Metamod:Source Development Team
+* Copyright (C) 2004-2010 Metamod:Source Development Team
* No warranties of any kind
*
* License: zlib/libpng
diff --git a/core/sourcehook/sh_memfuncinfo.h b/core/sourcehook/sh_memfuncinfo.h
index 8614d93..13c40a6 100644
--- a/core/sourcehook/sh_memfuncinfo.h
+++ b/core/sourcehook/sh_memfuncinfo.h
@@ -1,5 +1,5 @@
/* ======== SourceHook ========
-* Copyright (C) 2004-2008 Metamod:Source Development Team
+* Copyright (C) 2004-2010 Metamod:Source Development Team
* No warranties of any kind
*
* License: zlib/libpng
diff --git a/core/sourcehook/sh_memory.h b/core/sourcehook/sh_memory.h
index f69d273..f3e03d0 100644
--- a/core/sourcehook/sh_memory.h
+++ b/core/sourcehook/sh_memory.h
@@ -1,5 +1,5 @@
/* ======== SourceHook ========
-* Copyright (C) 2004-2008 Metamod:Source Development Team
+* Copyright (C) 2004-2010 Metamod:Source Development Team
* No warranties of any kind
*
* License: zlib/libpng
diff --git a/core/sourcehook/sh_pagealloc.h b/core/sourcehook/sh_pagealloc.h
index 15400fc..0becac7 100644
--- a/core/sourcehook/sh_pagealloc.h
+++ b/core/sourcehook/sh_pagealloc.h
@@ -1,6 +1,9 @@
#ifndef __SH_PAGEALLOC_H__
#define __SH_PAGEALLOC_H__
+#include "sh_list.h"
+#include "sh_memory.h"
+
# if SH_XP == SH_XP_WINAPI
# include
# elif SH_XP == SH_XP_POSIX
@@ -53,6 +56,7 @@ namespace SourceHook
bool isolated; // may contain only one AU
size_t minAlignment;
AUList allocUnits;
+ bool isRE; // true: RE, otherwise: RW
void CheckGap(size_t gap_begin, size_t gap_end, size_t reqsize,
size_t &smallestgap_pos, size_t &smallestgap_size, size_t &outAlignBytes)
@@ -122,9 +126,11 @@ namespace SourceHook
void *alignedAUBegin = reinterpret_cast(
AUBegin + ((minAlignment - AUBegin % minAlignment) % minAlignment)
);
-
+
if (addr == alignedAUBegin)
{
+ DebugCleanMemory(reinterpret_cast(startPtr) + iter->begin_offset,
+ iter->size);
allocUnits.erase(iter);
return true;
}
@@ -133,6 +139,26 @@ namespace SourceHook
return false;
}
+ void DebugCleanMemory(unsigned char* start, size_t size)
+ {
+ bool wasRE = isRE;
+ if (isRE)
+ {
+ SetRW();
+ }
+
+ unsigned char* end = start + size;
+ for (unsigned char* p = start; p != end; ++p)
+ {
+ *p = 0xCC;
+ }
+
+ if (wasRE)
+ {
+ SetRE();
+ }
+ }
+
bool Contains(void *addr)
{
return addr >= startPtr && addr < reinterpret_cast(reinterpret_cast(startPtr) + size);
@@ -146,6 +172,18 @@ namespace SourceHook
VirtualFree(startPtr, 0, MEM_RELEASE);
#endif
}
+
+ void SetRE()
+ {
+ SetMemAccess(startPtr, size, SH_MEM_READ | SH_MEM_EXEC);
+ isRE = true;
+ }
+
+ void SetRW()
+ {
+ SetMemAccess(startPtr, size, SH_MEM_READ | SH_MEM_WRITE);
+ isRE = false;
+ }
};
typedef List ARList;
@@ -178,6 +216,7 @@ namespace SourceHook
if (newRegion.startPtr)
{
+ newRegion.SetRW();
m_Regions.push_back(newRegion);
return true;
}
@@ -210,7 +249,7 @@ namespace SourceHook
}
public:
- CPageAlloc(size_t minAlignment = 1 /* power of 2 */ ) : m_MinAlignment(minAlignment)
+ CPageAlloc(size_t minAlignment = 4 /* power of 2 */ ) : m_MinAlignment(minAlignment)
{
#if SH_XP == SH_XP_POSIX
m_PageSize = sysconf(_SC_PAGESIZE);
@@ -262,7 +301,7 @@ namespace SourceHook
{
if (iter->Contains(ptr))
{
- SetMemAccess(iter->startPtr, iter->size, SH_MEM_READ | SH_MEM_EXEC);
+ iter->SetRE();
break;
}
}
@@ -274,7 +313,7 @@ namespace SourceHook
{
if (iter->Contains(ptr))
{
- SetMemAccess(iter->startPtr, iter->size, SH_MEM_READ | SH_MEM_WRITE);
+ iter->SetRW();
break;
}
}
diff --git a/core/sourcehook/sh_stack.h b/core/sourcehook/sh_stack.h
index e6269e6..5322db2 100644
--- a/core/sourcehook/sh_stack.h
+++ b/core/sourcehook/sh_stack.h
@@ -1,5 +1,5 @@
/* ======== SourceMM ========
-* Copyright (C) 2004-2008 Metamod:Source Development Team
+* Copyright (C) 2004-2010 Metamod:Source Development Team
* No warranties of any kind
*
* License: zlib/libpng
diff --git a/core/sourcehook/sh_string.h b/core/sourcehook/sh_string.h
index 79f96b8..6d6a8a5 100755
--- a/core/sourcehook/sh_string.h
+++ b/core/sourcehook/sh_string.h
@@ -1,5 +1,5 @@
/* ======== SourceMM ========
-* Copyright (C) 2004-2008 Metamod:Source Development Team
+* Copyright (C) 2004-2010 Metamod:Source Development Team
* No warranties of any kind
*
* License: zlib/libpng
diff --git a/core/sourcehook/sh_tinyhash.h b/core/sourcehook/sh_tinyhash.h
index 67f3adf..60b919c 100644
--- a/core/sourcehook/sh_tinyhash.h
+++ b/core/sourcehook/sh_tinyhash.h
@@ -1,5 +1,5 @@
/* ======== SourceMM ========
-* Copyright (C) 2004-2008 Metamod:Source Development Team
+* Copyright (C) 2004-2010 Metamod:Source Development Team
* No warranties of any kind
*
* License: zlib/libpng
diff --git a/core/sourcehook/sourcehook.cpp b/core/sourcehook/sourcehook.cpp
index 8bb9035..58f8086 100644
--- a/core/sourcehook/sourcehook.cpp
+++ b/core/sourcehook/sourcehook.cpp
@@ -1,5 +1,5 @@
/* ======== SourceHook ========
-* Copyright (C) 2004-2008 Metamod:Source Development Team
+* Copyright (C) 2004-2010 Metamod:Source Development Team
* No warranties of any kind
*
* License: zlib/libpng
@@ -41,373 +41,33 @@ namespace SourceHook
namespace Impl
{
- //////////////////////////////////////////////////////////////////////////
- // CProto
- //////////////////////////////////////////////////////////////////////////
- void CProto::Fill(const ProtoInfo *pProto)
- {
- if (pProto == NULL)
- m_Version = -1;
-
- m_ParamsPassInfo.clear();
-
- if (pProto->paramsPassInfo[0].size == 0)
- {
- // Version 1
- m_Version = 0;
- m_Convention = pProto->convention;
- m_NumOfParams = pProto->numOfParams;
-
- m_RetPassInfo.size = pProto->retPassInfo.size;
- m_RetPassInfo.type = pProto->retPassInfo.type;
- m_RetPassInfo.flags = GetRealFlags(pProto->retPassInfo);
-
- m_RetPassInfo.pNormalCtor = NULL;
- m_RetPassInfo.pCopyCtor = NULL;
- m_RetPassInfo.pDtor = NULL;
- m_RetPassInfo.pAssignOperator = NULL;
-
-
- m_ParamsPassInfo.resize(pProto->numOfParams);
-
- for (int i = 1; i <= pProto->numOfParams; ++i)
- {
- m_ParamsPassInfo[i-1].size = pProto->paramsPassInfo[i].size;
- m_ParamsPassInfo[i-1].type = pProto->paramsPassInfo[i].type;
- m_ParamsPassInfo[i-1].flags = GetRealFlags(pProto->paramsPassInfo[i]);
-
- m_ParamsPassInfo[i-1].pNormalCtor = NULL;
- m_ParamsPassInfo[i-1].pCopyCtor = NULL;
- m_ParamsPassInfo[i-1].pDtor = NULL;
- m_ParamsPassInfo[i-1].pAssignOperator = NULL;
- }
- }
- else if (pProto->paramsPassInfo[0].size == 1)
- {
- // Version 2
- m_Version = 1;
- m_Convention = pProto->convention;
- m_NumOfParams = pProto->numOfParams;
-
- m_RetPassInfo.size = pProto->retPassInfo.size;
- m_RetPassInfo.type = pProto->retPassInfo.type;
- m_RetPassInfo.flags = pProto->retPassInfo.flags;
-
- m_RetPassInfo.pNormalCtor = pProto->retPassInfo2.pNormalCtor;
- m_RetPassInfo.pCopyCtor = pProto->retPassInfo2.pCopyCtor;
- m_RetPassInfo.pDtor = pProto->retPassInfo2.pDtor;
- m_RetPassInfo.pAssignOperator = pProto->retPassInfo2.pAssignOperator;
-
- m_ParamsPassInfo.resize(pProto->numOfParams);
-
- for (int i = 1; i <= pProto->numOfParams; ++i)
- {
- m_ParamsPassInfo[i-1].size = pProto->paramsPassInfo[i].size;
- m_ParamsPassInfo[i-1].type = pProto->paramsPassInfo[i].type;
- m_ParamsPassInfo[i-1].flags = pProto->paramsPassInfo[i].flags;
-
- m_ParamsPassInfo[i-1].pNormalCtor = pProto->paramsPassInfo2[i].pNormalCtor;
- m_ParamsPassInfo[i-1].pCopyCtor = pProto->paramsPassInfo2[i].pCopyCtor;
- m_ParamsPassInfo[i-1].pDtor = pProto->paramsPassInfo2[i].pDtor;
- m_ParamsPassInfo[i-1].pAssignOperator = pProto->paramsPassInfo2[i].pAssignOperator;
- }
- }
- else
- {
- // Unknown
- m_Version = -1;
- }
- }
-
- // Basic compat test
- // Other than this, we assume that the plugins know what they're doing
- bool CProto::operator == (const CProto &other) const
- {
- if (m_Version < 0 || other.GetVersion() < 0)
- return false;
-
- if (m_NumOfParams != other.GetNumOfParams())
- return false;
-
- if (m_Convention != ProtoInfo::CallConv_Unknown && other.GetConvention() != ProtoInfo::CallConv_Unknown &&
- m_Convention != other.GetConvention())
- return false;
-
- if (GetRealSize(GetRet()) != GetRealSize(other.GetRet()))
- return false;
-
- for (int i = 0; i < m_NumOfParams; ++i)
- {
- if (GetRealSize(GetParam(i)) != GetRealSize(other.GetParam(i)))
- return false;
- if (GetParam(i).type != PassInfo::PassType_Unknown && other.GetParam(i).type != PassInfo::PassType_Unknown)
- {
- if (GetParam(i).type != other.GetParam(i).type)
- return false;
- if (GetParam(i).flags != other.GetParam(i).flags)
- return false;
- }
- }
-
- return true;
- }
-
- bool CProto::ExactlyEqual(const CProto &other) const
- {
- if (m_Version != other.m_Version ||
- m_NumOfParams != other.m_NumOfParams ||
- m_Convention != other.m_Convention ||
- GetRet() != other.GetRet())
- {
- return false;
- }
-
- for (int i = 0; i < m_NumOfParams; ++i)
- {
- if(GetParam(i) != other.GetParam(i))
- return false;
- }
-
- return true;
- }
-
- //////////////////////////////////////////////////////////////////////////
- // CHookManager
- //////////////////////////////////////////////////////////////////////////
- void CHookManager::SetInfo(int hookman_version, int vtbloffs, int vtblidx,
- ProtoInfo *proto, void *hookfunc_vfnptr)
- {
- m_Version = hookman_version;
- m_VtblOffs = vtbloffs;
- m_VtblIdx = vtblidx;
- m_Proto = proto;
- m_HookfuncVfnptr = hookfunc_vfnptr;
- }
-
//////////////////////////////////////////////////////////////////////////
// CVfnPtrList
//////////////////////////////////////////////////////////////////////////
- CVfnPtr &CVfnPtrList::GetVfnPtr(void *vfnptr)
+ CVfnPtr *CVfnPtrList::GetVfnPtr(void *vfnptr)
{
iterator iter = find(vfnptr);
if (iter == end())
{
+ // No vfnptr info object found
+ // --> create a new one
CVfnPtr newVfnPtr(vfnptr);
- push_back(newVfnPtr);
-
- return back();
- }
- else
- {
- return *iter;
- }
- }
- //////////////////////////////////////////////////////////////////////////
- // CVfnPtr
- //////////////////////////////////////////////////////////////////////////
-
- void CVfnPtr::AddHookMan(CHookManager *pHookMan)
- {
- List::iterator iter;
-
- // Don't accept invalid hook managers
- if (!*pHookMan)
- return;
-
- // Check whether this hook manager already exists; if yes, ignore.
- iter = m_HookMans.find(pHookMan);
- if (iter != m_HookMans.end())
- return;
-
- // It doesn't -> add it. Add it to the end of its version group.
- for (iter = m_HookMans.begin(); iter != m_HookMans.end(); ++iter)
- {
- if ((*iter)->GetVersion() < pHookMan->GetVersion())
- break;
- }
-
- bool isBeginning = iter == m_HookMans.begin();
-
- m_HookMans.insert(iter, pHookMan);
-
- if (isBeginning)
- {
- pHookMan->IncrRef(this);
- if (m_HookMans.size() > 1)
+ if (newVfnPtr.Init())
{
- // If another hookman was used until now but this one is better
- // (which it is because it's the first -> it has a higher version)
- // -> switch!
+ push_back(newVfnPtr);
- List::iterator second = m_HookMans.begin();
- ++second;
-
- (*second)->DecrRef(this);
- }
-
- // Make sure that this vfnptr points at it
- Patch(pHookMan->GetHookFunc());
- }
- }
-
- bool CVfnPtr::HookManRemoved(CHookManager *pHookMan)
- {
- // Don't accept invalid hook managers
- if (!*pHookMan)
- return true;
-
- List::iterator iter = m_HookMans.find(pHookMan);
- if (iter == m_HookMans.end())
- return true; // Didn't exist here anyway
-
- if (iter == m_HookMans.begin())
- {
- // It is the first one!
- pHookMan->DecrRef(this);
- m_HookMans.erase(iter);
-
- if (m_HookMans.empty())
- return false; // No more hookmans -> let SH delete us
-
- // Activate second -> now first hookman
- m_HookMans.front()->IncrRef(this);
- Patch(m_HookMans.front()->GetHookFunc());
- }
- else
- {
- m_HookMans.erase(iter);
- }
- return true;
- }
-
- bool CVfnPtr::Patch(void *newValue)
- {
- if (!SetMemAccess(m_Ptr, sizeof(void*), SH_MEM_READ | SH_MEM_WRITE))
- {
- return false;
- }
-
- *reinterpret_cast(m_Ptr) = newValue;
-
- return true;
- }
-
- CIface &CVfnPtr::GetIface(void *iface)
- {
- List::iterator iter = m_IfaceList.find(iface);
- if (iter == m_IfaceList.end())
- {
- CIface newIface(iface);
- if (iface == NULL)
- {
- m_IfaceList.push_front(newIface);
- return m_IfaceList.front();
+ return &(back());
}
else
{
- m_IfaceList.push_back(newIface);
- return m_IfaceList.back();
+ // Initialization failed.
+ return NULL;
}
}
else
{
- return *iter;
- }
- }
-
- //////////////////////////////////////////////////////////////////////////
- // CHookIdManager
- //////////////////////////////////////////////////////////////////////////
- CHookIDManager::CHookIDManager()
- {
- }
-
- int CHookIDManager::New(const CProto &proto, int vtbl_offs, int vtbl_idx, void *vfnptr,
- void *adjustediface, Plugin plug, int thisptr_offs, ISHDelegate *handler, bool post)
- {
- Entry tmp(proto, vtbl_offs, vtbl_idx, vfnptr, adjustediface, plug, thisptr_offs, handler, post);
-
- size_t cursize = m_Entries.size();
- for (size_t i = 0; i < cursize; ++i)
- {
- if (m_Entries[i].isfree)
- {
- m_Entries[i] = tmp;
- return static_cast(i) + 1;
- }
- }
-
- m_Entries.push_back(tmp);
- return static_cast(m_Entries.size()); // return size() because hookid = id+1 anyway
- }
-
- bool CHookIDManager::Remove(int hookid)
- {
- int realid = hookid - 1;
- if (realid < 0 || realid >= static_cast(m_Entries.size()) || m_Entries[realid].isfree)
- return false;
-
- m_Entries[realid].isfree = true;
-
- // :TODO: remove free ids from back sometimes ??
-
- return true;
- }
-
- const CHookIDManager::Entry * CHookIDManager::QueryHook(int hookid)
- {
- int realid = hookid - 1;
- if (realid < 0 || realid >= static_cast(m_Entries.size()) || m_Entries[realid].isfree)
- return NULL;
-
- return &m_Entries[realid];
- }
-
- void CHookIDManager::FindAllHooks(CVector &output, const CProto &proto, int vtbl_offs,
- int vtbl_idx, void *adjustediface, Plugin plug, int thisptr_offs, ISHDelegate *handler, bool post)
- {
- // oh my god, a lot of parameters...
- size_t cursize = m_Entries.size();
- for (size_t i = 0; i < cursize; ++i)
- {
- if (!m_Entries[i].isfree && m_Entries[i].proto == proto && m_Entries[i].vtbl_offs == vtbl_offs &&
- m_Entries[i].vtbl_idx == vtbl_idx && m_Entries[i].adjustediface == adjustediface && m_Entries[i].plug == plug &&
- m_Entries[i].thisptr_offs == thisptr_offs && m_Entries[i].handler->IsEqual(handler) && m_Entries[i].post == post)
- {
- output.push_back(static_cast(i) + 1);
- }
- }
- }
-
- void CHookIDManager::FindAllHooks(CVector &output)
- {
- size_t cursize = m_Entries.size();
- for (size_t i = 0; i < cursize; ++i)
- {
- if (!m_Entries[i].isfree)
- output.push_back(static_cast(i) + 1);
- }
- }
-
- void CHookIDManager::FindAllHooks(CVector &output, Plugin plug)
- {
- size_t cursize = m_Entries.size();
- for (size_t i = 0; i < cursize; ++i)
- {
- if (!m_Entries[i].isfree && m_Entries[i].plug == plug)
- output.push_back(static_cast(i) + 1);
- }
- }
-
-
- void CHookIDManager::RemoveAll(void *vfnptr)
- {
- size_t cursize = m_Entries.size();
- for (size_t i = 0; i < cursize; ++i)
- {
- if (!m_Entries[i].isfree && m_Entries[i].vfnptr == vfnptr)
- m_Entries[i].isfree = true;
+ return &(*iter);
}
}
@@ -480,9 +140,18 @@ namespace SourceHook
break;
}
- CVfnPtr &vfnPtr = m_VfnPtrs.GetVfnPtr(cur_vfnptr);
- vfnPtr.AddHookMan(m_HookManList.GetHookMan(hookManager));
- CIface &ifaceinst = vfnPtr.GetIface(adjustediface);
+ CVfnPtr *vfnPtr = m_VfnPtrs.GetVfnPtr(cur_vfnptr);
+ if (!vfnPtr)
+ {
+ // Could not create the vfnptr info object.
+ // This could be because a thunk generation on GCC
+ // has failed. See sourcehook_impl_cvfnptr.cpp
+ // for details.
+ return false;
+ }
+
+ vfnPtr->AddHookMan(m_HookManList.GetHookMan(hookManager));
+ CIface &ifaceinst = vfnPtr->GetIface(adjustediface);
// Add the hook
CHook hook(plug, thisptr_offs, handler,
@@ -588,9 +257,7 @@ namespace SourceHook
ctx_iter->VfnPtrRemoved(&(*vfnptr_iter));
}
- vfnptr_iter->Revert();
-
- m_VfnPtrs.erase(vfnptr_iter);
+ RevertAndRemoveVfnPtr(vfnptr_iter);
}
}
@@ -598,6 +265,52 @@ namespace SourceHook
return true;
}
+ List::iterator CSourceHookImpl::RevertAndRemoveVfnPtr(List::iterator vfnptr_iter)
+ {
+ ICleanupTask *cleanupTask = vfnptr_iter->GetCleanupTask();
+
+ // Some vfnptrs require cleanup.
+ // Concrete case: on GCC, when the original vtable entry is not even
+ // we generate an even-aligned thunk to call the original function.
+ // If the vfnptr is being removed from a pre hook on the vfnptr
+ // we have to delay the cleanup of this thunk until the hook loop is done
+ // (because the orig function call mechanism is going to use the thunk).
+
+ if (cleanupTask != NULL)
+ {
+ // If this vfnptr is in use in one of the hook loops running at the moment
+ // Schedule it for removal on the DEEPEST hook loop.
+
+ size_t numOfContexts = m_ContextStack.size();
+ // m_ContextStack.at(0) is the deepest hook context
+ // m_ContextStack.at(size-1) = m_ContextStack.front is the uppermost
+
+ bool cleanupImmedieately = true;
+
+ CVfnPtr *vfnPtrObjAddr = &(*vfnptr_iter);
+ for (size_t i = 0; i < numOfContexts; ++i)
+ {
+ CHookContext &context = m_ContextStack.at(i);
+ if (context.pVfnPtr == vfnPtrObjAddr)
+ {
+ // Found a hook context using this vfnptr at the moment.
+ context.m_CleanupTask = cleanupTask;
+ cleanupImmedieately = false; // Delay the cleanup
+ break;
+ }
+ }
+
+ if (cleanupImmedieately)
+ {
+ cleanupTask->CleanupAndDeleteThis();
+ }
+ }
+
+ // Do the work
+ vfnptr_iter->Revert();
+ return m_VfnPtrs.erase(vfnptr_iter);
+ }
+
void CSourceHookImpl::SetRes(META_RES res)
{
*m_ContextStack.front().pCurRes = res;
@@ -675,10 +388,9 @@ namespace SourceHook
// This vfnptr has no more hook managers
// and asks to be removed.
- vfnptr_iter->Revert();
-
m_HookIDMan.RemoveAll(vfnptr_iter->GetPtr());
- vfnptr_iter = m_VfnPtrs.erase(vfnptr_iter);
+
+ vfnptr_iter = RevertAndRemoveVfnPtr(vfnptr_iter);
}
else
{
@@ -710,7 +422,12 @@ namespace SourceHook
void CSourceHookImpl::ResetIgnoreHooks(void *vfnptr)
{
if (!m_ContextStack.empty() && m_ContextStack.front().m_State == CHookContext::State_Ignore)
- m_ContextStack.pop();
+ {
+ // Actually use EndContext
+ // instead of m_ContextStack.pop directly
+ // because it runs the cleanup task if neccesary
+ EndContext(&(m_ContextStack.front()));
+ }
}
void *CSourceHookImpl::GetOrigVfnPtrEntry(void *vfnptr)
@@ -753,7 +470,7 @@ namespace SourceHook
curCtx.m_State = CHookContext::State_Dead;
}
- IHookContext *CSourceHookImpl::SetupHookLoop(IHookManagerInfo *hi, void *vfnptr, void *thisptr, void **origentry, META_RES *statusPtr,
+ IHookContext *CSourceHookImpl::SetupHookLoop(IHookManagerInfo *hi, void *vfnptr, void *thisptr, void **origCallAddr, META_RES *statusPtr,
META_RES *prevResPtr, META_RES *curResPtr, const void *origRetPtr, void *overrideRetPtr)
{
CHookContext *pCtx = NULL;
@@ -781,7 +498,8 @@ namespace SourceHook
}
else
{
- *origentry = (*vfnptr_iter)->GetOrigEntry();
+ *origCallAddr = (*vfnptr_iter)->GetOrigCallAddr();
+ oldctx->pVfnPtr = *vfnptr_iter;
}
oldctx->pOrigRet = origRetPtr;
@@ -839,7 +557,7 @@ namespace SourceHook
else
{
pCtx->pVfnPtr = *vfnptr_iter;
- *origentry = pCtx->pVfnPtr->GetOrigEntry();
+ *origCallAddr = pCtx->pVfnPtr->GetOrigCallAddr();
pCtx->pIface = pCtx->pVfnPtr->FindIface(thisptr);
}
@@ -855,6 +573,9 @@ namespace SourceHook
void CSourceHookImpl::EndContext(IHookContext *pCtx)
{
+ // Do clean up task, if any is associated with this context
+ m_ContextStack.front().DoCleanupTaskAndDeleteIt();
+ // Then remove it
m_ContextStack.pop();
}
@@ -1085,9 +806,22 @@ namespace SourceHook
{
if (pVfnPtr == vfnptr)
{
- pVfnPtr = NULL;
+ // Don't set pVfnPtr = NULL here!
+ // It may be used still.
+ // RevertAndRemoveVfnPtr uses it to find the hook context
+ // to which to attach the cleanup task of the vfnptr.
+
+ //pVfnPtr = NULL;
m_State = State_Dead;
}
}
+
+ void CHookContext::DoCleanupTaskAndDeleteIt()
+ {
+ if (m_CleanupTask != NULL)
+ {
+ m_CleanupTask->CleanupAndDeleteThis();
+ }
+ }
}
}
diff --git a/core/sourcehook/sourcehook.h b/core/sourcehook/sourcehook.h
index 275cdf4..ba28315 100644
--- a/core/sourcehook/sourcehook.h
+++ b/core/sourcehook/sourcehook.h
@@ -1,5 +1,5 @@
/* ======== SourceHook ========
-* Copyright (C) 2004-2008 Metamod:Source Development Team
+* Copyright (C) 2004-2010 Metamod:Source Development Team
* No warranties of any kind
*
* License: zlib/libpng
@@ -307,6 +307,20 @@ namespace SourceHook
};
};
+ template struct ReferenceUtil
+ {
+ typedef T plain_type;
+ typedef T* pointer_type;
+ typedef T& reference_type;
+ };
+
+ template struct ReferenceUtil
+ {
+ typedef T plain_type;
+ typedef T* pointer_type;
+ typedef T& reference_type;
+ };
+
struct IHookContext
{
virtual ISHDelegate *GetNext() = 0;
@@ -480,7 +494,7 @@ namespace SourceHook
* @return Override Return Pointer the hookfunc should use (may differ from overrideRetPtr
* when the hook func is being called as part of a recall
*/
- virtual IHookContext *SetupHookLoop(IHookManagerInfo *hi, void *vfnptr, void *thisptr, void **origentry,
+ virtual IHookContext *SetupHookLoop(IHookManagerInfo *hi, void *vfnptr, void *thisptr, void **origCallAddr,
META_RES *statusPtr, META_RES *prevResPtr, META_RES *curResPtr,
const void *origRetPtr, void *overrideRetPtr) = 0;
@@ -579,10 +593,14 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
// only call these from the hook handlers directly!
+#define MAKE_NOREF_VALUE(rettype) \
+ *reinterpret_cast< ::SourceHook::ReferenceUtil::pointer_type >(0)
+
// If a hook on a function which returns a reference does not want to specify a return value,
// it can use this macro.
// ONLY USE THIS WITH MRES_IGNORED AND MRES_HANDLED !!!
-#define RETURN_META_NOREF(result, rettype) do { SET_META_RESULT(result); return reinterpret_cast(*SH_GLOB_SHPTR); } while(0)
+#define RETURN_META_NOREF(result, rettype) \
+ RETURN_META_VALUE(result, MAKE_NOREF_VALUE(rettype))
// Why take a memfuncptr instead of iface and func when we have to deduce the iface anyway now?
// Well, without it, there'd be no way to specify which overloaded version we want in _VALUE
@@ -1163,7 +1181,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN0(hookname, rettype) \
@@ -1196,7 +1214,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN0_vafmt(hookname, rettype) \
@@ -1368,7 +1386,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN1(hookname, rettype, param1) \
@@ -1401,7 +1419,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN1_vafmt(hookname, rettype, param1) \
@@ -1573,7 +1591,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN2(hookname, rettype, param1, param2) \
@@ -1606,7 +1624,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN2_vafmt(hookname, rettype, param1, param2) \
@@ -1778,7 +1796,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN3(hookname, rettype, param1, param2, param3) \
@@ -1811,7 +1829,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN3_vafmt(hookname, rettype, param1, param2, param3) \
@@ -1983,7 +2001,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN4(hookname, rettype, param1, param2, param3, param4) \
@@ -2016,7 +2034,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN4_vafmt(hookname, rettype, param1, param2, param3, param4) \
@@ -2188,7 +2206,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN5(hookname, rettype, param1, param2, param3, param4, param5) \
@@ -2221,7 +2239,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN5_vafmt(hookname, rettype, param1, param2, param3, param4, param5) \
@@ -2393,7 +2411,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN6(hookname, rettype, param1, param2, param3, param4, param5, param6) \
@@ -2426,7 +2444,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN6_vafmt(hookname, rettype, param1, param2, param3, param4, param5, param6) \
@@ -2598,7 +2616,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN7(hookname, rettype, param1, param2, param3, param4, param5, param6, param7) \
@@ -2631,7 +2649,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN7_vafmt(hookname, rettype, param1, param2, param3, param4, param5, param6, param7) \
@@ -2803,7 +2821,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN8(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8) \
@@ -2836,7 +2854,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN8_vafmt(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8) \
@@ -3008,7 +3026,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN9(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9) \
@@ -3041,7 +3059,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN9_vafmt(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9) \
@@ -3213,7 +3231,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN10(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10) \
@@ -3246,7 +3264,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN10_vafmt(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10) \
@@ -3418,7 +3436,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN11(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11) \
@@ -3451,7 +3469,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN11_vafmt(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11) \
@@ -3623,7 +3641,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN12(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12) \
@@ -3656,7 +3674,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN12_vafmt(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12) \
@@ -3828,7 +3846,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN13(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13) \
@@ -3861,7 +3879,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN13_vafmt(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13) \
@@ -4033,7 +4051,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN14(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14) \
@@ -4066,7 +4084,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p)
__SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \
void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \
{ \
- ::SourceHook::SetOverrideResult(shptr, value); \
+ ::SourceHook::SetOverrideResult()(shptr, value); \
}
#define SH_DECL_MANUALEXTERN14_vafmt(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14) \
@@ -4238,7 +4256,7 @@ SourceHook::CallClass