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:
khallaandClaude Opus 5.5 committed 2026-10-13 23:55:50 +02:00
commit d9f5c85430
31 files changed
+1184

No files matched your search

+57
View File
@@ -0,0 +1,57 @@
# Function map
Addresses are `sacred.exe` virtual addresses (image base `0x400000`).
Status: **rewritten** (our code replaces the original), **hooked** (our code
wraps the original), **identified** (purpose known, not touched yet).
## Startup
| Address | Name | Conv. | Status | Notes |
|---|---|---|---|---|
| `0x0084c704` | `entry` | — | identified | MSVC 6 CRT startup (`WinMainCRTStartup`) |
| `0x00816bd0` | `WinMain` | stdcall | identified | single-instance mutex `SACRED_INSTANCE`, OS check, logging setup, `Settings.cfg`, language selection, main window, message loop, shutdown |
| `0x00813240` | `CreateMainWindow`? | | identified | "WinMain : unable to create main window" on failure |
| `0x00815620` | `InitGame`? | | identified | "WinMain : initialization failed" on failure |
## Engine
| Address | Name | Conv. | Status | Notes |
|---|---|---|---|---|
| `0x0066f1c0` | `Log` | cdecl, varargs | hooked | printf-style; writes `DEBUG.LOG` when enabled; see `src/game/engine/log.cpp` |
| `0x0066ed80` | `SetLogEnabled` | cdecl | identified | sets byte `0x017e5ee0` |
| `0x0066ef60` | `OpenLogFiles` | cdecl | identified | (re)opens `DEBUG.LOG`, `ExpLog.LOG` |
| `0x00813140` | `CmdLineHasFlag` | cdecl | rewritten | `src/game/engine/cmdline.cpp` |
| `0x00813240` | `CreateMainWindow` | cdecl | identified | registers class "Sacred" (wndproc `0x008122a0`), `WS_POPUP\|WS_VISIBLE` screen-sized window unless `win` flag |
| `0x008122a0` | `MainWindowProc` | stdcall | hooked | borderless mod remaps mouse message coordinates |
| `0x0066e500` | `GetMouseClientPos` | cdecl | hooked | `GetCursorPos` relative to client area; borderless mod maps to game pixels |
| `0x00610650` | ? | thiscall | identified | player input; only `SetCursorPos` caller (cursor nudging) |
## Renderer (`dxDriver7`, instance pointer `0x00cda99c`)
Layout: `src/game/render/dx_driver7.h`.
| Address | Name | Conv. | Status | Notes |
|---|---|---|---|---|
| `0x00645390` | `DxDriver7::SetDisplayMode` | thiscall, `ret 0xc` | hooked | args (deviceCaps, `DxDisplayMode*`, ?); borderless mod forces windowed + resizes window |
| `0x00645f70` | `DxDriver7::Flip` | thiscall | hooked | windowed: `primary->Blt(+0x1ec, back, +0x1dc)`; borderless mod sets both rects |
| `0x00645000` | `DxDriver7::CreateZBuffer`? | | identified | |
| `0x00644be0` | `DxDriver7::CreateSurface`? | | identified | |
## Globals
| Address | Type | Name | Notes |
|---|---|---|---|
| `0x017e5ee0` | `bool` | `g_logEnabled` | set by `log` flag |
| `0x017e5ed4` | `FILE*` | `g_debugLog` | `DEBUG.LOG` |
| `0x017e5ed8` | `FILE*` | `g_expLog` | `ExpLog.LOG` |
| `0x017e5ee4` | `void(*)(const char*)` | `g_logCallback` | |
| `0x017e5cb4` | `int` | `g_language` | index into code table `0x00897394` (US DE FR SP IT PL HU JP VC RU CZ, 16-byte stride) |
| `0x0182cd38` | `HANDLE` | `g_instanceMutex` | |
| `0x00cda99c` | `DxDriver7*` | `g_dxDriver` | |
| `0x0182cdb8` | `uint32_t` | `g_appFlags` | bit `0x20000` = app inactive (set/cleared on `WM_ACTIVATEAPP` at `0x00812421`) |
## Command-line flags seen so far
`log` (enable logging), `tabblocker`, `win`, language codes `us`, `de`, `fr`,
`sp`, `it`, `pl`, `hu`, `jp`, `vc`, `ru`, `cz` (lowercased before matching).