From 400729a3dc436fbd6fc59620a229f92cc5956475 Mon Sep 17 00:00:00 2001 From: mkrsym1 Date: Fri, 4 Aug 2023 22:55:10 +0300 Subject: [PATCH] Implement table saving functionality --- game_payload/blob/core.o | Bin 8306 -> 8458 bytes game_payload/include/core.h | 2 ++ game_payload/include/utils.h | 6 +++++- game_payload/src/main.c | 21 +++++++++++++++++---- game_payload/src/tx.c | 2 +- game_payload/src/utils.c | 32 +++++++++++++++++++++++++++++++- 6 files changed, 56 insertions(+), 7 deletions(-) diff --git a/game_payload/blob/core.o b/game_payload/blob/core.o index f9c35f570bc8f2e667d7af77ba51d9188de3445d..238922832f1137949d25666d0a4f18afd0584549 100644 GIT binary patch delta 1886 zcmZYAe`wTo9LMp`_kQiZy6?Q(xlP-|>8)w8Rt^Ns<&UY`oU^87lTwzn>!!JLoTnXQ zd6F*takCxoP+=1*Qlbom3;M@SA%hfyjQqzRL?TwOAo?RhHuUv*e?I%9eLwL1?&0(E z{eJKJ>(0NIA8vBG-=8Vu_{$Mud(No{pYsVZ?iHeVDtA$vTNt;0gwF*Y*^h!^Ir&U(8SVKk!ty?jM`qI^>L^ z{Vp%Eb^oRL-wyvbC>tCt*_hbY+qWau8%v~O-E*kcZVOsIOZb|EpgwzsJ&ap=8cR)n z&~C9ZFX1>o@jBLRtX`};SVys5%Q}Vide%2sKgaq3>qV@ev0luQC$)hUv4m)6H9+fF z??NxK?nCM*BIB9l8R%u6UV#VxJgXggg|!Jz=S#Luxu#(VH)?R2CYY^+27hG_;0w z98!CXLTZmRW}eRQ^nfI5pV0xMgGO1SVWSU?P8b1vJTIa()>WEpye5-F z?bbyJ4^@klg7uKtNBlP6Sgl^d?|kE@i*w?GedKJ~8BmT{%H zs~m8Zk6oqUDmPu_UsoxcD!<~7onwRkA52Dd)*Y^raFs)kl{5L<(>nuCyty+O>*|Xo t-`bh%?MkIZeX@INYHLk@e?MKTET=7HVH%oMPH)V1C|ecG4_DstJp_X8%trtK delta 1720 zcmZY9TSyd99LMo9v(CDkyXLm(DprcS(dD5`63xoIlv-*RySQ|Huv{Yw3j>X6gEB>> z+)jv4QV$hEX2J&9LsAcg8bOjl^cW$&bfJf`i_q`<=XgTqfM-AZowGZ$bFr=Hdx87# z4`BW|CkGlsFhHpYhMP-lTicF6e*?r<=c8M&Kg1n{OJGUE3n1NBbE+FSsJ zJu;oDwel2giM<#3rHhwn8TLW&jfCmP!ey3a-nqo04jr)^LJ1XTFs}SIw+qnw)u@lsEk)atxy#|4Ru5N zc@NYJ)$$k6AXFdyY;)?dxA9Bbje+R2aaHGij+;E_EK3wWFMu;6MkZdxSxSzMI7_wg zR-_oV5A$Zyam?FDS1@lO-NL+`^c3?-(re5)q;br-q)E&>NM4Pxa#9vlK{^Ljl72(x zx3I82!+TH_Z7#(1TSKaVc9Mcn9_bLYmUIkSM>++qC!L4#NzKp(QUod>bwh=uJ5Ui6 zj$!w~Vv3KUjie!H6KNDGA&o($Bps*EJpNc{7qwz&H>nQVLu!P|OkrL|I;(U+C`|E^ zimgf=N}WpAmAaJx`f3|4!B;9otxf(tOC=%9xL_5Z>Z~VALs9^K$o% z=r{LA-M6CQNMi$SHka8narXrHpM;S1h}U@hT7b8B{66tG+2y+bFG2p?;}6%!4Y*Ai zE;B}pEb~<9lLgO^Tr(z%N0lG4h=<<%o&~WWhWK@6DU?MVk6A)tndYk0E(?CXTr?m{ zyei|eB&qUC7W}i3pIRu+G=_M>%$*g1C&gWh;UY-{3Qz5eh;_3?DMi)*UP z?6lufMlEH+Qgm_c void core_setup_patcher(struct game_data *game, HMODULE baseModule); + +void *core_perform_tx(size_t *outLength); diff --git a/game_payload/include/utils.h b/game_payload/include/utils.h index 237c3e5..d9c4099 100644 --- a/game_payload/include/utils.h +++ b/game_payload/include/utils.h @@ -2,7 +2,11 @@ #include -int utils_file_exists(const wchar_t *filePath); +int utils_path_exists(const wchar_t *filePath); uint32_t utils_file_crc32c(const wchar_t *filePath); +void utils_create_dir_recursively(const wchar_t *path); + +void utils_save_to_file(const wchar_t *filePath, const void *buf, size_t length); + char utils_env_enabled(const char *env); diff --git a/game_payload/src/main.c b/game_payload/src/main.c index 9ca76f0..718e7a4 100644 --- a/game_payload/src/main.c +++ b/game_payload/src/main.c @@ -55,8 +55,24 @@ static void _run_game(struct game_data *game) { } static void _run_tx(struct game_data *game, wchar_t *tableFile) { + // Load unpatched base module + HMODULE baseModule = LoadLibraryA(game->base_module_name); + if (!baseModule) { + msg_err_a("Failed to load base module: %s", game->base_module_name); + } + // ...more magic + size_t tableSize; + void *table = core_perform_tx(&tableSize); + // Save to file + utils_create_dir_recursively(tableFile); + utils_save_to_file(tableFile, table, tableSize); + + // Cleanup + free(table); + + // The file should now exist: restart and launch the game request_restart(); exit(0); } @@ -80,10 +96,7 @@ BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved) { wchar_t tableFile[MAX_PATH]; tx_table_file(&game, tableFile); - // Remove this - msg_err_w(tableFile); - - if (1) { + if (utils_path_exists(tableFile)) { _run_game(&game); } else { _run_tx(&game, tableFile); diff --git a/game_payload/src/tx.c b/game_payload/src/tx.c index 42a9a23..e96e4ff 100644 --- a/game_payload/src/tx.c +++ b/game_payload/src/tx.c @@ -37,4 +37,4 @@ void tx_table_file(struct game_data *game, wchar_t *buf) { UnmapViewOfFile(baseMap); CloseHandle(hBaseMap); CloseHandle(baseFile); -} \ No newline at end of file +} diff --git a/game_payload/src/utils.c b/game_payload/src/utils.c index 1656eab..ef97869 100644 --- a/game_payload/src/utils.c +++ b/game_payload/src/utils.c @@ -5,7 +5,7 @@ #include -int utils_file_exists(const wchar_t *filePath) { +int utils_path_exists(const wchar_t *filePath) { return GetFileAttributesW(filePath) != INVALID_FILE_ATTRIBUTES; } @@ -33,6 +33,36 @@ uint32_t utils_file_crc32c(const wchar_t *filePath) { return crc; } +// https://stackoverflow.com/a/16719260 +void utils_create_dir_recursively(const wchar_t *path) { + wchar_t dir[MAX_PATH]; + ZeroMemory(dir, MAX_PATH * sizeof(wchar_t)); + + wchar_t *end = wcschr(path, L'\\'); + + while(end != NULL) + { + wcsncpy(dir, path, end - path + 1); + + if (!utils_path_exists(dir) && !CreateDirectoryW(dir, NULL)) { + msg_err_w(L"Failed to create directory: %ls", dir); + } + + end = wcschr(++end, L'\\'); + } +} + +void utils_save_to_file(const wchar_t *filePath, const void *buf, size_t length) { + HANDLE file = CreateFileW(filePath, FILE_WRITE_ACCESS, FILE_SHARE_READ, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); + if (!file) { + msg_err_w(L"Could not open file: %ls", filePath); + } + + WriteFile(file, buf, length, NULL, FALSE); + + CloseHandle(file); +} + char utils_env_enabled(const char *env) { char *envText = getenv(env); return envText && *envText;