From 7eac3093722e5d3c4122f90c3f74572382c7f28d Mon Sep 17 00:00:00 2001 From: mkrsym1 Date: Fri, 4 Aug 2023 22:17:31 +0300 Subject: [PATCH] Begin integrating TX --- game_payload/blob/core.o | Bin 8306 -> 8306 bytes game_payload/include/config.h.in | 1 + game_payload/include/crc32.h | 6 +++-- game_payload/include/game.h | 1 + game_payload/include/main.h | 2 ++ game_payload/include/pe.h | 2 +- game_payload/include/tx.h | 3 +++ game_payload/meson.build | 9 ++++++- game_payload/src/hi3.c | 2 ++ game_payload/src/hsr.c | 2 ++ game_payload/src/main.c | 45 +++++++++++++++++++++++-------- game_payload/src/msg.c | 5 ++-- game_payload/src/pe.c | 4 +-- game_payload/src/tx.c | 40 +++++++++++++++++++++++++++ game_payload/src/utils.c | 2 +- 15 files changed, 104 insertions(+), 20 deletions(-) create mode 100644 game_payload/include/config.h.in create mode 100644 game_payload/include/tx.h create mode 100644 game_payload/src/tx.c diff --git a/game_payload/blob/core.o b/game_payload/blob/core.o index 6cc56b7e6f7d1610ceee9f0f42596b53325c320e..f9c35f570bc8f2e667d7af77ba51d9188de3445d 100644 GIT binary patch delta 147 zcmez5@X2AreHKQA%@0^om>4Z4yRxrgRG9pU-8IyKfq}uJ^ZE-Q#qgOwpACrp1Uxz` z41kO<1&_|d{DKVpf*u0=f&mI(MLxaW7M`6q3{QG=vw}2v^orL0{{P>jo57>`h(dH+ qyvP3slY2P6FizOq$T^#dJA;LRAq=RFg`r}zI*&UGP&{9NSpWbj2rmi% delta 147 zcmez5@X2AreHKQE%@0^om>3NvyRxrgl$iX9-8IyLfq}uJ^ZE-Q#qgOwpACrp1Uxzq z^9wTY3wj86bh{~dbXIG4bUG`5)%f&!8+dl!Fg)qe%?i@v(JNZ_`~QEBZU&F$BMQ-R r@gDylOqkrm@rAK}b0g<$Chl|=28J-8LKcSd&FVbvEI{#m0cHUJB||S@ diff --git a/game_payload/include/config.h.in b/game_payload/include/config.h.in new file mode 100644 index 0000000..edce6c0 --- /dev/null +++ b/game_payload/include/config.h.in @@ -0,0 +1 @@ +#define JADEITE_VERSION "@version@" \ No newline at end of file diff --git a/game_payload/include/crc32.h b/game_payload/include/crc32.h index 9d82725..4021f10 100644 --- a/game_payload/include/crc32.h +++ b/game_payload/include/crc32.h @@ -8,11 +8,13 @@ /* CRC-32C (iSCSI) polynomial in reversed bit order. */ #define __POLY 0x82f63b78 -static inline uint32_t crc32c(uint32_t crc, const unsigned char *buf, size_t len) { +static inline uint32_t crc32c(uint32_t crc, const void *buf, size_t len) { + const unsigned char *cbuf = (const unsigned char*)buf; + crc = ~crc; while (len--) { - crc ^= *buf++; + crc ^= *cbuf++; for (int k = 0; k < 8; k++) { crc = crc & 1 ? (crc >> 1) ^ __POLY : crc >> 1; } diff --git a/game_payload/include/game.h b/game_payload/include/game.h index 322f976..d239faa 100644 --- a/game_payload/include/game.h +++ b/game_payload/include/game.h @@ -24,6 +24,7 @@ struct game_data { enum game_id id; // Temporary const char *base_module_name; const char *assembly_name; + const char *txs_section_name; const char *tvm_section_name; unityplayer_callback_t unityplayer_callback; diff --git a/game_payload/include/main.h b/game_payload/include/main.h index 89bb790..347b4f8 100644 --- a/game_payload/include/main.h +++ b/game_payload/include/main.h @@ -1,5 +1,7 @@ #pragma once +#define ISSUE_SUFFIX "Please open an issue on the jadeite repository specifying your game edition/region and version" + void unload_ctr_inc(); void unload_ctr_dec(); diff --git a/game_payload/include/pe.h b/game_payload/include/pe.h index 7233a21..8d10d5f 100644 --- a/game_payload/include/pe.h +++ b/game_payload/include/pe.h @@ -2,6 +2,6 @@ #include -IMAGE_SECTION_HEADER *pe_find_section(HMODULE module, const char *section); +IMAGE_SECTION_HEADER *pe_find_section(const void *module, const char *section); void *pe_find_entry_point(HMODULE module); diff --git a/game_payload/include/tx.h b/game_payload/include/tx.h new file mode 100644 index 0000000..96cc744 --- /dev/null +++ b/game_payload/include/tx.h @@ -0,0 +1,3 @@ +#include + +void tx_table_file(struct game_data *game, wchar_t *buf); diff --git a/game_payload/meson.build b/game_payload/meson.build index 6350596..6be0c52 100644 --- a/game_payload/meson.build +++ b/game_payload/meson.build @@ -12,7 +12,8 @@ sources = [ 'src/hi3.c', 'src/hsr.c', 'src/utils.c', - 'src/msg.c' + 'src/msg.c', + 'src/tx.c' ] resources = [ 'res/hi3/glb.dat', @@ -70,12 +71,18 @@ else core_blob = [ 'blob/core.o' ] endif +conf_data = configuration_data() +conf_data.set('version', meson.project_version()) + +conf = configure_file(input: 'include/config.h.in', output: 'config.h', configuration: conf_data) + shared_library( 'game_payload', sources, res_header, res_object, core_target, + conf, objects: core_blob, include_directories: include_dir, name_prefix: '' diff --git a/game_payload/src/hi3.c b/game_payload/src/hi3.c index 77354e2..2bb3dee 100644 --- a/game_payload/src/hi3.c +++ b/game_payload/src/hi3.c @@ -5,6 +5,7 @@ const char *HI3_BASE_MODULE_NAME = "BH3Base.dll"; const char *HI3_ASSEMBLY_NAME = "UserAssembly.dll"; +const char *HI3_TXS_SECTION_NAME = ".bh3"; const char *HI3_TVM_SECTION_NAME = ".tvm0"; struct crc_id_pair { @@ -40,6 +41,7 @@ void hi3_fill_data(struct game_data *buf) { buf->id = id; buf->base_module_name = HI3_BASE_MODULE_NAME; buf->assembly_name = HI3_ASSEMBLY_NAME; + buf->txs_section_name = HI3_TXS_SECTION_NAME; buf->tvm_section_name = HI3_TVM_SECTION_NAME; buf->unityplayer_callback = NULL; diff --git a/game_payload/src/hsr.c b/game_payload/src/hsr.c index 5c02225..b4b04ff 100644 --- a/game_payload/src/hsr.c +++ b/game_payload/src/hsr.c @@ -6,6 +6,7 @@ const char *HSR_BASE_MODULE_NAME = "StarRailBase.dll"; const char *HSR_ASSEMBLY_NAME = "GameAssembly.dll"; +const char *HSR_TXS_SECTION_NAME = ".ace"; const char *HSR_TVM_SECTION_NAME = ".tvm0"; struct crc_id_pair { @@ -86,6 +87,7 @@ void hsr_fill_data(struct game_data *buf) { buf->id = id; buf->base_module_name = HSR_BASE_MODULE_NAME; buf->assembly_name = HSR_ASSEMBLY_NAME; + buf->txs_section_name = HSR_TXS_SECTION_NAME; buf->tvm_section_name = HSR_TVM_SECTION_NAME; buf->unityplayer_callback = &_unityplayer_callback; diff --git a/game_payload/src/main.c b/game_payload/src/main.c index 0dc47de..9ca76f0 100644 --- a/game_payload/src/main.c +++ b/game_payload/src/main.c @@ -6,6 +6,7 @@ #include #include #include +#include #include @@ -37,6 +38,29 @@ void request_restart() { CloseHandle(hRestartFlag); } +static void _run_game(struct game_data *game) { + // Create fake ACE driver files + ace_fake_driver_files(); + + // Load both ACE modules + HMODULE baseModule = ace_load_base_module(game); + ace_load_driver_module(); + + // ...magic + core_setup_patcher(game, baseModule); + + // Load the UnityPlayer module and invoke the callback + HMODULE unityModule = LoadLibraryA("UnityPlayer.dll"); + INVOKE_CALLBACK(game->unityplayer_callback, unityModule); +} + +static void _run_tx(struct game_data *game, wchar_t *tableFile) { + + + request_restart(); + exit(0); +} + BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved) { // Only listen to attach if (reason != DLL_PROCESS_ATTACH) { @@ -52,19 +76,18 @@ BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved) { struct game_data game; game_detect(&game); - // Create fake ACE driver files - ace_fake_driver_files(); + // Get required table file path + wchar_t tableFile[MAX_PATH]; + tx_table_file(&game, tableFile); - // Load both ACE modules - HMODULE baseModule = ace_load_base_module(&game); - ace_load_driver_module(); + // Remove this + msg_err_w(tableFile); - // ...magic - core_setup_patcher(&game, baseModule); - - // Load the UnityPlayer module and invoke the callback - HMODULE unityModule = LoadLibraryA("UnityPlayer.dll"); - INVOKE_CALLBACK(game.unityplayer_callback, unityModule); + if (1) { + _run_game(&game); + } else { + _run_tx(&game, tableFile); + } return TRUE; } diff --git a/game_payload/src/msg.c b/game_payload/src/msg.c index ae06075..be30e14 100644 --- a/game_payload/src/msg.c +++ b/game_payload/src/msg.c @@ -1,5 +1,6 @@ #include #include +#include #include @@ -21,8 +22,8 @@ suffix; \ } -const char *TITLE_A = "Jadeite Autopatcher"; -const wchar_t *TITLE_W = L"Jadeite Autopatcher"; +const char *TITLE_A = "v" JADEITE_VERSION "Jadeite Autopatcher"; +const wchar_t *TITLE_W = L"v" JADEITE_VERSION "Jadeite Autopatcher"; // Error DEF_MSG_FN(msg_err_a, char, _vsnprintf, MessageBoxA, TITLE_A, MB_OK | MB_ICONERROR, exit(1)) diff --git a/game_payload/src/pe.c b/game_payload/src/pe.c index 12273b6..f527fba 100644 --- a/game_payload/src/pe.c +++ b/game_payload/src/pe.c @@ -1,7 +1,7 @@ #include -IMAGE_SECTION_HEADER *pe_find_section(HMODULE module, const char *section) { - char *cModule = (char*)module; +IMAGE_SECTION_HEADER *pe_find_section(const void *module, const char *section) { + const char *cModule = (const char*)module; IMAGE_DOS_HEADER* dosHeader = (IMAGE_DOS_HEADER*)module; IMAGE_NT_HEADERS64* ntHeaders = (IMAGE_NT_HEADERS64*)(cModule + dosHeader->e_lfanew); diff --git a/game_payload/src/tx.c b/game_payload/src/tx.c new file mode 100644 index 0000000..42a9a23 --- /dev/null +++ b/game_payload/src/tx.c @@ -0,0 +1,40 @@ +#include +#include + +#include +#include +#include +#include +#include + +#include + +void tx_table_file(struct game_data *game, wchar_t *buf) { + // Get temp directory path + wchar_t tempDir[MAX_PATH]; + GetTempPathW(MAX_PATH, tempDir); + + // Memorymap the base module + HANDLE baseFile = CreateFileA(game->base_module_name, FILE_READ_ACCESS, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (!baseFile) { + msg_err_a("Could not open file: %s", game->base_module_name); + } + + HANDLE hBaseMap = CreateFileMappingA(baseFile, NULL, PAGE_READONLY, 0, 0, NULL); + char *baseMap = MapViewOfFile(hBaseMap, FILE_MAP_READ, 0, 0, 0); + if (!baseMap) { + msg_err_a("Could not create file mapping for %s", game->base_module_name); + } + + // Checksum the TXS section + IMAGE_SECTION_HEADER *txsSection = pe_find_section(baseMap, game->txs_section_name); + uint32_t txsChecksum = crc32c(0, baseMap + txsSection->PointerToRawData, txsSection->SizeOfRawData); + + // Format the path + wsprintfW(buf, L"%sjadeite\\" JADEITE_VERSION "\\%hs.%x.dat", tempDir, game->base_module_name, txsChecksum); + + // Cleanup + 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 b94e735..1656eab 100644 --- a/game_payload/src/utils.c +++ b/game_payload/src/utils.c @@ -24,7 +24,7 @@ uint32_t utils_file_crc32c(const wchar_t *filePath) { msg_err_w(L"Could not create file mapping for %ls", filePath); } - uint32_t crc = crc32c(0, (unsigned char*)map, fileSize.QuadPart); + uint32_t crc = crc32c(0, map, fileSize.QuadPart); UnmapViewOfFile(map); CloseHandle(hMap);