Add in more filesystem hooks
This commit is contained in:
+150
-10
@@ -1,6 +1,7 @@
|
|||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
#include <stdio.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -12,14 +13,56 @@
|
|||||||
#include "util/mem.h"
|
#include "util/mem.h"
|
||||||
|
|
||||||
static BOOL STDCALL my_SetCurrentDirectoryA(LPCTSTR lpPathName);
|
static BOOL STDCALL my_SetCurrentDirectoryA(LPCTSTR lpPathName);
|
||||||
|
static HANDLE STDCALL my_FindFirstFileA(
|
||||||
|
LPCSTR lpFileName,
|
||||||
|
LPWIN32_FIND_DATAA lpFindFileData);
|
||||||
|
static HANDLE STDCALL my_CreateFileA(
|
||||||
|
LPCSTR lpFileName,
|
||||||
|
DWORD dwDesiredAccess,
|
||||||
|
DWORD dwShareMode,
|
||||||
|
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
|
||||||
|
DWORD dwCreationDisposition,
|
||||||
|
DWORD dwFlagsAndAttributes,
|
||||||
|
HANDLE hTemplateFile);
|
||||||
|
static BOOL WINAPI my_CreateDirectoryA(
|
||||||
|
LPCSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes);
|
||||||
|
|
||||||
static BOOL(STDCALL *real_SetCurrentDirectoryA)(LPCTSTR lpPathName);
|
static BOOL(STDCALL *real_SetCurrentDirectoryA)(LPCTSTR lpPathName);
|
||||||
|
static HANDLE(STDCALL *real_FindFirstFileA)(
|
||||||
|
LPCSTR lpFileName,
|
||||||
|
LPWIN32_FIND_DATAA lpFindFileData);
|
||||||
|
static HANDLE(STDCALL *real_CreateFileA)(
|
||||||
|
LPCSTR lpFileName,
|
||||||
|
DWORD dwDesiredAccess,
|
||||||
|
DWORD dwShareMode,
|
||||||
|
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
|
||||||
|
DWORD dwCreationDisposition,
|
||||||
|
DWORD dwFlagsAndAttributes,
|
||||||
|
HANDLE hTemplateFile);
|
||||||
|
static BOOL(WINAPI *real_CreateDirectoryA)(
|
||||||
|
LPCSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes);
|
||||||
|
|
||||||
static const struct hook_symbol filesystem_hook_syms[] = {
|
static const struct hook_symbol filesystem_hook_syms[] = {
|
||||||
|
{
|
||||||
|
.name = "CreateFileA",
|
||||||
|
.patch = my_CreateFileA,
|
||||||
|
.link = (void **) &real_CreateFileA
|
||||||
|
},
|
||||||
{
|
{
|
||||||
.name = "SetCurrentDirectoryA",
|
.name = "SetCurrentDirectoryA",
|
||||||
.patch = my_SetCurrentDirectoryA,
|
.patch = my_SetCurrentDirectoryA,
|
||||||
.link = (void **) &real_SetCurrentDirectoryA,
|
.link = (void **) &real_SetCurrentDirectoryA,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.name = "FindFirstFileA",
|
||||||
|
.patch = my_FindFirstFileA,
|
||||||
|
.link = (void **) &real_FindFirstFileA
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.name = "CreateDirectoryA",
|
||||||
|
.patch = my_CreateDirectoryA,
|
||||||
|
.link = (void **) &real_CreateDirectoryA
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
void ddrhook1_get_launcher_path_parts(char **output_path, char **output_foldername) {
|
void ddrhook1_get_launcher_path_parts(char **output_path, char **output_foldername) {
|
||||||
@@ -82,24 +125,121 @@ void ddrhook1_get_launcher_path_parts(char **output_path, char **output_folderna
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOL STDCALL my_SetCurrentDirectoryA(LPCTSTR lpPathName)
|
static char *ddrhook1_filesystem_get_path(LPCTSTR path)
|
||||||
{
|
{
|
||||||
if (stricmp(lpPathName, "D:/HDX") == 0
|
char *new_path = NULL;
|
||||||
|| stricmp(lpPathName, "D:\\HDX") == 0) {
|
|
||||||
char *new_path;
|
|
||||||
ddrhook1_get_launcher_path_parts(&new_path, NULL);
|
|
||||||
|
|
||||||
if (new_path != NULL) {
|
// Hardcoded paths: D:/HDX, E:/conf, E:/conf/nvram, E:/conf/raw
|
||||||
bool r = real_SetCurrentDirectoryA(new_path);
|
if (stricmp(path, "D:/HDX") == 0
|
||||||
log_misc("Changed directory %s -> %s", lpPathName, new_path);
|
|| stricmp(path, "D:\\HDX") == 0) {
|
||||||
free(new_path);
|
ddrhook1_get_launcher_path_parts(&new_path, NULL);
|
||||||
return r;
|
} else if (strnicmp(path, "E:/conf", 7) == 0
|
||||||
|
|| strnicmp(path, "E:\\conf", 7) == 0) {
|
||||||
|
char *launcher_folder;
|
||||||
|
char *conf_path;
|
||||||
|
|
||||||
|
ddrhook1_get_launcher_path_parts(NULL, &launcher_folder);
|
||||||
|
conf_path = strstr(path, "conf");
|
||||||
|
|
||||||
|
if (conf_path && launcher_folder) {
|
||||||
|
new_path = (char*)xmalloc(MAX_PATH);
|
||||||
|
sprintf(new_path, "%s\\%s", launcher_folder, conf_path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return new_path;
|
||||||
|
}
|
||||||
|
|
||||||
|
static BOOL STDCALL my_SetCurrentDirectoryA(LPCTSTR lpPathName)
|
||||||
|
{
|
||||||
|
char *new_path = ddrhook1_filesystem_get_path(lpPathName);
|
||||||
|
|
||||||
|
if (new_path != NULL) {
|
||||||
|
bool r = real_SetCurrentDirectoryA(new_path);
|
||||||
|
log_misc("SetCurrentDirectoryA remapped path %s -> %s", lpPathName, new_path);
|
||||||
|
free(new_path);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
return real_SetCurrentDirectoryA(lpPathName);
|
return real_SetCurrentDirectoryA(lpPathName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static HANDLE STDCALL my_FindFirstFileA(
|
||||||
|
LPCSTR lpFileName,
|
||||||
|
LPWIN32_FIND_DATAA lpFindFileData)
|
||||||
|
{
|
||||||
|
char *new_path = ddrhook1_filesystem_get_path(lpFileName);
|
||||||
|
|
||||||
|
if (new_path) {
|
||||||
|
HANDLE r = real_FindFirstFileA(
|
||||||
|
new_path,
|
||||||
|
lpFindFileData);
|
||||||
|
|
||||||
|
log_misc("FindFirstFileA remapped path: %s -> %s\n", lpFileName, new_path);
|
||||||
|
|
||||||
|
free(new_path);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
return real_FindFirstFileA(
|
||||||
|
lpFileName,
|
||||||
|
lpFindFileData);
|
||||||
|
}
|
||||||
|
|
||||||
|
static HANDLE STDCALL my_CreateFileA(
|
||||||
|
LPCSTR lpFileName,
|
||||||
|
DWORD dwDesiredAccess,
|
||||||
|
DWORD dwShareMode,
|
||||||
|
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
|
||||||
|
DWORD dwCreationDisposition,
|
||||||
|
DWORD dwFlagsAndAttributes,
|
||||||
|
HANDLE hTemplateFile)
|
||||||
|
{
|
||||||
|
char *new_path = ddrhook1_filesystem_get_path(lpFileName);
|
||||||
|
|
||||||
|
if (new_path) {
|
||||||
|
HANDLE r = real_CreateFileA(
|
||||||
|
new_path,
|
||||||
|
dwDesiredAccess,
|
||||||
|
dwShareMode,
|
||||||
|
lpSecurityAttributes,
|
||||||
|
dwCreationDisposition,
|
||||||
|
dwFlagsAndAttributes,
|
||||||
|
hTemplateFile);
|
||||||
|
|
||||||
|
log_misc("CreateFileA remapped path %s -> %s", lpFileName, new_path);
|
||||||
|
|
||||||
|
free(new_path);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
return real_CreateFileA(
|
||||||
|
new_path ? new_path : lpFileName,
|
||||||
|
dwDesiredAccess,
|
||||||
|
dwShareMode,
|
||||||
|
lpSecurityAttributes,
|
||||||
|
dwCreationDisposition,
|
||||||
|
dwFlagsAndAttributes,
|
||||||
|
hTemplateFile);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL WINAPI my_CreateDirectoryA(
|
||||||
|
LPCSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes)
|
||||||
|
{
|
||||||
|
char *new_path = ddrhook1_filesystem_get_path(lpPathName);
|
||||||
|
|
||||||
|
if (new_path) {
|
||||||
|
BOOL r = real_CreateDirectoryA(new_path, lpSecurityAttributes);
|
||||||
|
|
||||||
|
log_misc("CreateDirectoryA remapped path %s -> %s", lpPathName, new_path);
|
||||||
|
|
||||||
|
free(new_path);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
return real_CreateDirectoryA(lpPathName, lpSecurityAttributes);
|
||||||
|
}
|
||||||
|
|
||||||
void ddrhook1_filesystem_hook_init()
|
void ddrhook1_filesystem_hook_init()
|
||||||
{
|
{
|
||||||
hook_table_apply(
|
hook_table_apply(
|
||||||
|
|||||||
Reference in New Issue
Block a user