mirror of
https://github.com/alliedmodders/metamod-source.git
synced 2024-11-28 10:24:20 +01:00
More verbosity, gcc/linux/amd64 compatibility
--HG-- extra : convert_revision : svn%3Ac2935e3e-5518-0410-8daf-afa5dab7d4e3/trunk%4062
This commit is contained in:
parent
3c82560621
commit
9a5437c0f1
@ -54,16 +54,16 @@ namespace SourceHook
|
||||
|
||||
# if SH_COMP == SH_COMP_GCC
|
||||
|
||||
template<> struct MFI_Impl<8> // All of these have size==8
|
||||
template<> struct MFI_Impl<2*SH_PTRSIZE> // All of these have size==8/16
|
||||
{
|
||||
struct GCC_MemFunPtr
|
||||
{
|
||||
union
|
||||
{
|
||||
void *funcadr; // always even
|
||||
int vtable_index_plus1; // = vindex+1, always odd
|
||||
intptr_t vtable_index_plus1; // = vindex+1, always odd
|
||||
};
|
||||
int delta;
|
||||
intptr_t delta;
|
||||
};
|
||||
template<class MFP> static inline void GetFuncInfo(MFP mfp, MemFuncInfo &out)
|
||||
{
|
||||
@ -71,7 +71,7 @@ namespace SourceHook
|
||||
out.thisptroffs = mfp_detail->delta;
|
||||
if (mfp_detail->vtable_index_plus1 & 1)
|
||||
{
|
||||
out.vtblindex = (mfp_detail->vtable_index_plus1 - 1) / 4;
|
||||
out.vtblindex = (mfp_detail->vtable_index_plus1 - 1) / SH_PTRSIZE;
|
||||
out.vtbloffs = 0;
|
||||
out.isVirtual = true;
|
||||
}
|
||||
@ -147,7 +147,7 @@ namespace SourceHook
|
||||
}
|
||||
}
|
||||
|
||||
template<> struct MFI_Impl<4> // simple ones
|
||||
template<> struct MFI_Impl<1*SH_PTRSIZE> // simple ones
|
||||
{
|
||||
template<class MFP> static inline void GetFuncInfo(MFP mfp, MemFuncInfo &out)
|
||||
{
|
||||
@ -158,7 +158,7 @@ namespace SourceHook
|
||||
}
|
||||
};
|
||||
|
||||
template<> struct MFI_Impl<8> // more complicated ones!
|
||||
template<> struct MFI_Impl<2*SH_PTRSIZE> // more complicated ones!
|
||||
{
|
||||
struct MSVC_MemFunPtr2
|
||||
{
|
||||
@ -175,7 +175,7 @@ namespace SourceHook
|
||||
};
|
||||
|
||||
// By Don Clugston, adapted
|
||||
template<> struct MFI_Impl<12> // WOW IT"S GETTING BIGGER OMGOMOGMG
|
||||
template<> struct MFI_Impl<3*SH_PTRSIZE> // WOW IT"S GETTING BIGGER OMGOMOGMG
|
||||
{
|
||||
class __single_inheritance GenericClass;
|
||||
class GenericClass {};
|
||||
@ -228,7 +228,7 @@ namespace SourceHook
|
||||
// unknown_inheritance classes go here
|
||||
// This is probably the ugliest bit of code I've ever written. Look at the casts!
|
||||
// There is a compiler bug in MSVC6 which prevents it from using this code.
|
||||
template<> struct MFI_Impl<16> // THE BIGGEST ONE!!!1GABEN
|
||||
template<> struct MFI_Impl<4*SH_PTRSIZE> // THE BIGGEST ONE!!!1GABEN
|
||||
{
|
||||
template<class MFP> static inline void GetFuncInfo(MFP mfp, MemFuncInfo &out)
|
||||
{
|
||||
|
@ -63,6 +63,8 @@
|
||||
# define vsnprintf _vsnprintf
|
||||
#endif
|
||||
|
||||
#define SH_PTRSIZE sizeof(void*)
|
||||
|
||||
#include "FastDelegate.h"
|
||||
#include "sh_memfuncinfo.h"
|
||||
#include "sh_memory.h"
|
||||
@ -86,7 +88,7 @@ enum META_RES
|
||||
|
||||
namespace SourceHook
|
||||
{
|
||||
const int STRBUF_LEN=8192; // In bytes, for "vafmt" functions
|
||||
const int STRBUF_LEN=4096; // In bytes, for "vafmt" functions
|
||||
|
||||
/**
|
||||
* @brief An empty class. No inheritance used. Used for original-function-call hacks
|
||||
@ -677,6 +679,7 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// SH_CALL
|
||||
|
||||
#if SH_COMP == SH_COMP_MSVC
|
||||
|
||||
# define SH_MAKE_EXECUTABLECLASS_OB(call, prms) \
|
||||
{ \
|
||||
@ -699,6 +702,34 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C
|
||||
return (reinterpret_cast<EmptyClass*>(adjustedthisptr)->*u.mfpnew)call; \
|
||||
}
|
||||
|
||||
#elif SH_COMP == SH_COMP_GCC
|
||||
|
||||
# define SH_MAKE_EXECUTABLECLASS_OB(call, prms) \
|
||||
{ \
|
||||
using namespace ::SourceHook; \
|
||||
MemFuncInfo mfi; \
|
||||
GetFuncInfo(m_CC->ptr, m_MFP, mfi); \
|
||||
OrigVTables::const_iterator iter = m_CC->vt.find(mfi.thisptroffs + mfi.vtbloffs); \
|
||||
if (iter == m_CC->vt.end() || mfi.vtblindex >= (int)iter->second.size() || iter->second[mfi.vtblindex] == NULL) \
|
||||
return (m_CC->ptr->*m_MFP)call; \
|
||||
\
|
||||
/* It's hooked. Call the original function. */ \
|
||||
union \
|
||||
{ \
|
||||
RetType(EmptyClass::*mfpnew)prms; \
|
||||
struct \
|
||||
{ \
|
||||
void *addr; \
|
||||
intptr_t adjustor; \
|
||||
} s; \
|
||||
} u; \
|
||||
u.s.addr = iter->second[mfi.vtblindex]; \
|
||||
u.s.adjustor = mfi.thisptroffs; \
|
||||
\
|
||||
return (reinterpret_cast<EmptyClass*>(m_CC->ptr)->*u.mfpnew)call; \
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
namespace SourceHook
|
||||
{
|
||||
|
@ -54,16 +54,16 @@ namespace SourceHook
|
||||
|
||||
# if SH_COMP == SH_COMP_GCC
|
||||
|
||||
template<> struct MFI_Impl<8> // All of these have size==8
|
||||
template<> struct MFI_Impl<2*SH_PTRSIZE> // All of these have size==8/16
|
||||
{
|
||||
struct GCC_MemFunPtr
|
||||
{
|
||||
union
|
||||
{
|
||||
void *funcadr; // always even
|
||||
int vtable_index_plus1; // = vindex+1, always odd
|
||||
intptr_t vtable_index_plus1; // = vindex+1, always odd
|
||||
};
|
||||
int delta;
|
||||
intptr_t delta;
|
||||
};
|
||||
template<class MFP> static inline void GetFuncInfo(MFP mfp, MemFuncInfo &out)
|
||||
{
|
||||
@ -71,7 +71,7 @@ namespace SourceHook
|
||||
out.thisptroffs = mfp_detail->delta;
|
||||
if (mfp_detail->vtable_index_plus1 & 1)
|
||||
{
|
||||
out.vtblindex = (mfp_detail->vtable_index_plus1 - 1) / 4;
|
||||
out.vtblindex = (mfp_detail->vtable_index_plus1 - 1) / SH_PTRSIZE;
|
||||
out.vtbloffs = 0;
|
||||
out.isVirtual = true;
|
||||
}
|
||||
@ -147,7 +147,7 @@ namespace SourceHook
|
||||
}
|
||||
}
|
||||
|
||||
template<> struct MFI_Impl<4> // simple ones
|
||||
template<> struct MFI_Impl<1*SH_PTRSIZE> // simple ones
|
||||
{
|
||||
template<class MFP> static inline void GetFuncInfo(MFP mfp, MemFuncInfo &out)
|
||||
{
|
||||
@ -158,7 +158,7 @@ namespace SourceHook
|
||||
}
|
||||
};
|
||||
|
||||
template<> struct MFI_Impl<8> // more complicated ones!
|
||||
template<> struct MFI_Impl<2*SH_PTRSIZE> // more complicated ones!
|
||||
{
|
||||
struct MSVC_MemFunPtr2
|
||||
{
|
||||
@ -175,7 +175,7 @@ namespace SourceHook
|
||||
};
|
||||
|
||||
// By Don Clugston, adapted
|
||||
template<> struct MFI_Impl<12> // WOW IT"S GETTING BIGGER OMGOMOGMG
|
||||
template<> struct MFI_Impl<3*SH_PTRSIZE> // WOW IT"S GETTING BIGGER OMGOMOGMG
|
||||
{
|
||||
class __single_inheritance GenericClass;
|
||||
class GenericClass {};
|
||||
@ -228,7 +228,7 @@ namespace SourceHook
|
||||
// unknown_inheritance classes go here
|
||||
// This is probably the ugliest bit of code I've ever written. Look at the casts!
|
||||
// There is a compiler bug in MSVC6 which prevents it from using this code.
|
||||
template<> struct MFI_Impl<16> // THE BIGGEST ONE!!!1GABEN
|
||||
template<> struct MFI_Impl<4*SH_PTRSIZE> // THE BIGGEST ONE!!!1GABEN
|
||||
{
|
||||
template<class MFP> static inline void GetFuncInfo(MFP mfp, MemFuncInfo &out)
|
||||
{
|
||||
|
@ -34,8 +34,8 @@
|
||||
|
||||
// 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))
|
||||
# define SH_LALIGN(x) (void*)((intptr_t)(x) & ~(PAGESIZE-1))
|
||||
# define SH_LALDIF(x) ((intptr_t)(x) & (PAGESIZE-1))
|
||||
# else
|
||||
# error Unsupported OS/Compiler
|
||||
# endif
|
||||
|
@ -63,6 +63,8 @@
|
||||
# define vsnprintf _vsnprintf
|
||||
#endif
|
||||
|
||||
#define SH_PTRSIZE sizeof(void*)
|
||||
|
||||
#include "FastDelegate.h"
|
||||
#include "sh_memfuncinfo.h"
|
||||
#include "sh_memory.h"
|
||||
@ -86,7 +88,7 @@ enum META_RES
|
||||
|
||||
namespace SourceHook
|
||||
{
|
||||
const int STRBUF_LEN=8192; // In bytes, for "vafmt" functions
|
||||
const int STRBUF_LEN=4096; // In bytes, for "vafmt" functions
|
||||
|
||||
/**
|
||||
* @brief An empty class. No inheritance used. Used for original-function-call hacks
|
||||
@ -1491,6 +1493,7 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// SH_CALL
|
||||
|
||||
#if SH_COMP == SH_COMP_MSVC
|
||||
|
||||
# define SH_MAKE_EXECUTABLECLASS_OB(call, prms) \
|
||||
{ \
|
||||
@ -1513,6 +1516,34 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C
|
||||
return (reinterpret_cast<EmptyClass*>(adjustedthisptr)->*u.mfpnew)call; \
|
||||
}
|
||||
|
||||
#elif SH_COMP == SH_COMP_GCC
|
||||
|
||||
# define SH_MAKE_EXECUTABLECLASS_OB(call, prms) \
|
||||
{ \
|
||||
using namespace ::SourceHook; \
|
||||
MemFuncInfo mfi; \
|
||||
GetFuncInfo(m_CC->ptr, m_MFP, mfi); \
|
||||
OrigVTables::const_iterator iter = m_CC->vt.find(mfi.thisptroffs + mfi.vtbloffs); \
|
||||
if (iter == m_CC->vt.end() || mfi.vtblindex >= (int)iter->second.size() || iter->second[mfi.vtblindex] == NULL) \
|
||||
return (m_CC->ptr->*m_MFP)call; \
|
||||
\
|
||||
/* It's hooked. Call the original function. */ \
|
||||
union \
|
||||
{ \
|
||||
RetType(EmptyClass::*mfpnew)prms; \
|
||||
struct \
|
||||
{ \
|
||||
void *addr; \
|
||||
intptr_t adjustor; \
|
||||
} s; \
|
||||
} u; \
|
||||
u.s.addr = iter->second[mfi.vtblindex]; \
|
||||
u.s.adjustor = mfi.thisptroffs; \
|
||||
\
|
||||
return (reinterpret_cast<EmptyClass*>(m_CC->ptr)->*u.mfpnew)call; \
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
namespace SourceHook
|
||||
{
|
||||
|
@ -100,8 +100,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 CHECK_STATES(mwah, myerr) if (!StatesOk mwah) { error=myerr; return false; } else if (g_Verbose) { std::cout << "No error: " << myerr << std::endl; }
|
||||
|
||||
#define MAKE_STATE(name) struct name : State { \
|
||||
virtual void Dump() { \
|
||||
|
Loading…
Reference in New Issue
Block a user