From 67582c8e1dedd808ac2fecc13728fc4edff96b5e Mon Sep 17 00:00:00 2001 From: Maschell Date: Fri, 29 May 2020 17:37:01 +0200 Subject: [PATCH] Add initial support for hooks --- include/wums.h | 1 + include/wums/hooks.h | 58 ++++++++++++++++++++++++++++++++++++++++++++ share/wums.ld | 6 +++++ 3 files changed, 65 insertions(+) create mode 100644 include/wums/hooks.h diff --git a/include/wums.h b/include/wums.h index 9a71c8e..7a26dc5 100644 --- a/include/wums.h +++ b/include/wums.h @@ -3,5 +3,6 @@ #include "wums/common.h" #include "wums/exports.h" +#include "wums/hooks.h" #endif /* WUMS_H_ */ \ No newline at end of file diff --git a/include/wums/hooks.h b/include/wums/hooks.h new file mode 100644 index 0000000..93296b1 --- /dev/null +++ b/include/wums/hooks.h @@ -0,0 +1,58 @@ +/* based on blsug.h + * by Alex Chadwick + * + * Copyright (C) 2014, Alex Chadwick + * Modified by Maschell, 2018-2020 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#pragma once + +#include "common.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define WUMS_HOOK_EX(type_def,original_func) \ + extern const wums_hook_t wums_hooks_ ## original_func WUMS_SECTION("hooks"); \ + const wums_hook_t wums_hooks_ ## original_func = { \ + .type = type_def, \ + .target = (const void*)&(original_func) \ + } + +typedef enum wums_hook_type_t { + WUMS_HOOK_INIT, /* Called when exiting the plugin loader */ +} wums_hook_type_t; + +typedef struct wums_hook_t { + wums_hook_type_t type; /* Defines the type of the hook */ + const void *target; /* Address of our own, new function */ +} wums_hook_t; + + +#define WUMS_INITIALIZE() \ + void init_module(void);\ + WUMS_HOOK_EX(WUMS_HOOK_INIT,init_module); \ + void init_module() + +#ifdef __cplusplus +} +#endif diff --git a/share/wums.ld b/share/wums.ld index e42c42f..f1be264 100644 --- a/share/wums.ld +++ b/share/wums.ld @@ -456,10 +456,16 @@ SECTIONS *(.wums.meta*) KEEP(*(.wums.meta*)) } > datamem + .wums.exports : { *(.wums.exports*) KEEP(*(.wums.exports*)) } > datamem + + .wums.hooks : { + *(.wums.hooks*) + KEEP(*(.wums.hooks*)) + } > datamem /DISCARD/ : { *(.abs)