Initial sacred_re scaffold with borderless fullscreen mod
- Launcher (sacred_re.exe) starts sacred.exe with sacred_re.dll injected via Detours; the DLL verifies the Sacred Gold 2.28 build before hooking. - Hook framework: RE_HOOK for game addresses, RE_HOOK_API for Windows APIs, per-hook enable/disable in sacred_re.ini, sacred_re.log. - Game code: Log (0x66f1c0) hooked, CmdLineHasFlag (0x813140) rewritten. - Borderless mod: forces windowed mode, covers the monitor, scales the 1024x768 image aspect-correct, remaps mouse input, keeps running in the background with keyboard input hidden while unfocused. - CMake/Ninja/MSVC x86 build, VS Code setup, disasm tool, function map. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
commit
d9f5c85430
31 files changed
+1184
No files matched your search
@@ -0,0 +1,62 @@
|
||||
#include "re/hook.h"
|
||||
|
||||
#include <vector>
|
||||
|
||||
#include <windows.h>
|
||||
#include <detours.h>
|
||||
|
||||
#include "re/config.h"
|
||||
#include "re/log.h"
|
||||
|
||||
namespace re {
|
||||
namespace {
|
||||
|
||||
struct HookDef {
|
||||
const char* name;
|
||||
uint32_t address;
|
||||
void** original;
|
||||
void* replacement;
|
||||
};
|
||||
|
||||
// Function-local static: registrations run during static initialisation, in
|
||||
// unspecified order across translation units.
|
||||
std::vector<HookDef>& Registry() {
|
||||
static std::vector<HookDef> hooks;
|
||||
return hooks;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
HookRegistration::HookRegistration(const char* name, uint32_t address, void** original, void* replacement) {
|
||||
Registry().push_back({name, address, original, replacement});
|
||||
}
|
||||
|
||||
int InstallHooks() {
|
||||
int failed = 0;
|
||||
int installed = 0;
|
||||
for (const HookDef& hook : Registry()) {
|
||||
if (!ConfigInt("hooks", hook.name, 1)) {
|
||||
Log("hook %-24s 0x%08x disabled by config", hook.name, hook.address);
|
||||
continue;
|
||||
}
|
||||
// One transaction per hook, so a bad hook does not take the others down.
|
||||
DetourTransactionBegin();
|
||||
DetourUpdateThread(GetCurrentThread());
|
||||
LONG error = DetourAttach(hook.original, hook.replacement);
|
||||
if (error == NO_ERROR) {
|
||||
error = DetourTransactionCommit();
|
||||
} else {
|
||||
DetourTransactionAbort();
|
||||
}
|
||||
if (error == NO_ERROR) {
|
||||
++installed;
|
||||
} else {
|
||||
++failed;
|
||||
Log("hook %-24s 0x%08x FAILED (error %ld)", hook.name, hook.address, error);
|
||||
}
|
||||
}
|
||||
Log("%d hook(s) installed, %d failed", installed, failed);
|
||||
return failed;
|
||||
}
|
||||
|
||||
} // namespace re
|
||||
Reference in new issue
Block a user