#include #include #include #include #include #include #include #include #include HMODULE this_module; size_t unload_ctr = 0; void unload_ctr_inc() { unload_ctr++; } void unload_ctr_dec() { unload_ctr--; if (unload_ctr == 0) { void *pFreeLibrary = GetProcAddress(GetModuleHandleA("kernel32.dll"), "FreeLibrary"); CreateThread(NULL, 0, pFreeLibrary, this_module, 0, NULL); } } void request_restart() { HANDLE hRestartFlag = OpenFileMappingA(FILE_MAP_ALL_ACCESS, FALSE, "Global\\JadeiteRestartFlag"); int *restartFlag = MapViewOfFile(hRestartFlag, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(int)); if (!restartFlag) { msg_err_a("Could not map shared memory to set restart flag"); } *restartFlag = 1; UnmapViewOfFile(restartFlag); 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) { return TRUE; } this_module = instance; // Dynamically link functions from ntdll ntdll_link(); // Detect which game the user is trying to run struct game_data game; game_detect(&game); // Get required table file path wchar_t tableFile[MAX_PATH]; tx_table_file(&game, tableFile); // Remove this msg_err_w(tableFile); if (1) { _run_game(&game); } else { _run_tx(&game, tableFile); } return TRUE; }