2023-06-06 00:23:08 +03:00
|
|
|
#include <windows.h>
|
|
|
|
|
|
|
|
|
|
#include <ntdll.h>
|
|
|
|
|
#include <ace.h>
|
|
|
|
|
#include <game.h>
|
2023-07-28 01:51:04 +03:00
|
|
|
#include <core.h>
|
2023-06-06 00:23:08 +03:00
|
|
|
#include <utils.h>
|
|
|
|
|
|
2023-06-21 14:25:22 +03:00
|
|
|
#include <main.h>
|
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-06-06 00:23:08 +03:00
|
|
|
BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved) {
|
|
|
|
|
// Only listen to attach
|
|
|
|
|
if (reason != DLL_PROCESS_ATTACH) {
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
2023-06-21 14:25:22 +03:00
|
|
|
this_module = instance;
|
|
|
|
|
|
2023-06-06 00:23:08 +03:00
|
|
|
// Dynamically link functions from ntdll
|
|
|
|
|
ntdll_link();
|
|
|
|
|
|
|
|
|
|
// Detect which game the user is trying to run
|
|
|
|
|
struct game_data game;
|
|
|
|
|
game_detect(&game);
|
|
|
|
|
|
|
|
|
|
// Create fake ACE driver files
|
|
|
|
|
ace_fake_driver_files();
|
|
|
|
|
|
|
|
|
|
// Load both ACE modules
|
|
|
|
|
HMODULE baseModule = ace_load_base_module(game.name);
|
|
|
|
|
ace_load_driver_module();
|
|
|
|
|
|
|
|
|
|
// ...magic
|
2023-07-28 01:51:04 +03:00
|
|
|
core_setup_patcher(&game, baseModule);
|
2023-06-06 00:23:08 +03:00
|
|
|
|
2023-06-08 20:13:21 +03:00
|
|
|
// Load the UnityPlayer module and invoke the callback
|
2023-06-08 15:27:51 +03:00
|
|
|
HMODULE unityModule = LoadLibraryA("UnityPlayer.dll");
|
2023-06-08 20:13:21 +03:00
|
|
|
INVOKE_CALLBACK(game.unityplayer_callback, unityModule);
|
2023-06-08 15:27:51 +03:00
|
|
|
|
2023-06-06 00:23:08 +03:00
|
|
|
return TRUE;
|
|
|
|
|
}
|