|
Download docs/re-notes/frontend-main-navigation-loop.md from nmarshall/wormz-a: direct link, hf CLI and curl.
- Browser
- Download file 3.72 kB
-
https://huggingface.co/nmarshall/wormz-a/resolve/main/docs/re-notes/frontend-main-navigation-loop.md
- Command line
-
hf download hf://nmarshall/wormz-a/docs/re-notes/frontend-main-navigation-loop.md
-
curl -L -o frontend-main-navigation-loop.md https://huggingface.co/nmarshall/wormz-a/resolve/main/docs/re-notes/frontend-main-navigation-loop.md
3.72 kB
Frontend__MainNavigationLoop (0x4E6700)
Ghidra address: 0x004E6700
Calling convention: __fastcall (ECX = CWinApp*)
Size: ~3500 lines of decompiled C
This is the main entry point / event loop of WA.exe. It handles:
- Command-line argument parsing
- Crash handling (
/handlecrash,/silentcrash,/disablecrashhandler) - Replay playback (
/play,/playat,/getlog,/getmap,/getscheme,/getvideo,/getlogs) - Sanitize/repair modes (
/sanitise,/repair) - Network hosting (
/host,wa:protocol) - WormKit module loading (
/wk,/nowk,/wkargs) - Frontend screen navigation loop (main menu, multiplayer, campaigns, etc.)
- Renderer selection (DirectDraw, OpenGL, D3D9, etc.)
Crash Handler Mechanism
WA.exe's crash handler works by relaunching itself with /handlecrash:
- Original WA.exe crashes (C++ exception via
__CxxThrowException) - The crash handler (likely SEH-based) writes
ERRORLOG.TXTand relaunches WA.exe with/handlecrash - The new WA.exe instance processes
/handlecrashin this function - It checks
Options__GetCrashReportURL()β if crash reporting is available, shows a dialog offering to send the report - It checks
DAT_0088e410(WormKit modules loaded flag) β if set, shows the "Fatal error" dialog with Yes/No asking to disable WormKit modules
Key flags:
/silentcrashβ setsDAT_007a0f10+1 = 1β suppresses the crash dialog/disablecrashhandlerβ setsDAT_007a0f10+0 = 1β disables the crash handler entirely/crashβ intentionally crashes via__CxxThrowException("Goodbye, cruel world!")
Crash dialog code (at ~0x4E6730):
// Check for crash report URL
iVar11 = Options__GetCrashReportURL();
if (iVar11 != 0) {
// Show "send bug report?" dialog (MB_YESNO | MB_ICONQUESTION = 0x14)
iVar10 = MessageBoxA(NULL,
"Worms Armageddon has encountered an error...\nWould you like to send the bug report?",
"Fatal error", 0x14);
if (iVar10 == IDYES) FUN_005a6470(); // send crash report
}
// Check if WormKit modules were loaded
if (DAT_0088e410 == 0) {
// No WormKit β just show error (MB_ICONERROR = 0x10)
MessageBoxA(NULL, error_msg, "Fatal error", 0x10);
} else {
// WormKit loaded β ask to disable (MB_YESNO | MB_ICONQUESTION = 0x14)
FUN_00444d30(); // builds error message mentioning WormKit
iVar11 = MessageBoxA(NULL, error_msg, "Fatal error", 0x14);
if (iVar11 == IDYES) {
DAT_0088e410 = 0;
FUN_004c8c70(); // disable WormKit in registry
MessageBoxA(NULL, "WormKit modules have been disabled.", "Worms Armageddon", 0x40);
}
}
ERRORLOG.TXT
String at 0x00677FE0: "ERRORLOG.TXT"
String at 0x00678484: "Can't open ERRORLOG.TXT"
Written by the crash handler before relaunching (separate from this function).
/getlog Mode
The /getlog flag sets:
DAT_0088cd4c = 1(headless replay mode)local_31 = 1(getlog flag)- Copies replay path to
DAT_0088af58
Later in the function, /getlog mode opens the replay for writing the game log output.
WormKit Module Loading
Around line 1200 of decompilation:
- Searches for
wk*.dllfiles in the game directory - Loads each via
LoadLibraryA - If loading fails, shows a MessageBox with the error
- Flag at
DAT_0088e410tracks whether WormKit modules are loaded
Key Addresses
| Address | Purpose |
|---|---|
0x007A0F10+0 |
/disablecrashhandler flag |
0x007A0F10+1 |
/silentcrash flag |
0x0088E410 |
WormKit modules loaded flag |
0x0088AF58 |
Replay path buffer |
0x0088CD4C |
Headless replay mode flag |
0x0088E17D |
Current directory buffer |
0x006B1FEC |
argc |
0x006B1FF0 |
argv |