From 0d3fa54316fe24e041480026bf75b5f6668ae220 Mon Sep 17 00:00:00 2001 From: Will Xyen Date: Sat, 4 Apr 2020 23:37:10 -0700 Subject: [PATCH] launcher: Add before-hook support Required to hook certain things that happen on module load / avs boot: - network adapter hooking for avs - envvar setting Note: the logging facilities are NOT setup yet at this point so these hooks cannot use avs for logging --- src/main/launcher/main.c | 52 +++++++++++++++++++++---------------- src/main/launcher/options.c | 14 ++++++++++ src/main/launcher/options.h | 1 + 3 files changed, 44 insertions(+), 23 deletions(-) diff --git a/src/main/launcher/main.c b/src/main/launcher/main.c index 5f6f469..5330504 100644 --- a/src/main/launcher/main.c +++ b/src/main/launcher/main.c @@ -93,10 +93,34 @@ static AVS_LOG_WRITER(log_callback, chars, nchars, ctx) free(utf16); } +static void load_hook_dlls(struct array* hook_dlls) { + const char *hook_dll; + + for (size_t i = 0; i < hook_dlls->nitems; i++) { + hook_dll = *array_item(char *, hook_dlls, i); + + if (LoadLibraryA(hook_dll) == NULL) { + LPSTR buffer; + + FormatMessageA( + FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + GetLastError(), + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPSTR) &buffer, + 0, + NULL); + + log_fatal("%s: Failed to load hook DLL: %s", hook_dll, buffer); + + LocalFree(buffer); + } + } +} + int main(int argc, const char **argv) { - int i; - const char *hook_dll; bool ok; HANDLE logfile; @@ -170,6 +194,8 @@ int main(int argc, const char **argv) log_fatal("%s: /config missing", options.avs_config_path); } + load_hook_dlls(&options.before_hook_dlls); + avs_context_init( avs_config_root, options.avs_heap_size, @@ -188,27 +214,7 @@ int main(int argc, const char **argv) /* Load hook DLLs */ - for (i = 0; i < options.hook_dlls.nitems; i++) { - hook_dll = *array_item(char *, &options.hook_dlls, i); - - if (LoadLibraryA(hook_dll) == NULL) { - LPSTR buffer; - - FormatMessageA( - FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | - FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, - GetLastError(), - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPSTR) &buffer, - 0, - NULL); - - log_fatal("%s: Failed to load hook DLL: %s", hook_dll, buffer); - - LocalFree(buffer); - } - } + load_hook_dlls(&options.hook_dlls); /* Inject GetModuleHandle hooks */ diff --git a/src/main/launcher/options.c b/src/main/launcher/options.c index 11c1b51..91be9c0 100644 --- a/src/main/launcher/options.c +++ b/src/main/launcher/options.c @@ -23,6 +23,7 @@ void options_init(struct options *options) options->logfile = NULL; options->remote_debugger = false; array_init(&options->hook_dlls); + array_init(&options->before_hook_dlls); } bool options_read_cmdline(struct options *options, int argc, const char **argv) @@ -115,6 +116,16 @@ bool options_read_cmdline(struct options *options, int argc, const char **argv) break; + case 'B': + if (i + 1 >= argc) { + return false; + } + + *array_append(const char *, &options->before_hook_dlls) = + argv[++i]; + + break; + case 'Y': if (i + 1 >= argc) { return false; @@ -170,6 +181,8 @@ void options_print_usage(void) " -R [pcbid] Specify Soft ID (default: use ea3 config)\n" " -K [filename] Load hook DLL (can be specified multiple " "times)\n" + " -B [filename] Load pre-hook DLL loaded before avs boot " + "(can be specified multiple times)\n" " -Y [filename] Log to a file in addition to the console\n" " -D Halt the launcher before bootstrapping AVS " "until a" @@ -179,4 +192,5 @@ void options_print_usage(void) void options_fini(struct options *options) { array_fini(&options->hook_dlls); + array_fini(&options->before_hook_dlls); } diff --git a/src/main/launcher/options.h b/src/main/launcher/options.h index 30ebe5b..b7f0c01 100644 --- a/src/main/launcher/options.h +++ b/src/main/launcher/options.h @@ -17,6 +17,7 @@ struct options { const char *module; const char *logfile; struct array hook_dlls; + struct array before_hook_dlls; bool remote_debugger; };