From 25f5ca944ef67e3b7c7c6ccda2c01fa3c514c0a6 Mon Sep 17 00:00:00 2001 From: Felix Date: Thu, 5 Aug 2021 21:57:50 +0000 Subject: [PATCH] hooklib/path.c: Hook RemoveDirectory - A certain game uses RemoveDirectory to clear out some data in the Y: --- hooklib/path.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/hooklib/path.c b/hooklib/path.c index 6d27efc..0c6fe42 100644 --- a/hooklib/path.c +++ b/hooklib/path.c @@ -93,6 +93,10 @@ static BOOL WINAPI hook_GetFileAttributesExW( GET_FILEEX_INFO_LEVELS fInfoLevelId, void *lpFileInformation); +static BOOL WINAPI hook_RemoveDirectoryA(const char *lpFileName); + +static BOOL WINAPI hook_RemoveDirectoryW(const wchar_t *lpFileName); + /* Link pointers */ static BOOL (WINAPI *next_CreateDirectoryA)( @@ -169,6 +173,10 @@ static BOOL (WINAPI *next_GetFileAttributesExW)( GET_FILEEX_INFO_LEVELS fInfoLevelId, void *lpFileInformation); +static BOOL (WINAPI *next_RemoveDirectoryA)(const char *lpFileName); + +static BOOL (WINAPI *next_RemoveDirectoryW)(const wchar_t *lpFileName); + /* Hook table */ static const struct hook_symbol path_hook_syms[] = { @@ -228,6 +236,14 @@ static const struct hook_symbol path_hook_syms[] = { .name = "GetFileAttributesExW", .patch = hook_GetFileAttributesExW, .link = (void **) &next_GetFileAttributesExW, + }, { + .name = "RemoveDirectoryA", + .patch = hook_RemoveDirectoryA, + .link = (void **) &next_RemoveDirectoryA, + }, { + .name = "RemoveDirectoryW", + .patch = hook_RemoveDirectoryW, + .link = (void **) &next_RemoveDirectoryW, } }; @@ -802,3 +818,39 @@ static BOOL WINAPI hook_GetFileAttributesExW( return ok; } + +static BOOL WINAPI hook_RemoveDirectoryA(const char *lpFileName) +{ + char *trans; + BOOL ok; + + ok = path_transform_a(&trans, lpFileName); + + if (!ok) { + return FALSE; + } + + ok = next_RemoveDirectoryA(trans ? trans : lpFileName); + + free(trans); + + return ok; +} + +static BOOL WINAPI hook_RemoveDirectoryW(const wchar_t *lpFileName) +{ + wchar_t *trans; + BOOL ok; + + ok = path_transform_w(&trans, lpFileName); + + if (!ok) { + return FALSE; + } + + ok = next_RemoveDirectoryW(trans ? trans : lpFileName); + + free(trans); + + return ok; +}