#define LOG_MODULE "settings-hook" #include #include #include #include #include #include "hook/table.h" #include "util/defs.h" #include "util/log.h" #include "util/str.h" /* ------------------------------------------------------------------------- */ static HANDLE STDCALL my_CreateFileA( LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile); static HANDLE(STDCALL *real_CreateFileA)( LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile); /* ------------------------------------------------------------------------- */ static const struct hook_symbol settings_hook_syms[] = { {.name = "CreateFileA", .patch = my_CreateFileA, .link = (void **) &real_CreateFileA}, }; /* ------------------------------------------------------------------------- */ static HANDLE STDCALL my_CreateFileA( LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile) { if (lpFileName != NULL && lpFileName[0] == 'e' && lpFileName[1] == ':') { HANDLE handle; char new_path[MAX_PATH]; strcpy(new_path, lpFileName); new_path[1] = '\\'; log_misc("Remapped settings path %s", new_path); handle = real_CreateFileA( new_path, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile); return handle; } return real_CreateFileA( lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile); } /* ------------------------------------------------------------------------- */ void settings_hook_init(void) { hook_table_apply( NULL, "kernel32.dll", settings_hook_syms, lengthof(settings_hook_syms)); log_info("Inserted settings hooks"); }