Files
djhackersdev_bemanitools/src/main/ddrhook1/dllmain.c
T
icex2 d4ad25f110 feat(ddrhook1): Use sdk-hook and support new config api
Summary:

Test Plan:
Summary:

Test Plan:
2024-08-17 12:50:14 +02:00

72 lines
2.2 KiB
C

#include <windows.h>
#include "hook/table.h"
#include "ddrhook1/ddrhook1.h"
#include "main/sdk-hook/dllentry.h"
#include "util/defs.h"
static DWORD STDCALL
_ddrhook1_dllmain_my_GetModuleFileNameA(HMODULE hModule, LPSTR lpFilename, DWORD nSize);
static DWORD(STDCALL *_ddrhook1_dllmain_real_GetModuleFileNameA)(
HMODULE hModule, LPSTR lpFilename, DWORD nSize);
static bool _ddrhook1_dllmain_getmodulefilenamea_call_check;
static const struct hook_symbol _ddrhook1_dllmain_hook_syms[] = {
{
.name = "GetModuleFileNameA",
.patch = _ddrhook1_dllmain_my_GetModuleFileNameA,
.link = (void **) &_ddrhook1_dllmain_real_GetModuleFileNameA,
},
};
static DWORD STDCALL
_ddrhook1_dllmain_my_GetModuleFileNameA(HMODULE hModule, LPSTR lpFilename, DWORD nSize)
{
if (_ddrhook1_dllmain_getmodulefilenamea_call_check) {
return _ddrhook1_dllmain_real_GetModuleFileNameA(hModule, lpFilename, nSize);
}
_ddrhook1_dllmain_getmodulefilenamea_call_check = true;
bt_hook_dllentry_main_init();
return _ddrhook1_dllmain_real_GetModuleFileNameA(hModule, lpFilename, nSize);
}
// TODO find another call right before main exits to hook cleanup and stuff with
// bt_hook_dllentry_main_fini()
BOOL WINAPI DllMain(HMODULE mod, DWORD reason, void *ctx)
{
if (reason == DLL_PROCESS_ATTACH) {
bt_hook_dllentry_init(
mod,
"ddrhook1",
bt_module_core_config_api_set,
bt_module_core_log_api_set,
bt_module_core_thread_api_set,
bt_module_hook_api_get);
_ddrhook1_dllmain_getmodulefilenamea_call_check = false;
hook_table_apply(
NULL, "kernel32.dll", _ddrhook1_dllmain_hook_syms, lengthof(_ddrhook1_dllmain_hook_syms));
} else if (reason == DLL_PROCESS_DETACH) {
// https://learn.microsoft.com/en-us/windows/win32/dlls/dllmain#remarks
if (ctx == NULL) {
hook_table_revert(NULL, "kernel32.dll", _ddrhook1_dllmain_hook_syms, lengthof(_ddrhook1_dllmain_hook_syms));
// Hacky to have this here, should be close/right after application main exits, see TODO above
bt_hook_dllentry_main_fini();
bt_hook_dllentry_fini();
}
}
return TRUE;
}