Files
esuo1198_TaikoArcadeLoader/src/patches/versions/JPN08.cpp
T
Farewell_ 2d239f93ea Added option to not move files for BNA1 OS
This should allow settings to be saved properly now
2025-01-19 22:10:07 +01:00

175 lines
8.8 KiB
C++

#include "helpers.h"
#include "../patches.h"
extern u64 song_data_size;
extern void *song_data;
extern i32 xRes;
extern i32 yRes;
extern bool vsync;
extern bool localFiles;
#define RDX_MOV 0x48, 0xBA
#define R8_MOV 0x49, 0xB8
#define GENERATE_MOV(instruction, location) \
instruction, (u8)(u64)(location), (u8)((u64)(location) >> 8), (u8)((u64)(location) >> 16), (u8)((u64)(location) >> 24), \
(u8)((u64)(location) >> 32), (u8)((u64)(location) >> 40), (u8)((u64)(location) >> 48), (u8)((u64)(location) >> 56)
namespace patches::JPN08 {
HOOK_DYNAMIC (char, AMFWTerminate, i64) { return 0; }
constexpr i32 datatableBufferSize = 1024 * 1024 * 12;
safetyhook::Allocation datatableBuffer;
const std::vector<uintptr_t> datatableBufferAddresses
= {0x14006D9A6, 0x14006D9D3, 0x14006E048, 0x14006E075, 0x14006E3A8, 0x14006E3D5, 0x14006E988, 0x14006E9B5, 0x14006EE22, 0x14006EE51, 0x14006F068,
0x14006F095, 0x14006F2F8, 0x14006F325, 0x14006F698, 0x14006F6C5, 0x14006F919, 0x14006F948, 0x14006FC38, 0x14006FC67, 0x14007006C, 0x140070099,
0x1400703E3, 0x140070412, 0x140070EB3, 0x140070EE2, 0x140071748, 0x140071775, 0x140071A68, 0x140071A95, 0x140071DD2, 0x140071E04, 0x140072E44,
0x140072E73, 0x140073058, 0x140073085, 0x140073374, 0x1400733A0, 0x1400735E8, 0x140073615, 0x14007390C, 0x140073939, 0x140073E73, 0x140073EA6,
0x140074A8D, 0x140074ABC, 0x140075082, 0x1400750B1, 0x140075524, 0x140075550, 0x1400758A2, 0x1400758D1, 0x140075D88, 0x140075DB5, 0x1403BA8FD};
const std::vector<uintptr_t> memsetSizeAddresses
= {0x14006D9A0, 0x14006E042, 0x14006E3A2, 0x14006E982, 0x14006EE1C, 0x14006F062, 0x14006F2F2, 0x14006F692, 0x14006F913,
0x14006FC32, 0x140070066, 0x1400703DD, 0x140070EAD, 0x140071742, 0x140071A62, 0x140071DCC, 0x140072E3E, 0x140073052,
0x14007336E, 0x1400735E2, 0x140073906, 0x140073E6D, 0x140074A87, 0x14007507C, 0x14007551E, 0x14007589C, 0x140075D82};
void
AllocateStaticBufferNear (void *target_address, const size_t size, safetyhook::Allocation *newBuffer) {
const auto allocator = safetyhook::Allocator::global ();
const std::vector desired_addresses = {static_cast<u8 *> (target_address)};
if (auto allocation_result = allocator->allocate_near (desired_addresses, size); allocation_result.has_value ())
*newBuffer = std::move (*allocation_result);
}
void
ReplaceLeaBufferAddress (const std::vector<uintptr_t> &bufferAddresses, void *newBufferAddress) {
for (const auto bufferAddress : bufferAddresses) {
const uintptr_t lea_instruction_dst = ASLR (bufferAddress) + 3;
const uintptr_t lea_instruction_end = ASLR (bufferAddress) + 7;
const intptr_t offset = reinterpret_cast<intptr_t> (newBufferAddress) - lea_instruction_end;
WRITE_MEMORY (lea_instruction_dst, i32, static_cast<i32> (offset));
}
}
void
Init () {
LogMessage (LogLevel::INFO, "Init JPN08 patches");
bool unlockSongs = true;
auto configPath = std::filesystem::current_path () / "config.toml";
std::unique_ptr<toml_table_t, void (*) (toml_table_t *)> config_ptr (openConfig (configPath), toml_free);
if (config_ptr) {
if (auto patches = openConfigSection (config_ptr.get (), "patches")) unlockSongs = readConfigBool (patches, "unlock_songs", unlockSongs);
}
// Apply common config patch
WRITE_MEMORY (ASLR (0x14035FC5B), i32, xRes);
WRITE_MEMORY (ASLR (0x14035FC62), i32, yRes);
if (!vsync) WRITE_MEMORY (ASLR (0x140517339), u8, 0xBA, 0x00, 0x00, 0x00, 0x00, 0x90);
if (unlockSongs) WRITE_MEMORY (ASLR (0x140314E8D), u8, 0xB0, 0x01);
// Bypass errors
WRITE_MEMORY (ASLR (0x1400239C0), u8, 0xC3);
// Use TLS v1.2
WRITE_MEMORY (ASLR (0x14044B1A9), u8, 0x10);
// Remove datatable size limit
{
for (auto address : memsetSizeAddresses)
WRITE_MEMORY (ASLR (address) + 2, i32, datatableBufferSize);
auto bufferBase = MODULE_HANDLE - 0x01000000;
AllocateStaticBufferNear (bufferBase, datatableBufferSize, &datatableBuffer);
ReplaceLeaBufferAddress (datatableBufferAddresses, datatableBuffer.data ());
}
// Remove song limit
{
WRITE_MEMORY (ASLR (0x140313726), i32, 9000);
WRITE_MEMORY (ASLR (0x1402F39E6), i32, 9000);
WRITE_MEMORY (ASLR (0x1402F3AB0), i32, 9000);
WRITE_MEMORY (ASLR (0x1402F3BE4), i32, 9000);
WRITE_MEMORY (ASLR (0x14030643B), i32, 9000);
WRITE_MEMORY (ASLR (0x140306507), i32, 9000);
WRITE_MEMORY (ASLR (0x1403065D3), i32, 9000);
WRITE_MEMORY (ASLR (0x1403066FB), i32, 9000);
WRITE_MEMORY (ASLR (0x1403067C7), i32, 9000);
WRITE_MEMORY (ASLR (0x140306893), i32, 9000);
WRITE_MEMORY (ASLR (0x14030698B), i32, 9000);
WRITE_MEMORY (ASLR (0x140313666), i32, 9000);
WRITE_MEMORY (ASLR (0x1403139F4), i32, 9000);
WRITE_MEMORY (ASLR (0x140313B04), i32, 9000);
WRITE_MEMORY (ASLR (0x140313C24), i32, 9000);
WRITE_MEMORY (ASLR (0x140313CF4), i32, 9000);
WRITE_MEMORY (ASLR (0x1403140C4), i32, 9000);
WRITE_MEMORY (ASLR (0x1403147AA), i32, 9000);
WRITE_MEMORY (ASLR (0x140225FB6), i32, 9000);
WRITE_MEMORY (ASLR (0x140226146), i32, 9000);
WRITE_MEMORY (ASLR (0x140314DCC), i32, 9000);
WRITE_MEMORY (ASLR (0x140314EC9), i32, 9000);
WRITE_MEMORY (ASLR (0x140338E2C), i32, 9000);
WRITE_MEMORY (ASLR (0x1400EE0A4), i32, 9000);
WRITE_MEMORY (ASLR (0x1400EE8B5), i32, 9000);
WRITE_MEMORY (ASLR (0x1400EEDA6), i32, 9000);
WRITE_MEMORY (ASLR (0x140315608), i32, 9000);
WRITE_MEMORY (ASLR (0x14034A7EB), i32, 9000);
WRITE_MEMORY (ASLR (0x1402F3CB3), i32, 9000);
WRITE_MEMORY (ASLR (0x140314059), i32, 9000);
WRITE_MEMORY (ASLR (0x140226063), i32, 9000);
WRITE_MEMORY (ASLR (0x14022609F), i32, 9000);
WRITE_MEMORY (ASLR (0x140226296), i32, 9000);
WRITE_MEMORY (ASLR (0x140306A2E), i32, 9000);
WRITE_MEMORY (ASLR (0x140314F46), i32, 9000);
WRITE_MEMORY (ASLR (0x140314F97), i32, 9000);
song_data = malloc (song_data_size);
memset (song_data, 0, song_data_size);
// Song data
WRITE_MEMORY (ASLR (0x14031367B), u8, GENERATE_MOV (R8_MOV, song_data));
// Crown data
WRITE_MEMORY (ASLR (0x1402F3AC6), u8, GENERATE_MOV (RDX_MOV, song_data));
WRITE_MEMORY (ASLR (0x1402F39FC), u8, GENERATE_MOV (RDX_MOV, song_data));
WRITE_MEMORY (ASLR (0x1402F3BFA), u8, GENERATE_MOV (RDX_MOV, song_data));
WRITE_MEMORY (ASLR (0x1403140D7), u8, GENERATE_MOV (R8_MOV, song_data));
// Score ranks
WRITE_MEMORY (ASLR (0x1403065EA), u8, GENERATE_MOV (RDX_MOV, song_data));
WRITE_MEMORY (ASLR (0x14030651E), u8, GENERATE_MOV (RDX_MOV, song_data));
WRITE_MEMORY (ASLR (0x140306452), u8, GENERATE_MOV (RDX_MOV, song_data));
WRITE_MEMORY (ASLR (0x1403068AA), u8, GENERATE_MOV (RDX_MOV, song_data));
WRITE_MEMORY (ASLR (0x1403067DE), u8, GENERATE_MOV (RDX_MOV, song_data));
WRITE_MEMORY (ASLR (0x140306712), u8, GENERATE_MOV (RDX_MOV, song_data));
WRITE_MEMORY (ASLR (0x1403069A2), u8, GENERATE_MOV (RDX_MOV, song_data));
WRITE_NOP (ASLR (0x1403069AC), 0x05);
// Unknown
WRITE_MEMORY (ASLR (0x140313755), u8, GENERATE_MOV (RDX_MOV, song_data));
WRITE_MEMORY (ASLR (0x140313A0B), u8, GENERATE_MOV (RDX_MOV, song_data));
WRITE_MEMORY (ASLR (0x140313B4C), u8, GENERATE_MOV (RDX_MOV, song_data));
WRITE_MEMORY (ASLR (0x140313D38), u8, GENERATE_MOV (RDX_MOV, song_data));
WRITE_MEMORY (ASLR (0x140313C42), u8, GENERATE_MOV (R8_MOV, song_data));
}
// Disable live check
auto amHandle = reinterpret_cast<u64> (GetModuleHandle ("AMFrameWork.dll"));
INSTALL_HOOK_DYNAMIC (AMFWTerminate, reinterpret_cast<void *> (amHandle + 0x35A00));
if (localFiles) {
// Move various files to current directory
WRITE_MEMORY (ASLR (0x14001C941), u8, 0x02);
WRITE_MEMORY (ASLR (0x140B1B4B0), char, "./"); // F:/
WRITE_MEMORY (ASLR (0x140B5C528), char, ".\\Setting1.bin");
WRITE_MEMORY (ASLR (0x140B5C538), char, ".\\Setting2.bin");
// Move various files to current directory
WRITE_MEMORY (amHandle + 0x148AF, u8, 0xEB); // CreditLogPathA
WRITE_MEMORY (amHandle + 0x14A1A, u8, 0xEB); // CreditLogPathB
WRITE_MEMORY (amHandle + 0x33EF7, u8, 0xEB); // ErrorLogPathA
WRITE_MEMORY (amHandle + 0x3404A, u8, 0xEB); // ErrorLogPathB
WRITE_MEMORY (amHandle + 0x34429, u8, 0xEB); // CommonLogPathA
WRITE_MEMORY (amHandle + 0x3457C, u8, 0xEB); // CommonLogPathB
WRITE_MEMORY (amHandle + 0x3497A, u8, 0xEB); // BackupDataPathA
WRITE_MEMORY (amHandle + 0x34ACD, u8, 0xEB); // BackupDataPathB
}
}
} // namespace patches::JPN08