// SPDX-License-Identifier: ISC // SPDX-FileCopyrightText: 2024 Matthew Wozniak #include "api.h" #include "hook.h" #include "log.h" #include "os.h" #include #define WIN32_LEAN_AND_MEAN #include void (*orig_cbuf_addtext)(char *); void hook_cbuf_addtext(char *str) { orig_cbuf_addtext(str); info("%s", str); // this is the last thing that happens when the game is opened if (!strcmp(str, "exec modsettings.cfg mod\n")) { demoplayer->vt->start_playback(demoplayer, "demo.dem", false); } } char *cmdline; char WINAPI *hook_GetCommandLineA(void) { return cmdline; } void *(WINAPI *orig_LoadLibraryExA)(const char *, void *, int); void WINAPI *hook_LoadLibraryExA(const char *filename, void *hfile, int flags) { // if the dll is already loaded, don't run our code again if (os_dlhandle(filename)) return orig_LoadLibraryExA(filename, hfile, flags); void *ret = orig_LoadLibraryExA(filename, hfile, flags); if (!ret) return ret; // cut down to basename for display const char *basename = filename; for (const char *p = filename; *p; p++) if (*p == '\\') basename = p + 1; info("loaded %s", basename); if (!strcmp(basename, "engine.dll")) { if (!api_init()) die("couldn't get apis"); orig_cbuf_addtext = (void (*)(char *)) hook_inline((void *)cbuf_addtext, (void *)hook_cbuf_addtext); } return ret; } typedef int (*LauncherMain_t)(void *instance, void *prev_inst, char *cmdline, int cmd_show); int main(/* int argc, char **argv */) { SetDllDirectoryA("bin/"); // TODO: make this changeable by the user cmdline = "hl2.exe -console -w 1280 -h 720 -window -high -dxlevel 95"; hook_init(); orig_LoadLibraryExA = (typeof(orig_LoadLibraryExA))hook_dllapi("kernel32", "LoadLibraryExA", (void *)hook_LoadLibraryExA); hook_dllapi("kernel32", "GetCommandLineA", (void *)hook_GetCommandLineA); info("GetCommandLineA() = %s", GetCommandLineA()); void *launcher_dll = os_dlopen("launcher"); LauncherMain_t launcher_main = (LauncherMain_t)os_dlsym(launcher_dll, "LauncherMain"); if (!launcher_main) die("couldn't open launcher"); launcher_main(NULL, NULL, cmdline, 0); } // vi: sw=4 ts=4 noet tw=80 cc=80