diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/common/console.c | 1 | ||||
-rw-r--r-- | src/common/sysinfo.c | 15 | ||||
-rw-r--r-- | src/common/sysinfo.h | 1 | ||||
-rw-r--r-- | src/common/timer.c | 64 | ||||
-rw-r--r-- | src/plugins/HPMHooking/HPMHooking_char.HPMHooksCore.inc | 4 | ||||
-rw-r--r-- | src/plugins/HPMHooking/HPMHooking_char.HookingPoints.inc | 1 | ||||
-rw-r--r-- | src/plugins/HPMHooking/HPMHooking_char.Hooks.inc | 27 | ||||
-rw-r--r-- | src/plugins/HPMHooking/HPMHooking_login.HPMHooksCore.inc | 4 | ||||
-rw-r--r-- | src/plugins/HPMHooking/HPMHooking_login.HookingPoints.inc | 1 | ||||
-rw-r--r-- | src/plugins/HPMHooking/HPMHooking_login.Hooks.inc | 27 | ||||
-rw-r--r-- | src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc | 4 | ||||
-rw-r--r-- | src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc | 1 | ||||
-rw-r--r-- | src/plugins/HPMHooking/HPMHooking_map.Hooks.inc | 27 |
13 files changed, 172 insertions, 5 deletions
diff --git a/src/common/console.c b/src/common/console.c index f0702d0da..10e1bee1a 100644 --- a/src/common/console.c +++ b/src/common/console.c @@ -90,6 +90,7 @@ void display_title(void) { ShowInfo("CPU: '"CL_WHITE"%s [%d]"CL_RESET"'\n", sysinfo->cpu(), sysinfo->cpucores()); ShowInfo("Compiled with %s\n", sysinfo->compiler()); ShowInfo("Compile Flags: %s\n", sysinfo->cflags()); + ShowInfo("Timer Function Type: %s\n", sysinfo->time()); } /** diff --git a/src/common/sysinfo.c b/src/common/sysinfo.c index 7cc4cd16a..95f423ff7 100644 --- a/src/common/sysinfo.c +++ b/src/common/sysinfo.c @@ -38,6 +38,7 @@ #ifdef WIN32 # include <windows.h> #else +# include <sys/time.h> // time constants # include <unistd.h> #endif @@ -1052,6 +1053,19 @@ void sysinfo_final(void) { sysinfo->p->vcstype_name = NULL; } +static const char *sysinfo_time(void) +{ +#if defined(WIN32) + return "ticks count"; +#elif defined(ENABLE_RDTSC) + return "rdtsc"; +#elif defined(HAVE_MONOTONIC_CLOCK) + return "monotonic clock"; +#else + return "time of day"; +#endif +} + /** * Interface default values initialization. */ @@ -1072,6 +1086,7 @@ void sysinfo_defaults(void) { sysinfo->is64bit = sysinfo_is64bit; sysinfo->compiler = sysinfo_compiler; sysinfo->cflags = sysinfo_cflags; + sysinfo->time = sysinfo_time; sysinfo->vcstype = sysinfo_vcstype; sysinfo->vcstypeid = sysinfo_vcstypeid; sysinfo->vcsrevision_src = sysinfo_vcsrevision_src; diff --git a/src/common/sysinfo.h b/src/common/sysinfo.h index 904be832f..2a391bfa4 100644 --- a/src/common/sysinfo.h +++ b/src/common/sysinfo.h @@ -52,6 +52,7 @@ struct sysinfo_interface { bool (*is64bit) (void); const char *(*compiler) (void); const char *(*cflags) (void); + const char *(*time) (void); const char *(*vcstype) (void); int (*vcstypeid) (void); const char *(*vcsrevision_src) (void); diff --git a/src/common/timer.c b/src/common/timer.c index 7f71157ae..e7a57481a 100644 --- a/src/common/timer.c +++ b/src/common/timer.c @@ -25,6 +25,7 @@ #include "common/cbasetypes.h" #include "common/db.h" #include "common/memmgr.h" +#include "common/nullpo.h" #include "common/showmsg.h" #include "common/utils.h" @@ -87,6 +88,8 @@ struct timer_func_list { int timer_add_func_list(TimerFunc func, char* name) { struct timer_func_list* tfl; + nullpo_ret(func); + nullpo_ret(name); if (name) { for( tfl=tfl_root; tfl != NULL; tfl=tfl->next ) {// check suspicious cases @@ -303,7 +306,19 @@ static int acquire_timer(void) { int timer_add(int64 tick, TimerFunc func, int id, intptr_t data) { int tid; + nullpo_retr(INVALID_TIMER, func); + tid = acquire_timer(); + if (timer_data[tid].type != 0 && timer_data[tid].type != TIMER_REMOVE_HEAP) + { + ShowError("timer_add error: wrong tid type: %d, [%d]%p(%s) -> %p(%s)\n", timer_data[tid].type, tid, func, search_timer_func_list(func), timer_data[tid].func, search_timer_func_list(timer_data[tid].func)); + Assert_retr(INVALID_TIMER, 0); + } + if (timer_data[tid].func != NULL) + { + ShowError("timer_add error: func non NULL: [%d]%p(%s) -> %p(%s)\n", tid, func, search_timer_func_list(func), timer_data[tid].func, search_timer_func_list(timer_data[tid].func)); + Assert_retr(INVALID_TIMER, 0); + } timer_data[tid].tick = tick; timer_data[tid].func = func; timer_data[tid].id = id; @@ -317,9 +332,11 @@ int timer_add(int64 tick, TimerFunc func, int id, intptr_t data) { /// Starts a new timer that automatically restarts itself (infinite loop until manually removed). /// Returns the timer's id, or INVALID_TIMER if it fails. -int timer_add_interval(int64 tick, TimerFunc func, int id, intptr_t data, int interval) { +int timer_add_interval(int64 tick, TimerFunc func, int id, intptr_t data, int interval) +{ int tid; + nullpo_retr(INVALID_TIMER, func); if (interval < 1) { ShowError("timer_add_interval: invalid interval (tick=%"PRId64" %p[%s] id=%d data=%"PRIdPTR" diff_tick=%"PRId64")\n", tick, func, search_timer_func_list(func), id, data, DIFF_TICK(tick, timer->gettick())); @@ -327,6 +344,18 @@ int timer_add_interval(int64 tick, TimerFunc func, int id, intptr_t data, int in } tid = acquire_timer(); + if (timer_data[tid].type != 0 && timer_data[tid].type != TIMER_REMOVE_HEAP) + { + ShowError("timer_add_interval: wrong tid type: %d, [%d]%p(%s) -> %p(%s)\n", timer_data[tid].type, tid, func, search_timer_func_list(func), timer_data[tid].func, search_timer_func_list(timer_data[tid].func)); + Assert_retr(INVALID_TIMER, 0); + return INVALID_TIMER; + } + if (timer_data[tid].func != NULL) + { + ShowError("timer_add_interval: func non NULL: [%d]%p(%s) -> %p(%s)\n", tid, func, search_timer_func_list(func), timer_data[tid].func, search_timer_func_list(timer_data[tid].func)); + Assert_retr(INVALID_TIMER, 0); + return INVALID_TIMER; + } timer_data[tid].tick = tick; timer_data[tid].func = func; timer_data[tid].id = id; @@ -346,16 +375,28 @@ const struct TimerData* timer_get(int tid) { /// Marks a timer specified by 'id' for immediate deletion once it expires. /// Param 'func' is used for debug/verification purposes. /// Returns 0 on success, < 0 on failure. -int timer_do_delete(int tid, TimerFunc func) { +int timer_do_delete(int tid, TimerFunc func) +{ + nullpo_ret(func); + if( tid < 0 || tid >= timer_data_num ) { - ShowError("timer_do_delete error : no such timer %d (%p(%s))\n", tid, func, search_timer_func_list(func)); + ShowError("timer_do_delete error : no such timer [%d](%p(%s))\n", tid, func, search_timer_func_list(func)); + Assert_retr(-1, 0); return -1; } if( timer_data[tid].func != func ) { - ShowError("timer_do_delete error : function mismatch %p(%s) != %p(%s)\n", timer_data[tid].func, search_timer_func_list(timer_data[tid].func), func, search_timer_func_list(func)); + ShowError("timer_do_delete error : function mismatch [%d]%p(%s) != %p(%s)\n", tid, timer_data[tid].func, search_timer_func_list(timer_data[tid].func), func, search_timer_func_list(func)); + Assert_retr(-2, 0); return -2; } + if (timer_data[tid].type == 0 || timer_data[tid].type == TIMER_REMOVE_HEAP) + { + ShowError("timer_do_delete: timer already deleted: %d, [%d]%p(%s) -> %p(%s)\n", timer_data[tid].type, tid, func, search_timer_func_list(func), func, search_timer_func_list(func)); + Assert_retr(-3, 0); + return -3; + } + timer_data[tid].func = NULL; timer_data[tid].type = TIMER_ONCE_AUTODEL; @@ -383,7 +424,19 @@ int64 timer_settick(int tid, int64 tick) // search timer position ARR_FIND(0, BHEAP_LENGTH(timer_heap), i, BHEAP_DATA(timer_heap)[i] == tid); if (i == BHEAP_LENGTH(timer_heap)) { - ShowError("timer_settick: no such timer %d (%p(%s))\n", tid, timer_data[tid].func, search_timer_func_list(timer_data[tid].func)); + ShowError("timer_settick: no such timer [%d](%p(%s))\n", tid, timer_data[tid].func, search_timer_func_list(timer_data[tid].func)); + Assert_retr(-1, 0); + return -1; + } + + if (timer_data[tid].type == 0 || timer_data[tid].type == TIMER_REMOVE_HEAP) { + ShowError("timer_settick error: set tick for deleted timer %d, [%d](%p(%s))\n", timer_data[tid].type, tid, timer_data[tid].func, search_timer_func_list(timer_data[tid].func)); + Assert_retr(-1, 0); + return -1; + } + if (timer_data[tid].func == NULL) { + ShowError("timer_settick error: set tick for timer with wrong func [%d](%p(%s))\n", tid, timer_data[tid].func, search_timer_func_list(timer_data[tid].func)); + Assert_retr(-1, 0); return -1; } @@ -438,6 +491,7 @@ int do_timer(int64 tick) default: case TIMER_ONCE_AUTODEL: timer_data[tid].type = 0; + timer_data[tid].func = NULL; if (free_timer_list_pos >= free_timer_list_max) { free_timer_list_max += 256; RECREATE(free_timer_list,int,free_timer_list_max); diff --git a/src/plugins/HPMHooking/HPMHooking_char.HPMHooksCore.inc b/src/plugins/HPMHooking/HPMHooking_char.HPMHooksCore.inc index dd6b3d5d6..9d8a2750d 100644 --- a/src/plugins/HPMHooking/HPMHooking_char.HPMHooksCore.inc +++ b/src/plugins/HPMHooking/HPMHooking_char.HPMHooksCore.inc @@ -1356,6 +1356,8 @@ struct { struct HPMHookPoint *HP_sysinfo_compiler_post; struct HPMHookPoint *HP_sysinfo_cflags_pre; struct HPMHookPoint *HP_sysinfo_cflags_post; + struct HPMHookPoint *HP_sysinfo_time_pre; + struct HPMHookPoint *HP_sysinfo_time_post; struct HPMHookPoint *HP_sysinfo_vcstype_pre; struct HPMHookPoint *HP_sysinfo_vcstype_post; struct HPMHookPoint *HP_sysinfo_vcstypeid_pre; @@ -2733,6 +2735,8 @@ struct { int HP_sysinfo_compiler_post; int HP_sysinfo_cflags_pre; int HP_sysinfo_cflags_post; + int HP_sysinfo_time_pre; + int HP_sysinfo_time_post; int HP_sysinfo_vcstype_pre; int HP_sysinfo_vcstype_post; int HP_sysinfo_vcstypeid_pre; diff --git a/src/plugins/HPMHooking/HPMHooking_char.HookingPoints.inc b/src/plugins/HPMHooking/HPMHooking_char.HookingPoints.inc index 34a9e4005..fe3e806b1 100644 --- a/src/plugins/HPMHooking/HPMHooking_char.HookingPoints.inc +++ b/src/plugins/HPMHooking/HPMHooking_char.HookingPoints.inc @@ -721,6 +721,7 @@ struct HookingPointData HookingPoints[] = { { HP_POP(sysinfo->is64bit, HP_sysinfo_is64bit) }, { HP_POP(sysinfo->compiler, HP_sysinfo_compiler) }, { HP_POP(sysinfo->cflags, HP_sysinfo_cflags) }, + { HP_POP(sysinfo->time, HP_sysinfo_time) }, { HP_POP(sysinfo->vcstype, HP_sysinfo_vcstype) }, { HP_POP(sysinfo->vcstypeid, HP_sysinfo_vcstypeid) }, { HP_POP(sysinfo->vcsrevision_src, HP_sysinfo_vcsrevision_src) }, diff --git a/src/plugins/HPMHooking/HPMHooking_char.Hooks.inc b/src/plugins/HPMHooking/HPMHooking_char.Hooks.inc index b1554aefd..e6100ffdd 100644 --- a/src/plugins/HPMHooking/HPMHooking_char.Hooks.inc +++ b/src/plugins/HPMHooking/HPMHooking_char.Hooks.inc @@ -17857,6 +17857,33 @@ const char* HP_sysinfo_cflags(void) { } return retVal___; } +const char* HP_sysinfo_time(void) { + int hIndex = 0; + const char* retVal___ = NULL; + if( HPMHooks.count.HP_sysinfo_time_pre ) { + const char* (*preHookFunc) (void); + *HPMforce_return = false; + for(hIndex = 0; hIndex < HPMHooks.count.HP_sysinfo_time_pre; hIndex++ ) { + preHookFunc = HPMHooks.list.HP_sysinfo_time_pre[hIndex].func; + retVal___ = preHookFunc(); + } + if( *HPMforce_return ) { + *HPMforce_return = false; + return retVal___; + } + } + { + retVal___ = HPMHooks.source.sysinfo.time(); + } + if( HPMHooks.count.HP_sysinfo_time_post ) { + const char* (*postHookFunc) (const char* retVal___); + for(hIndex = 0; hIndex < HPMHooks.count.HP_sysinfo_time_post; hIndex++ ) { + postHookFunc = HPMHooks.list.HP_sysinfo_time_post[hIndex].func; + retVal___ = postHookFunc(retVal___); + } + } + return retVal___; +} const char* HP_sysinfo_vcstype(void) { int hIndex = 0; const char* retVal___ = NULL; diff --git a/src/plugins/HPMHooking/HPMHooking_login.HPMHooksCore.inc b/src/plugins/HPMHooking/HPMHooking_login.HPMHooksCore.inc index ce78fdd7e..a9abae542 100644 --- a/src/plugins/HPMHooking/HPMHooking_login.HPMHooksCore.inc +++ b/src/plugins/HPMHooking/HPMHooking_login.HPMHooksCore.inc @@ -556,6 +556,8 @@ struct { struct HPMHookPoint *HP_sysinfo_compiler_post; struct HPMHookPoint *HP_sysinfo_cflags_pre; struct HPMHookPoint *HP_sysinfo_cflags_post; + struct HPMHookPoint *HP_sysinfo_time_pre; + struct HPMHookPoint *HP_sysinfo_time_post; struct HPMHookPoint *HP_sysinfo_vcstype_pre; struct HPMHookPoint *HP_sysinfo_vcstype_post; struct HPMHookPoint *HP_sysinfo_vcstypeid_pre; @@ -1133,6 +1135,8 @@ struct { int HP_sysinfo_compiler_post; int HP_sysinfo_cflags_pre; int HP_sysinfo_cflags_post; + int HP_sysinfo_time_pre; + int HP_sysinfo_time_post; int HP_sysinfo_vcstype_pre; int HP_sysinfo_vcstype_post; int HP_sysinfo_vcstypeid_pre; diff --git a/src/plugins/HPMHooking/HPMHooking_login.HookingPoints.inc b/src/plugins/HPMHooking/HPMHooking_login.HookingPoints.inc index 5be52d51e..5e501c62c 100644 --- a/src/plugins/HPMHooking/HPMHooking_login.HookingPoints.inc +++ b/src/plugins/HPMHooking/HPMHooking_login.HookingPoints.inc @@ -305,6 +305,7 @@ struct HookingPointData HookingPoints[] = { { HP_POP(sysinfo->is64bit, HP_sysinfo_is64bit) }, { HP_POP(sysinfo->compiler, HP_sysinfo_compiler) }, { HP_POP(sysinfo->cflags, HP_sysinfo_cflags) }, + { HP_POP(sysinfo->time, HP_sysinfo_time) }, { HP_POP(sysinfo->vcstype, HP_sysinfo_vcstype) }, { HP_POP(sysinfo->vcstypeid, HP_sysinfo_vcstypeid) }, { HP_POP(sysinfo->vcsrevision_src, HP_sysinfo_vcsrevision_src) }, diff --git a/src/plugins/HPMHooking/HPMHooking_login.Hooks.inc b/src/plugins/HPMHooking/HPMHooking_login.Hooks.inc index 670083e94..bf0610688 100644 --- a/src/plugins/HPMHooking/HPMHooking_login.Hooks.inc +++ b/src/plugins/HPMHooking/HPMHooking_login.Hooks.inc @@ -7183,6 +7183,33 @@ const char* HP_sysinfo_cflags(void) { } return retVal___; } +const char* HP_sysinfo_time(void) { + int hIndex = 0; + const char* retVal___ = NULL; + if( HPMHooks.count.HP_sysinfo_time_pre ) { + const char* (*preHookFunc) (void); + *HPMforce_return = false; + for(hIndex = 0; hIndex < HPMHooks.count.HP_sysinfo_time_pre; hIndex++ ) { + preHookFunc = HPMHooks.list.HP_sysinfo_time_pre[hIndex].func; + retVal___ = preHookFunc(); + } + if( *HPMforce_return ) { + *HPMforce_return = false; + return retVal___; + } + } + { + retVal___ = HPMHooks.source.sysinfo.time(); + } + if( HPMHooks.count.HP_sysinfo_time_post ) { + const char* (*postHookFunc) (const char* retVal___); + for(hIndex = 0; hIndex < HPMHooks.count.HP_sysinfo_time_post; hIndex++ ) { + postHookFunc = HPMHooks.list.HP_sysinfo_time_post[hIndex].func; + retVal___ = postHookFunc(retVal___); + } + } + return retVal___; +} const char* HP_sysinfo_vcstype(void) { int hIndex = 0; const char* retVal___ = NULL; diff --git a/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc b/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc index 2445074f6..911e84586 100644 --- a/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc +++ b/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc @@ -5698,6 +5698,8 @@ struct { struct HPMHookPoint *HP_sysinfo_compiler_post; struct HPMHookPoint *HP_sysinfo_cflags_pre; struct HPMHookPoint *HP_sysinfo_cflags_post; + struct HPMHookPoint *HP_sysinfo_time_pre; + struct HPMHookPoint *HP_sysinfo_time_post; struct HPMHookPoint *HP_sysinfo_vcstype_pre; struct HPMHookPoint *HP_sysinfo_vcstype_post; struct HPMHookPoint *HP_sysinfo_vcstypeid_pre; @@ -11547,6 +11549,8 @@ struct { int HP_sysinfo_compiler_post; int HP_sysinfo_cflags_pre; int HP_sysinfo_cflags_post; + int HP_sysinfo_time_pre; + int HP_sysinfo_time_post; int HP_sysinfo_vcstype_pre; int HP_sysinfo_vcstype_post; int HP_sysinfo_vcstypeid_pre; diff --git a/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc b/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc index 4ec436d51..303f5ed7e 100644 --- a/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc +++ b/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc @@ -2914,6 +2914,7 @@ struct HookingPointData HookingPoints[] = { { HP_POP(sysinfo->is64bit, HP_sysinfo_is64bit) }, { HP_POP(sysinfo->compiler, HP_sysinfo_compiler) }, { HP_POP(sysinfo->cflags, HP_sysinfo_cflags) }, + { HP_POP(sysinfo->time, HP_sysinfo_time) }, { HP_POP(sysinfo->vcstype, HP_sysinfo_vcstype) }, { HP_POP(sysinfo->vcstypeid, HP_sysinfo_vcstypeid) }, { HP_POP(sysinfo->vcsrevision_src, HP_sysinfo_vcsrevision_src) }, diff --git a/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc b/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc index f7b6ef056..e1ed4ebca 100644 --- a/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc +++ b/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc @@ -76403,6 +76403,33 @@ const char* HP_sysinfo_cflags(void) { } return retVal___; } +const char* HP_sysinfo_time(void) { + int hIndex = 0; + const char* retVal___ = NULL; + if( HPMHooks.count.HP_sysinfo_time_pre ) { + const char* (*preHookFunc) (void); + *HPMforce_return = false; + for(hIndex = 0; hIndex < HPMHooks.count.HP_sysinfo_time_pre; hIndex++ ) { + preHookFunc = HPMHooks.list.HP_sysinfo_time_pre[hIndex].func; + retVal___ = preHookFunc(); + } + if( *HPMforce_return ) { + *HPMforce_return = false; + return retVal___; + } + } + { + retVal___ = HPMHooks.source.sysinfo.time(); + } + if( HPMHooks.count.HP_sysinfo_time_post ) { + const char* (*postHookFunc) (const char* retVal___); + for(hIndex = 0; hIndex < HPMHooks.count.HP_sysinfo_time_post; hIndex++ ) { + postHookFunc = HPMHooks.list.HP_sysinfo_time_post[hIndex].func; + retVal___ = postHookFunc(retVal___); + } + } + return retVal___; +} const char* HP_sysinfo_vcstype(void) { int hIndex = 0; const char* retVal___ = NULL; |