2
0
mirror of https://github.com/rehlds/reapi.git synced 2025-01-01 01:25:47 +03:00

Small fixes

This commit is contained in:
asmodai 2016-06-07 04:01:46 +03:00
parent 6fb4fc6779
commit 4c6f3c3d08
3 changed files with 52 additions and 35 deletions

View File

@ -29,7 +29,7 @@ struct retval_t
{ {
char* _string; char* _string;
float _float; float _float;
int _interger; int _integer;
CBaseEntity* _classptr; CBaseEntity* _classptr;
edict_t* _edict; edict_t* _edict;
entvars_t* _pev; entvars_t* _pev;
@ -48,36 +48,44 @@ inline AType getApiType(entvars_t *) { return ATYPE_EVARS; }
template<typename T> template<typename T>
inline AType getApiType(T *) { return ATYPE_INTEGER; } inline AType getApiType(T *) { return ATYPE_INTEGER; }
#define MAX_ARGS 12u #define MAX_HOOKCHAIN_ARGS 12u
template<size_t current = 0, typename T1, typename T2, typename T3, typename T4, typename ...t_args> template<size_t current = 0, typename T1, typename T2, typename T3, typename T4, typename ...t_args>
void setupArgTypes(AType args_type[MAX_ARGS], T1, T2, T3, T4, t_args... args) void setupArgTypes(AType args_type[], T1, T2, T3, T4, t_args... args)
{ {
if (current + 4 <= MAX_HOOKCHAIN_ARGS)
*(uint32 *)&args_type[current] = getApiType(T1()) | (getApiType(T2()) << 8) | (getApiType(T3()) << 16) | (getApiType(T4()) << 24); *(uint32 *)&args_type[current] = getApiType(T1()) | (getApiType(T2()) << 8) | (getApiType(T3()) << 16) | (getApiType(T4()) << 24);
if (sizeof...(args) && current + 1 < MAX_ARGS) if (sizeof...(args) && current + 4 < MAX_HOOKCHAIN_ARGS)
setupArgTypes<current + 4>(args_type, args...); setupArgTypes<current + 4>(args_type, args...);
} }
template<size_t current = 0, typename T1, typename T2, typename T3> template<size_t current = 0, typename T1, typename T2, typename T3>
void setupArgTypes(AType args_type[MAX_ARGS], T1, T2, T3) void setupArgTypes(AType args_type[], T1, T2, T3)
{ {
if (current + 3 <= MAX_HOOKCHAIN_ARGS)
*(uint32 *)&args_type[current] = getApiType(T1()) | (getApiType(T2()) << 8) | (getApiType(T3()) << 16); *(uint32 *)&args_type[current] = getApiType(T1()) | (getApiType(T2()) << 8) | (getApiType(T3()) << 16);
else
setupArgTypes(args_type, T1(), T2());
} }
template<size_t current = 0, typename T1, typename T2> template<size_t current = 0, typename T1, typename T2>
void setupArgTypes(AType args_type[MAX_ARGS], T1, T2) void setupArgTypes(AType args_type[], T1, T2)
{ {
if (current + 2 <= MAX_HOOKCHAIN_ARGS)
*(uint16 *)&args_type[current] = getApiType(T1()) | (getApiType(T2()) << 8); *(uint16 *)&args_type[current] = getApiType(T1()) | (getApiType(T2()) << 8);
else
setupArgTypes(args_type, T1());
} }
template<size_t current = 0, typename T> template<size_t current = 0, typename T>
void setupArgTypes(AType args_type[MAX_ARGS], T) void setupArgTypes(AType args_type[], T)
{ {
if (current + 1 <= MAX_HOOKCHAIN_ARGS)
args_type[current] = getApiType(T()); args_type[current] = getApiType(T());
} }
template<size_t current = 0> template<size_t current = 0>
void setupArgTypes(AType args_type[MAX_ARGS]) void setupArgTypes(AType args_type[])
{ {
} }
@ -86,7 +94,7 @@ struct hookctx_t
template<typename ...t_args> template<typename ...t_args>
hookctx_t(size_t arg_count, t_args... args) hookctx_t(size_t arg_count, t_args... args)
{ {
args_count = min(arg_count, MAX_ARGS); args_count = min(arg_count, MAX_HOOKCHAIN_ARGS);
setupArgTypes(args_type, args...); setupArgTypes(args_type, args...);
} }
@ -100,7 +108,7 @@ struct hookctx_t
retval_t retVal; retval_t retVal;
size_t args_count; size_t args_count;
size_t args_ptr; size_t args_ptr;
AType args_type[MAX_ARGS]; AType args_type[MAX_HOOKCHAIN_ARGS];
}; };
extern hookctx_t* g_hookCtx; extern hookctx_t* g_hookCtx;
@ -112,7 +120,7 @@ NOINLINE void DLLEXPORT _callVoidForward(const hook_t* hook, original_t original
hookCtx->reset(size_t(&original) + sizeof(original)); hookCtx->reset(size_t(&original) + sizeof(original));
int hc_state = HC_CONTINUE; int hc_state = HC_CONTINUE;
for (auto& fwd : hook->pre) for (auto fwd : hook->pre)
{ {
if (fwd->GetState() == FSTATE_ENABLED) if (fwd->GetState() == FSTATE_ENABLED)
{ {
@ -133,7 +141,7 @@ NOINLINE void DLLEXPORT _callVoidForward(const hook_t* hook, original_t original
g_hookCtx = hookCtx; g_hookCtx = hookCtx;
} }
for (auto& fwd : hook->post) { for (auto fwd : hook->post) {
if (fwd->GetState() == FSTATE_ENABLED) { if (fwd->GetState() == FSTATE_ENABLED) {
auto ret = g_amxxapi.ExecuteForward(fwd->GetIndex(), args...); auto ret = g_amxxapi.ExecuteForward(fwd->GetIndex(), args...);
@ -160,14 +168,15 @@ NOINLINE R DLLEXPORT _callForward(const hook_t* hook, original_t original, volat
hookCtx->reset(size_t(&original) + sizeof(original), getApiType(R())); hookCtx->reset(size_t(&original) + sizeof(original), getApiType(R()));
int hc_state = HC_CONTINUE; int hc_state = HC_CONTINUE;
for (auto& fwd : hook->pre) for (auto fwd : hook->pre)
{ {
if (fwd->GetState() == FSTATE_ENABLED) if (fwd->GetState() == FSTATE_ENABLED)
{ {
auto ret = g_amxxapi.ExecuteForward(fwd->GetIndex(), args...); auto ret = g_amxxapi.ExecuteForward(fwd->GetIndex(), args...);
if (ret == HC_CONTINUE) if (ret == HC_CONTINUE) {
continue; continue;
}
if (!hookCtx->retVal.set) { if (!hookCtx->retVal.set) {
g_amxxapi.LogError(fwd->GetAmx(), AMX_ERR_CALLBACK, "%s", "can't suppress original function call without new return value set"); g_amxxapi.LogError(fwd->GetAmx(), AMX_ERR_CALLBACK, "%s", "can't suppress original function call without new return value set");
@ -175,7 +184,7 @@ NOINLINE R DLLEXPORT _callForward(const hook_t* hook, original_t original, volat
} }
if (ret == HC_BREAK) { if (ret == HC_BREAK) {
return *(R *)&hookCtx->retVal._interger; return *(R *)&hookCtx->retVal._integer;
} }
if (ret > hc_state) if (ret > hc_state)
@ -190,10 +199,12 @@ NOINLINE R DLLEXPORT _callForward(const hook_t* hook, original_t original, volat
g_hookCtx = hookCtx; g_hookCtx = hookCtx;
if (hc_state != HC_OVERRIDE) if (hc_state != HC_OVERRIDE)
hookCtx->retVal._interger = *(int *)&retVal; hookCtx->retVal._integer = *(int *)&retVal;
hookCtx->retVal.set = true;
} }
for (auto& fwd : hook->post) { for (auto fwd : hook->post) {
if (fwd->GetState() == FSTATE_ENABLED) { if (fwd->GetState() == FSTATE_ENABLED) {
auto ret = g_amxxapi.ExecuteForward(fwd->GetIndex(), args...); auto ret = g_amxxapi.ExecuteForward(fwd->GetIndex(), args...);
@ -202,7 +213,7 @@ NOINLINE R DLLEXPORT _callForward(const hook_t* hook, original_t original, volat
} }
} }
return *(R *)&hookCtx->retVal._interger; return *(R *)&hookCtx->retVal._integer;
} }
template <typename R, typename original_t, typename ...f_args> template <typename R, typename original_t, typename ...f_args>

View File

@ -27,7 +27,7 @@ cell AMX_NATIVE_CALL RegisterHookChain(AMX *amx, cell *params)
if (!hook->checkRequirements()) if (!hook->checkRequirements())
{ {
MF_LogError(amx, AMX_ERR_NATIVE, "%s: function (%s) is not available, %s required", __FUNCTION__, hook->func_name, hook->depend_name); MF_LogError(amx, AMX_ERR_NATIVE, "%s: function (%s) is not available, %s required.", __FUNCTION__, hook->func_name, hook->depend_name);
return 0; return 0;
} }
@ -130,7 +130,7 @@ cell AMX_NATIVE_CALL SetHookChainReturn(AMX *amx, cell *params)
{ {
case ATYPE_INTEGER: case ATYPE_INTEGER:
case ATYPE_FLOAT: case ATYPE_FLOAT:
retVal._interger = *srcAddr; retVal._integer = *srcAddr;
break; break;
case ATYPE_STRING: case ATYPE_STRING:
@ -178,15 +178,21 @@ cell AMX_NATIVE_CALL GetHookChainReturn(AMX *amx, cell *params)
} }
enum args_e { arg_count, arg_value, arg_maxlen }; enum args_e { arg_count, arg_value, arg_maxlen };
auto& retVal = g_hookCtx->retVal; auto& retVal = g_hookCtx->retVal;
if (!retVal.set)
{
MF_LogError(amx, AMX_ERR_NATIVE, "%s: return value isn't set.", __FUNCTION__);
return FALSE;
}
cell* dstAddr = getAmxAddr(amx, params[arg_value]); cell* dstAddr = getAmxAddr(amx, params[arg_value]);
switch (retVal.type) switch (retVal.type)
{ {
case ATYPE_INTEGER: case ATYPE_INTEGER:
case ATYPE_FLOAT: case ATYPE_FLOAT:
return retVal._interger; return retVal._integer;
case ATYPE_STRING: case ATYPE_STRING:
{ {
if (PARAMS_COUNT != 2) if (PARAMS_COUNT != 2)
@ -244,7 +250,7 @@ cell AMX_NATIVE_CALL SetHookChainArg(AMX *amx, cell *params)
return FALSE; return FALSE;
} }
static char temp_strings[MAX_ARGS][1024]; static char temp_strings[MAX_HOOKCHAIN_ARGS][1024];
cell* srcAddr = getAmxAddr(amx, params[arg_value]); cell* srcAddr = getAmxAddr(amx, params[arg_value]);
size_t destAddr = g_hookCtx->args_ptr + number * sizeof(int); size_t destAddr = g_hookCtx->args_ptr + number * sizeof(int);

View File

@ -3,7 +3,7 @@
void __declspec(noreturn) UTIL_SysError(const char *fmt, ...) void __declspec(noreturn) UTIL_SysError(const char *fmt, ...)
{ {
va_list argptr; va_list argptr;
static char string[8192]; char string[8192];
va_start(argptr, fmt); va_start(argptr, fmt);
vsnprintf(string, sizeof(string), fmt, argptr); vsnprintf(string, sizeof(string), fmt, argptr);
@ -32,7 +32,7 @@ char *UTIL_VarArgs(char *format, ...)
void UTIL_LogPrintf(const char *fmt, ...) void UTIL_LogPrintf(const char *fmt, ...)
{ {
va_list argptr; va_list argptr;
static char string[1024]; char string[1024];
va_start(argptr, fmt); va_start(argptr, fmt);
vsprintf(string, fmt, argptr); vsprintf(string, fmt, argptr);