From acb9d47e0e43a67bd866fc1efb9267ed334b5266 Mon Sep 17 00:00:00 2001 From: Guus Waals <_@guusw.nl> Date: Fri, 30 May 2025 00:18:17 +0800 Subject: [PATCH] Ray3 main debug stub --- game_re/CMakeLists.txt | 1 + game_re/gh_fix/r3_main.cxx | 48 ++++++++++++++++++---------------- game_re/gh_global.cxx | 2 +- game_re/gh_global.h | 2 +- game_re/r3/binders/dbg_mem.cxx | 21 +++++++++++++++ game_re/r3/main.cxx | 3 --- 6 files changed, 50 insertions(+), 27 deletions(-) diff --git a/game_re/CMakeLists.txt b/game_re/CMakeLists.txt index 6acd148b..5dc0213e 100644 --- a/game_re/CMakeLists.txt +++ b/game_re/CMakeLists.txt @@ -13,6 +13,7 @@ function(setup_target TARGET DBG_MODE) ) if(WIN32 AND R3_32BIT) + target_link_directories(${TARGET} PRIVATE ${CMAKE_CURRENT_LIST_DIR}/../third_party/bink) target_link_libraries(${TARGET} PRIVATE binkw32 d3d8 diff --git a/game_re/gh_fix/r3_main.cxx b/game_re/gh_fix/r3_main.cxx index 9bdcb39e..06cb12b1 100644 --- a/game_re/gh_fix/r3_main.cxx +++ b/game_re/gh_fix/r3_main.cxx @@ -220,16 +220,17 @@ LAB_004017ce: } } fclose(pFVar5); - /* Open reg key - HKEY_LOCAL_MACHINE\\SOFTWARE\\UBI SOFT\\RAYMAN 3 */ - LVar6 = RegOpenKeyExA((HKEY)0x80000002,s_SOFTWARE_UBI_SOFT_RAYMAN_3_005b6864,0,0x20019, - (PHKEY)&stack0xfffff7b8); + /* Open reg key + HKEY_LOCAL_MACHINE\\SOFTWARE\\UBI SOFT\\RAYMAN 3 */ + HKEY key; + LVar6 = RegOpenKeyExA(HKEY_LOCAL_MACHINE,s_SOFTWARE_UBI_SOFT_RAYMAN_3_005b6864,0,0x20019, + &key); if (LVar6 == 0) { - LVar6 = RegQueryValueExA(unaff_ESI,s_CompleteInstall_005b6854,(LPDWORD)0x0,&pvStack_834, + LVar6 = RegQueryValueExA(key,s_CompleteInstall_005b6854,(LPDWORD)0x0,&pvStack_834, uStack_83c,&pHStack_838); DAT_007d9cc4 = (uint)(LVar6 == 0); - if (unaff_ESI != (HKEY)0x0) { - RegCloseKey(unaff_ESI); + if (key != (HKEY)0x0) { + RegCloseKey(key); } } else { @@ -540,25 +541,27 @@ LAB_004017ce: r3_checkDisc(); dwOptions = 0; BVar18 = 0; - lpTargetHandle = (LPHANDLE)&stack0xfffff7ac; + HANDLE duplicatedHandle; DVar7 = 0x1f03ff; g_hinstance = instance; hTargetProcessHandle = GetCurrentProcess(); hSourceHandle = GetCurrentThread(); hSourceProcessHandle = GetCurrentProcess(); - DuplicateHandle(hSourceProcessHandle,hSourceHandle,hTargetProcessHandle,lpTargetHandle,DVar7, + DuplicateHandle(hSourceProcessHandle,hSourceHandle,hTargetProcessHandle,&duplicatedHandle,DVar7, BVar18,dwOptions); /* Copy cmdline */ ppCVar8 = puStack_14; - g_mainThreadHandle = lpBuffer; - do { - uVar14 = *ppCVar8; - *(char *)(((int)g_appCmdLine - (int)puStack_14) + (int)ppCVar8) = (char)uVar14; - ppCVar8 = (uint *)((int)ppCVar8 + 1); - } while ((char)uVar14 != '\0'); + g_mainThreadHandle = duplicatedHandle; + // do { + // uVar14 = *ppCVar8; + // *(char *)(((int)g_appCmdLine - (int)puStack_14) + (int)ppCVar8) = + // (char)uVar14; ppCVar8 = (uint *)((int)ppCVar8 + 1); + // } while ((char)uVar14 != '\0'); + LPSTR cmdline = GetCommandLineA(); + strncpy(g_appCmdLine, cmdline, std::size(g_appCmdLine)); /* SEM_FAILCRITICALERRORS */ SetErrorMode(1); - pcVar4 = strstr(puStack_14,s_dashCC); + pcVar4 = strstr(cmdline, s_dashCC); if (pcVar4 == (char *)0x0) { r3_initAllModules(); iVar13 = setupWindow(instance,uStack_10,g_runMaximized); @@ -570,21 +573,22 @@ LAB_004017ce: spawnThread(); r3_noop(p_cTxt1,p_cTxt2); gfx_init2(); - lpRect = (LPRECT)&stack0xfffff7c0; + RECT rect; hWnd = GetDesktopWindow(); - GetWindowRect(hWnd,lpRect); + GetWindowRect(hWnd,&rect); BVar18 = 1; iVar13 = r3_get_gli_height1(); iVar13 = iVar13 + 0x20; iVar10 = r3_get_gli_width1(); iVar10 = iVar10 + 0xc; iVar11 = r3_get_gli_height1(); - iVar11 = (int)(pvStack_834 - iVar11) / 2; + iVar11 = (int)(rect.top - iVar11) / 2; iVar12 = r3_get_gli_width1(); - MoveWindow(g_gameHWND,(int)(pHStack_838 - iVar12) / 2,iVar11,iVar10,iVar13,BVar18); + MoveWindow(g_gameHWND,(int)(rect.right - iVar12) / 2,iVar11,iVar10,iVar13,BVar18); FUN_004010b0(); - SystemParametersInfoA(0x10,0,&stack0xfffff7b0,0); - SystemParametersInfoA(0x11,0,(PVOID)0x0,0); + DWORD screensaveActive; + SystemParametersInfoA(SPI_GETSCREENSAVEACTIVE,0,&screensaveActive,0); + SystemParametersInfoA(SPI_SETSCREENSAVEACTIVE,0,(PVOID)0x0,0); ShowCursor(0); uStack_85c = 0; SystemParametersInfoA(0x61,1,&uStack_85c,0); diff --git a/game_re/gh_global.cxx b/game_re/gh_global.cxx index 04003a76..5f3321bc 100644 --- a/game_re/gh_global.cxx +++ b/game_re/gh_global.cxx @@ -61,7 +61,7 @@ long& lpDefault_005cf96c= (long&) GH_MEM(0x005cf96c); r3_main_data& r3_main_data_005d28b6= (r3_main_data&) GH_MEM(0x005d28b6); int& g_runMaximized= (int&) GH_MEM(0x0077d0a8); undefined4& g_engineRunning= (undefined4&) GH_MEM(0x0077d0b4); -undefined4& g_drawSemaphore= (undefined4&) GH_MEM(0x0077d0bc); +HANDLE& g_drawSemaphore= (HANDLE&) GH_MEM(0x0077d0bc); char(&g_mutexName_Rayman3)[256] = reinterpret_cast(GH_MEM(0x0077d0c0)); char(&g_windowTitle)[256] = reinterpret_cast(GH_MEM(0x0077d1c0)); char(&g_windowTitle1)[256] = reinterpret_cast(GH_MEM(0x0077d2c0)); diff --git a/game_re/gh_global.h b/game_re/gh_global.h index a28e8199..eac15481 100644 --- a/game_re/gh_global.h +++ b/game_re/gh_global.h @@ -66,7 +66,7 @@ extern long& lpDefault_005cf96c; // 005cf96c extern r3_main_data& r3_main_data_005d28b6; // 005d28b6 extern int& g_runMaximized; // 0077d0a8 extern undefined4& g_engineRunning; // 0077d0b4 -extern undefined4& g_drawSemaphore; // 0077d0bc +extern HANDLE& g_drawSemaphore; // 0077d0bc extern char(&g_mutexName_Rayman3)[256]; // 0077d0c0 extern char(&g_windowTitle)[256]; // 0077d1c0 extern char(&g_windowTitle1)[256]; // 0077d2c0 diff --git a/game_re/r3/binders/dbg_mem.cxx b/game_re/r3/binders/dbg_mem.cxx index a93aafa6..a049b27d 100644 --- a/game_re/r3/binders/dbg_mem.cxx +++ b/game_re/r3/binders/dbg_mem.cxx @@ -1,4 +1,25 @@ #include "r3/config/static.hpp" +#include +struct R3Bin { + R3Bin() { SPDLOG_DEBUG("R3Bin constructor"); } + + static R3Bin& get() { + static R3Bin instance; + return instance; + } +}; + +uint8_t *gh_map_dbg_mem(size_t addr) { + R3Bin::get(); + SPDLOG_DEBUG("Mapping debug memory at {}", addr); + return nullptr; +} +void *gh_stub_impl_ptr(void *ptr) { + R3Bin::get(); + SPDLOG_DEBUG("Forwarding implementation at {}", ptr); + return nullptr; +} void gh_init_dbg_loader() { + SPDLOG_DEBUG("Initializing debug loader"); } \ No newline at end of file diff --git a/game_re/r3/main.cxx b/game_re/r3/main.cxx index 242ddf48..f8b23682 100644 --- a/game_re/r3/main.cxx +++ b/game_re/r3/main.cxx @@ -10,9 +10,6 @@ #include #endif -// Error reporting and such -extern "C" void r3_noop(void *, void *) {} - extern "C" int r3_main(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR *cmdline, int showCmd);