94 lines
2.3 KiB
C
94 lines
2.3 KiB
C
#define LOG_MODULE "settings-hook"
|
|
|
|
#include <windows.h>
|
|
|
|
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
#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");
|
|
}
|