Begin integrating TX

This commit is contained in:
mkrsym1
2023-08-04 22:17:31 +03:00
parent 592ce62e6b
commit 7eac309372
15 changed files with 104 additions and 20 deletions

View File

@ -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;

View File

@ -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;

View File

@ -6,6 +6,7 @@
#include <core.h>
#include <utils.h>
#include <msg.h>
#include <tx.h>
#include <main.h>
@ -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;
}

View File

@ -1,5 +1,6 @@
#include <windows.h>
#include <stdio.h>
#include <config.h>
#include <msg.h>
@ -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))

View File

@ -1,7 +1,7 @@
#include <pe.h>
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);

40
game_payload/src/tx.c Normal file
View File

@ -0,0 +1,40 @@
#include <windows.h>
#include <stdio.h>
#include <crc32.h>
#include <msg.h>
#include <pe.h>
#include <main.h>
#include <config.h>
#include <tx.h>
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);
}

View File

@ -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);