mirror of
https://github.com/alliedmodders/metamod-source.git
synced 2025-12-06 18:08:31 +00:00
fix(sourcehook): Fix compilation issues with standalone SourceHook
This commit is contained in:
parent
018033d5a6
commit
994b382754
@ -94,7 +94,7 @@ static bool g_bIsVspBridged = false;
|
|||||||
|
|
||||||
MetamodSource g_Metamod;
|
MetamodSource g_Metamod;
|
||||||
PluginId g_PLID = Pl_Console;
|
PluginId g_PLID = Pl_Console;
|
||||||
CSourceHookImpl g_SourceHook;
|
CSourceHookImpl g_SourceHook(mm_LogMessage);
|
||||||
ISourceHook *g_SHPtr = &g_SourceHook;
|
ISourceHook *g_SHPtr = &g_SourceHook;
|
||||||
SourceMM::ISmmAPI *g_pMetamod = &g_Metamod;
|
SourceMM::ISmmAPI *g_pMetamod = &g_Metamod;
|
||||||
|
|
||||||
@ -430,12 +430,13 @@ private:
|
|||||||
T old_;
|
T old_;
|
||||||
};
|
};
|
||||||
|
|
||||||
void
|
int
|
||||||
mm_LogMessage(const char *msg, ...)
|
mm_LogMessage(const char *msg, ...)
|
||||||
{
|
{
|
||||||
|
int ret = 0;
|
||||||
static bool g_logging = false;
|
static bool g_logging = false;
|
||||||
if (g_logging) {
|
if (g_logging) {
|
||||||
return;
|
return ret;
|
||||||
}
|
}
|
||||||
SaveAndSet<bool>(&g_logging, true);
|
SaveAndSet<bool>(&g_logging, true);
|
||||||
|
|
||||||
@ -446,7 +447,7 @@ mm_LogMessage(const char *msg, ...)
|
|||||||
size_t len = vsnprintf(buffer, sizeof(buffer) - 2, msg, ap);
|
size_t len = vsnprintf(buffer, sizeof(buffer) - 2, msg, ap);
|
||||||
len = std::min<size_t>(len, sizeof(buffer) - 2);
|
len = std::min<size_t>(len, sizeof(buffer) - 2);
|
||||||
if (len < 0) {
|
if (len < 0) {
|
||||||
return;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
@ -454,11 +455,14 @@ mm_LogMessage(const char *msg, ...)
|
|||||||
buffer[len++] = '\n';
|
buffer[len++] = '\n';
|
||||||
buffer[len] = '\0';
|
buffer[len] = '\0';
|
||||||
|
|
||||||
|
|
||||||
if (!provider->LogMessage(buffer))
|
if (!provider->LogMessage(buffer))
|
||||||
{
|
{
|
||||||
fprintf(stdout, "%s", buffer);
|
ret = fprintf(stdout, "%s", buffer);
|
||||||
}
|
}
|
||||||
provider->ConsolePrint(buffer);
|
provider->ConsolePrint(buffer);
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|||||||
@ -102,7 +102,7 @@ public:
|
|||||||
bool
|
bool
|
||||||
mm_DetectGameInformation();
|
mm_DetectGameInformation();
|
||||||
|
|
||||||
void
|
int
|
||||||
mm_LogMessage(const char *msg, ...);
|
mm_LogMessage(const char *msg, ...);
|
||||||
|
|
||||||
int
|
int
|
||||||
|
|||||||
@ -132,6 +132,11 @@ enum META_RES
|
|||||||
|
|
||||||
namespace SourceHook
|
namespace SourceHook
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* @brief SourceHook's debug log function
|
||||||
|
*/
|
||||||
|
typedef int (*DebugLogFunc)(const char*, ...);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Specifies the size (in bytes) for the internal buffer of vafmt(printf-like) function handlers
|
* @brief Specifies the size (in bytes) for the internal buffer of vafmt(printf-like) function handlers
|
||||||
*/
|
*/
|
||||||
@ -194,7 +199,7 @@ namespace SourceHook
|
|||||||
// SH tries to auto-detect these
|
// SH tries to auto-detect these
|
||||||
// If you want to override SH's auto-detection, pass them in yourself
|
// If you want to override SH's auto-detection, pass them in yourself
|
||||||
PassFlag_RetMem = (1<<6), /**< Object is returned in memory (through hidden first param */
|
PassFlag_RetMem = (1<<6), /**< Object is returned in memory (through hidden first param */
|
||||||
PassFlag_RetReg = (1<<7) /**< Object is returned in EAX(:EDX) */
|
PassFlag_RetReg = (1<<7) /**< Object is returned in EAX(:EDX)/RAX(x86_64) */
|
||||||
};
|
};
|
||||||
|
|
||||||
size_t size; //!< Size of the data being passed
|
size_t size; //!< Size of the data being passed
|
||||||
@ -499,6 +504,8 @@ namespace SourceHook
|
|||||||
const void *origRetPtr, void *overrideRetPtr) = 0;
|
const void *origRetPtr, void *overrideRetPtr) = 0;
|
||||||
|
|
||||||
virtual void EndContext(IHookContext *pCtx) = 0;
|
virtual void EndContext(IHookContext *pCtx) = 0;
|
||||||
|
|
||||||
|
virtual void LogDebug(const char *pFormat, ...) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -80,8 +80,9 @@ namespace SourceHook
|
|||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
CSourceHookImpl::CSourceHookImpl()
|
CSourceHookImpl::CSourceHookImpl(DebugLogFunc logfunc)
|
||||||
{
|
{
|
||||||
|
m_LogFunc = logfunc;
|
||||||
}
|
}
|
||||||
CSourceHookImpl::~CSourceHookImpl()
|
CSourceHookImpl::~CSourceHookImpl()
|
||||||
{
|
{
|
||||||
@ -639,6 +640,14 @@ namespace SourceHook
|
|||||||
ResolvePendingUnloads();
|
ResolvePendingUnloads();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CSourceHookImpl::LogDebug(const char *format, ...)
|
||||||
|
{
|
||||||
|
va_list args;
|
||||||
|
va_start(args, format);
|
||||||
|
m_LogFunc(format, args);
|
||||||
|
va_end(args);
|
||||||
|
}
|
||||||
|
|
||||||
void CSourceHookImpl::CompleteShutdown()
|
void CSourceHookImpl::CompleteShutdown()
|
||||||
{
|
{
|
||||||
CVector<int> removehooks;
|
CVector<int> removehooks;
|
||||||
|
|||||||
@ -52,7 +52,6 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef SH_DEBUG
|
#ifdef SH_DEBUG
|
||||||
|
|
||||||
# include <stdio.h>
|
# include <stdio.h>
|
||||||
# include <stdlib.h>
|
# include <stdlib.h>
|
||||||
|
|
||||||
@ -133,6 +132,11 @@ enum META_RES
|
|||||||
|
|
||||||
namespace SourceHook
|
namespace SourceHook
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* @brief SourceHook's debug log function
|
||||||
|
*/
|
||||||
|
typedef int (*DebugLogFunc)(const char*, ...);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Specifies the size (in bytes) for the internal buffer of vafmt(printf-like) function handlers
|
* @brief Specifies the size (in bytes) for the internal buffer of vafmt(printf-like) function handlers
|
||||||
*/
|
*/
|
||||||
@ -500,6 +504,8 @@ namespace SourceHook
|
|||||||
const void *origRetPtr, void *overrideRetPtr) = 0;
|
const void *origRetPtr, void *overrideRetPtr) = 0;
|
||||||
|
|
||||||
virtual void EndContext(IHookContext *pCtx) = 0;
|
virtual void EndContext(IHookContext *pCtx) = 0;
|
||||||
|
|
||||||
|
virtual void LogDebug(const char *pFormat, ...) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -4929,4 +4935,4 @@ namespace SourceHook
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
// The pope is dead. -> :(
|
// The pope is dead. -> :(
|
||||||
|
|||||||
@ -179,9 +179,10 @@ New SH_CALL
|
|||||||
#include "sourcehook_impl_ciface.h"
|
#include "sourcehook_impl_ciface.h"
|
||||||
#include "sourcehook_impl_cvfnptr.h"
|
#include "sourcehook_impl_cvfnptr.h"
|
||||||
#include "sourcehook_impl_chookidman.h"
|
#include "sourcehook_impl_chookidman.h"
|
||||||
|
#include <cstdio>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
|
||||||
void mm_LogMessage(const char* msg, ...);
|
extern SourceHook::ISourceHook *g_SHPtr;
|
||||||
|
|
||||||
namespace SourceHook
|
namespace SourceHook
|
||||||
{
|
{
|
||||||
@ -203,10 +204,13 @@ namespace SourceHook
|
|||||||
template<typename... Args>
|
template<typename... Args>
|
||||||
inline void SH_DEBUG_LOG(SH_LOG log_level, const char* message, Args... args)
|
inline void SH_DEBUG_LOG(SH_LOG log_level, const char* message, Args... args)
|
||||||
{
|
{
|
||||||
|
#ifndef SOURCEHOOK_TESTS
|
||||||
if (log_level < sh_log_level) {
|
if (log_level < sh_log_level) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
mm_LogMessage(message, args...);
|
|
||||||
|
SH_GLOB_SHPTR->LogDebug(message, args...);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
struct CHookContext : IHookContext
|
struct CHookContext : IHookContext
|
||||||
@ -322,12 +326,13 @@ namespace SourceHook
|
|||||||
CHookIDManager m_HookIDMan;
|
CHookIDManager m_HookIDMan;
|
||||||
HookContextStack m_ContextStack;
|
HookContextStack m_ContextStack;
|
||||||
List<PendingUnload *> m_PendingUnloads;
|
List<PendingUnload *> m_PendingUnloads;
|
||||||
|
DebugLogFunc m_LogFunc;
|
||||||
|
|
||||||
bool SetHookPaused(int hookid, bool paused);
|
bool SetHookPaused(int hookid, bool paused);
|
||||||
CHookManList::iterator RemoveHookManager(CHookManList::iterator iter);
|
CHookManList::iterator RemoveHookManager(CHookManList::iterator iter);
|
||||||
List<CVfnPtr>::iterator RevertAndRemoveVfnPtr(List<CVfnPtr>::iterator vfnptr_iter);
|
List<CVfnPtr>::iterator RevertAndRemoveVfnPtr(List<CVfnPtr>::iterator vfnptr_iter);
|
||||||
public:
|
public:
|
||||||
CSourceHookImpl();
|
CSourceHookImpl(DebugLogFunc logfunc = printf);
|
||||||
virtual ~CSourceHookImpl();
|
virtual ~CSourceHookImpl();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -381,6 +386,8 @@ namespace SourceHook
|
|||||||
|
|
||||||
void DoRecall();
|
void DoRecall();
|
||||||
|
|
||||||
|
void LogDebug(const char *pFormat, ...) override;
|
||||||
|
|
||||||
IHookContext *SetupHookLoop(IHookManagerInfo *hi, void *vfnptr, void *thisptr, void **origCallAddr, META_RES *statusPtr,
|
IHookContext *SetupHookLoop(IHookManagerInfo *hi, void *vfnptr, void *thisptr, void **origCallAddr, META_RES *statusPtr,
|
||||||
META_RES *prevResPtr, META_RES *curResPtr, const void *origRetPtr, void *overrideRetPtr);
|
META_RES *prevResPtr, META_RES *curResPtr, const void *origRetPtr, void *overrideRetPtr);
|
||||||
|
|
||||||
|
|||||||
@ -4,6 +4,11 @@ import os
|
|||||||
for cxx in MMS.all_targets:
|
for cxx in MMS.all_targets:
|
||||||
name = 'test_sourcehook'
|
name = 'test_sourcehook'
|
||||||
binary = MMS.Program(cxx, name)
|
binary = MMS.Program(cxx, name)
|
||||||
|
|
||||||
|
binary.compiler.defines += [
|
||||||
|
'SOURCEHOOK_TESTS',
|
||||||
|
]
|
||||||
|
|
||||||
binary.compiler.cxxincludes += [
|
binary.compiler.cxxincludes += [
|
||||||
os.path.join(builder.sourcePath, 'core', 'sourcehook'),
|
os.path.join(builder.sourcePath, 'core', 'sourcehook'),
|
||||||
]
|
]
|
||||||
@ -19,6 +24,7 @@ for cxx in MMS.all_targets:
|
|||||||
'../sourcehook_impl_chookidman.cpp',
|
'../sourcehook_impl_chookidman.cpp',
|
||||||
'../sourcehook_impl_cproto.cpp',
|
'../sourcehook_impl_cproto.cpp',
|
||||||
'../sourcehook_impl_cvfnptr.cpp',
|
'../sourcehook_impl_cvfnptr.cpp',
|
||||||
|
'../sourcehook_hookmangen.cpp',
|
||||||
'test1.cpp',
|
'test1.cpp',
|
||||||
'test2.cpp',
|
'test2.cpp',
|
||||||
'test3.cpp',
|
'test3.cpp',
|
||||||
@ -36,7 +42,9 @@ for cxx in MMS.all_targets:
|
|||||||
'testrefret.cpp',
|
'testrefret.cpp',
|
||||||
'testvphooks.cpp',
|
'testvphooks.cpp',
|
||||||
]
|
]
|
||||||
if binary.compiler.target.arch == 'x86':
|
if cxx.target.arch == 'x86':
|
||||||
binary.sources += ['../sourcehook_hookmangen.cpp']
|
binary.sources += ['../sourcehook_hookmangen_x86.cpp']
|
||||||
|
elif binary.compiler.target.arch == 'x86_64':
|
||||||
|
binary.sources += ['../sourcehook_hookmangen_x86_64.cpp']
|
||||||
|
|
||||||
builder.Add(binary)
|
builder.Add(binary)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user