diff --git a/game_re/CMakeLists.txt b/game_re/CMakeLists.txt index 149b5903..0fbdbb91 100644 --- a/game_re/CMakeLists.txt +++ b/game_re/CMakeLists.txt @@ -1,22 +1,25 @@ function(setup_target TARGET DBG_MODE) - add_executable(${TARGET} + set(SOURCES r3/main.cxx r3/binders/stub.cxx - gh_global.cxx - ) + gh_global.cxx) + + if(DBG_MODE) + add_library(${TARGET} SHARED ${SOURCES}) + else() + add_executable(${TARGET} ${SOURCES}) + set_target_properties( + ${TARGET} PROPERTIES + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin + ) + endif() target_compile_features(${TARGET} PUBLIC cxx_std_20) target_include_directories(${TARGET} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) - set_target_properties( - ${TARGET} PROPERTIES - RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin - ) - if(WIN32 AND R3_32BIT) target_link_libraries(${TARGET} PRIVATE binkw32 - d3d8 dinput8 ) endif() @@ -25,10 +28,12 @@ function(setup_target TARGET DBG_MODE) R3_GAME_DATA_DIR=\"${GAME_DATA_DIR}\" ) - get_filename_component(R3_DATA_SEGMENT_FILE "${CMAKE_CURRENT_SOURCE_DIR}/gh_datasegment.bin" ABSOLUTE) - target_compile_definitions(${TARGET} PRIVATE - R3_DATA_SEGMENT_FILE=\"${R3_DATA_SEGMENT_FILE}\" - ) + if(NOT DBG_MODE) + get_filename_component(R3_DATA_SEGMENT_FILE "${CMAKE_CURRENT_SOURCE_DIR}/gh_datasegment.bin" ABSOLUTE) + target_compile_definitions(${TARGET} PRIVATE + R3_DATA_SEGMENT_FILE=\"${R3_DATA_SEGMENT_FILE}\" + ) + endif() target_compile_definitions(${TARGET} PRIVATE _CRT_SECURE_NO_WARNINGS=1 @@ -50,7 +55,7 @@ function(setup_target TARGET DBG_MODE) if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") target_compile_definitions(${TARGET} PRIVATE MSVC=1) - + # Disable SAFESEH on Windows if(WIN32) target_link_options(${TARGET} PRIVATE /SAFESEH:NO) @@ -63,11 +68,9 @@ function(setup_target TARGET DBG_MODE) # Ignore -Wmicrosoft-cast target_compile_options(${TARGET} PRIVATE -Wno-microsoft-cast) - - # Disable SAFESEH on Windows with Clang - if(WIN32) - target_link_options(${TARGET} PRIVATE -Wl,/SAFESEH:NO) - endif() + + # Disable safeseh + # target_link_options(${TARGET} PRIVATE -Wl,/SAFESEH:NO) endif() # Automatically re-run CMake if any gh_*.cxx files change @@ -95,12 +98,6 @@ function(setup_target TARGET DBG_MODE) r3/binders/dbg_mem.cxx ) target_compile_definitions(game_dbg PRIVATE RE_DBG_INJECTED=1) - - # We load the original binary at it's original location, so offset the base address - target_link_options(${TARGET} PRIVATE - -Wl,/BASE:0x20000000 - -Wl,/DYNAMICBASE:NO - ) target_link_libraries(${TARGET} PRIVATE DbgHelp hooker @@ -117,10 +114,6 @@ function(setup_target TARGET DBG_MODE) ) target_include_directories(${TARGET} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) - target_sources(${TARGET} PRIVATE - ${CMAKE_CURRENT_BINARY_DIR}/hooks.def - ) - else() target_sources(${TARGET} PRIVATE r3/binders/static_mem.cxx diff --git a/game_re/gh_fix/gfx_init.cxx b/game_re/gh_fix/gfx_init.cxx index 6f2df591..97fc9f12 100644 --- a/game_re/gh_fix/gfx_init.cxx +++ b/game_re/gh_fix/gfx_init.cxx @@ -1,18 +1,30 @@ -// AUTO-GENERATED FILE, MOVE TO 'gh_fix' FOLDER PREVENT OVERWRITING!!!!! +// AUTO-GENERATED FILE, MOVE TO 'gh_fix' FOLDER PREVENT OVERWRITING!!!!! #include #include extern "C" { -undefined FUN_00496ac0(void); // 00496ac0 // FUN_00496ac0 // cdecl -undefined FUN_00470b00(void); // 00470b00 // FUN_00470b00 // cdecl +undefined FUN_00496ac0(void); // 00496ac0 // FUN_00496ac0 // cdecl +undefined FUN_00470b00(void); // 00470b00 // FUN_00470b00 // cdecl undefined FUN_00484ea0(undefined4 param_1); // 00484ea0 // FUN_00484ea0 // cdecl +using FnD3Create8 = IDirect3D8 *(__stdcall *)(UINT); + +static FnD3Create8 init_d3d_function() { + HMODULE hModule = LoadLibrary("d3d8.dll"); + if (hModule != NULL) { + return (FnD3Create8)GetProcAddress(hModule, "Direct3DCreate8"); + } + return nullptr; +} + // 0046f870 -/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */ +/* WARNING: Globals starting with '_' overlap smaller symbols at the same + * address */ /* WARNING: Enum "_D3DFORMAT": Some values do not have unique names */ -undefined4 gfx_init(HWND hwnd,int param_2,UINT param_3,UINT param_4,int param_5) +undefined4 gfx_init(HWND hwnd, int param_2, UINT param_3, UINT param_4, + int param_5) { undefined4 *puVar1; @@ -23,7 +35,7 @@ undefined4 gfx_init(HWND hwnd,int param_2,UINT param_3,UINT param_4,int param_5) D3DDISPLAYMODE DStack_54; D3DDISPLAYMODE displayMode; D3DPRESENT_PARAMETERS DStack_34; - + puVar1 = &DAT_007eaf60; for (iVar3 = 0x13; iVar3 != 0; iVar3 = iVar3 + -1) { *puVar1 = 0; @@ -53,17 +65,18 @@ undefined4 gfx_init(HWND hwnd,int param_2,UINT param_3,UINT param_4,int param_5) if (param_5 == 0) { param_5 = g_GLI_bitdepth0; } - } - else { + } else { DWORD_005e6c20 = param_3; DWORD_005e6c24 = param_4; DAT_005e6c28 = param_5; } - gfx_d3d = Direct3DCreate8(0xdc); + + static FnD3Create8 fn_Direct3DCreate8 = init_d3d_function(); + gfx_d3d = fn_Direct3DCreate8(0xdc); if (gfx_d3d == (IDirect3D8 *)0x0) { return 1; } - HVar2 = (*gfx_d3d->lpVtbl->GetAdapterDisplayMode)(gfx_d3d,0,&displayMode); + HVar2 = (*gfx_d3d->lpVtbl->GetAdapterDisplayMode)(gfx_d3d, 0, &displayMode); if (HVar2 < 0) { return 1; } @@ -79,14 +92,12 @@ undefined4 gfx_init(HWND hwnd,int param_2,UINT param_3,UINT param_4,int param_5) param_5 = FUN_00484ea0(displayMode.Format); AdapterFormat = displayMode.Format; DAT_005e6c28 = param_5; - } - else { + } else { DStack_34.SwapEffect = D3DSWAPEFFECT_FLIP; if (param_5 == 0x10) { DStack_34.BackBufferFormat = D3DFMT_R5G6B5; AdapterFormat = D3DFMT_R5G6B5; - } - else { + } else { DStack_34.BackBufferFormat = D3DFMT_A8R8G8B8; AdapterFormat = D3DFMT_X8R8G8B8; } @@ -98,17 +109,17 @@ undefined4 gfx_init(HWND hwnd,int param_2,UINT param_3,UINT param_4,int param_5) DStack_34.FullScreen_RefreshRateInHz = 0; DStack_34.BackBufferWidth = param_3; if (0x10 < param_5) { - HVar2 = (*gfx_d3d->lpVtbl->CheckDeviceFormat) - (gfx_d3d,g_GLI_adapter,D3DDEVTYPE_HAL,AdapterFormat,2,D3DRTYPE_SURFACE, - D3DFMT_D24S8); + HVar2 = (*gfx_d3d->lpVtbl->CheckDeviceFormat)( + gfx_d3d, g_GLI_adapter, D3DDEVTYPE_HAL, AdapterFormat, 2, + D3DRTYPE_SURFACE, D3DFMT_D24S8); if (HVar2 == 0) { DStack_34.AutoDepthStencilFormat = D3DFMT_D24S8; DAT_0063be50 = 1; goto LAB_0046fa6f; } - HVar2 = (*gfx_d3d->lpVtbl->CheckDeviceFormat) - (gfx_d3d,g_GLI_adapter,D3DDEVTYPE_HAL,AdapterFormat,2,D3DRTYPE_SURFACE, - D3DFMT_D32); + HVar2 = (*gfx_d3d->lpVtbl->CheckDeviceFormat)( + gfx_d3d, g_GLI_adapter, D3DDEVTYPE_HAL, AdapterFormat, 2, + D3DRTYPE_SURFACE, D3DFMT_D32); DAT_0063be50 = 0; if (HVar2 == 0) { DStack_34.AutoDepthStencilFormat = D3DFMT_D32; @@ -117,49 +128,57 @@ undefined4 gfx_init(HWND hwnd,int param_2,UINT param_3,UINT param_4,int param_5) } DAT_0063be50 = 0; DStack_34.AutoDepthStencilFormat = D3DFMT_D16; - (*gfx_d3d->lpVtbl->CheckDeviceFormat) - (gfx_d3d,g_GLI_adapter,D3DDEVTYPE_HAL,AdapterFormat,2,D3DRTYPE_SURFACE,D3DFMT_D16); + (*gfx_d3d->lpVtbl->CheckDeviceFormat)(gfx_d3d, g_GLI_adapter, D3DDEVTYPE_HAL, + AdapterFormat, 2, D3DRTYPE_SURFACE, + D3DFMT_D16); LAB_0046fa6f: DStack_34.Flags = 1; if (g_GLI_tnl == '\0') { - HVar2 = (*gfx_d3d->lpVtbl->CreateDevice) - (gfx_d3d,g_GLI_adapter,D3DDEVTYPE_HAL,hwnd,0x24,&DStack_34,&gfx_device); + HVar2 = + (*gfx_d3d->lpVtbl->CreateDevice)(gfx_d3d, g_GLI_adapter, D3DDEVTYPE_HAL, + hwnd, 0x24, &DStack_34, &gfx_device); if (HVar2 < 0) { return 1; } - } - else { - HVar2 = (*gfx_d3d->lpVtbl->CreateDevice) - (gfx_d3d,g_GLI_adapter,D3DDEVTYPE_HAL,hwnd,0x44,&DStack_34,&gfx_device); - if ((HVar2 < 0) && - (HVar2 = (*gfx_d3d->lpVtbl->CreateDevice) - (gfx_d3d,g_GLI_adapter,D3DDEVTYPE_HAL,hwnd,0x24,&DStack_34,&gfx_device), - HVar2 < 0)) { + } else { + HVar2 = + (*gfx_d3d->lpVtbl->CreateDevice)(gfx_d3d, g_GLI_adapter, D3DDEVTYPE_HAL, + hwnd, 0x44, &DStack_34, &gfx_device); + if ((HVar2 < 0) && (HVar2 = (*gfx_d3d->lpVtbl->CreateDevice)( + gfx_d3d, g_GLI_adapter, D3DDEVTYPE_HAL, hwnd, 0x24, + &DStack_34, &gfx_device), + HVar2 < 0)) { return 1; } } - (*gfx_device->lpVtbl->SetRenderState)(gfx_device,D3DRS_NORMALIZENORMALS,0); + (*gfx_device->lpVtbl->SetRenderState)(gfx_device, D3DRS_NORMALIZENORMALS, 0); DAT_007eafa4 = 0; - (*gfx_device->lpVtbl->SetRenderState)(gfx_device,D3DRS_ZENABLE,1); + (*gfx_device->lpVtbl->SetRenderState)(gfx_device, D3DRS_ZENABLE, 1); DAT_007eafa0 = 1; - (*gfx_device->lpVtbl->SetRenderState)(gfx_device,D3DRS_ZFUNC,4); + (*gfx_device->lpVtbl->SetRenderState)(gfx_device, D3DRS_ZFUNC, 4); DAT_007eaf7c = 4; - (*gfx_device->lpVtbl->SetRenderState)(gfx_device,D3DRS_DITHERENABLE,1); - (*gfx_device->lpVtbl->SetRenderState)(gfx_device,D3DRS_SPECULARENABLE,0); - (*gfx_device->lpVtbl->SetRenderState)(gfx_device,D3DRS_CULLMODE,1); - (*gfx_device->lpVtbl->SetTextureStageState)(gfx_device,0,D3DTSS_COLORARG1,2); - (*gfx_device->lpVtbl->SetTextureStageState)(gfx_device,0,D3DTSS_COLORARG2,0); - (*gfx_device->lpVtbl->SetTextureStageState)(gfx_device,0,D3DTSS_COLOROP,4); - (*gfx_device->lpVtbl->SetTextureStageState)(gfx_device,0,D3DTSS_MINFILTER,2); - (*gfx_device->lpVtbl->SetTextureStageState)(gfx_device,0,D3DTSS_MAGFILTER,2); - (*gfx_device->lpVtbl->SetTextureStageState)(gfx_device,1,D3DTSS_MINFILTER,2); - (*gfx_device->lpVtbl->SetTextureStageState)(gfx_device,1,D3DTSS_MAGFILTER,2); + (*gfx_device->lpVtbl->SetRenderState)(gfx_device, D3DRS_DITHERENABLE, 1); + (*gfx_device->lpVtbl->SetRenderState)(gfx_device, D3DRS_SPECULARENABLE, 0); + (*gfx_device->lpVtbl->SetRenderState)(gfx_device, D3DRS_CULLMODE, 1); + (*gfx_device->lpVtbl->SetTextureStageState)(gfx_device, 0, D3DTSS_COLORARG1, + 2); + (*gfx_device->lpVtbl->SetTextureStageState)(gfx_device, 0, D3DTSS_COLORARG2, + 0); + (*gfx_device->lpVtbl->SetTextureStageState)(gfx_device, 0, D3DTSS_COLOROP, 4); + (*gfx_device->lpVtbl->SetTextureStageState)(gfx_device, 0, D3DTSS_MINFILTER, + 2); + (*gfx_device->lpVtbl->SetTextureStageState)(gfx_device, 0, D3DTSS_MAGFILTER, + 2); + (*gfx_device->lpVtbl->SetTextureStageState)(gfx_device, 1, D3DTSS_MINFILTER, + 2); + (*gfx_device->lpVtbl->SetTextureStageState)(gfx_device, 1, D3DTSS_MAGFILTER, + 2); FUN_00470b00(); - (*gfx_device->lpVtbl->SetRenderState)(gfx_device,D3DRS_ALPHATESTENABLE,0); - (*gfx_device->lpVtbl->SetRenderState)(gfx_device,D3DRS_ALPHAFUNC,7); - (*gfx_device->lpVtbl->SetRenderState)(gfx_device,D3DRS_ALPHAREF,0xc0); - (*gfx_device->lpVtbl->SetRenderState)(gfx_device,D3DRS_CLIPPING,1); - (*gfx_device->lpVtbl->SetRenderState)(gfx_device,D3DRS_LIGHTING,0); + (*gfx_device->lpVtbl->SetRenderState)(gfx_device, D3DRS_ALPHATESTENABLE, 0); + (*gfx_device->lpVtbl->SetRenderState)(gfx_device, D3DRS_ALPHAFUNC, 7); + (*gfx_device->lpVtbl->SetRenderState)(gfx_device, D3DRS_ALPHAREF, 0xc0); + (*gfx_device->lpVtbl->SetRenderState)(gfx_device, D3DRS_CLIPPING, 1); + (*gfx_device->lpVtbl->SetRenderState)(gfx_device, D3DRS_LIGHTING, 0); DAT_007eafcc = 0x3f800000; DAT_007eafc8 = 0x3f800000; DAT_007eafc4 = 0x3f800000; @@ -173,13 +192,14 @@ LAB_0046fa6f: DAT_007eaff0 = 0; DAT_007eaffc = 0x3f800000; DAT_007eb000 = 0; - (*gfx_device->lpVtbl->SetMaterial)(gfx_device,(D3DMATERIAL8 *)&DAT_007eafc0); - (*gfx_device->lpVtbl->SetRenderState)(gfx_device,D3DRS_FOGVERTEXMODE,3); + (*gfx_device->lpVtbl->SetMaterial)(gfx_device, (D3DMATERIAL8 *)&DAT_007eafc0); + (*gfx_device->lpVtbl->SetRenderState)(gfx_device, D3DRS_FOGVERTEXMODE, 3); if ((g_startOfGfxStruct.d3dSurface != (IDirect3DSurface8 *)0x0) || - (HVar2 = (*gfx_device->lpVtbl->GetBackBuffer) - (gfx_device,0,D3DBACKBUFFER_TYPE_MONO,&g_startOfGfxStruct.d3dSurface), - HVar2 == 0)) { - (*gfx_device->lpVtbl->GetDisplayMode)(gfx_device,&DStack_54); + (HVar2 = (*gfx_device->lpVtbl->GetBackBuffer)( + gfx_device, 0, D3DBACKBUFFER_TYPE_MONO, + &g_startOfGfxStruct.d3dSurface), + HVar2 == 0)) { + (*gfx_device->lpVtbl->GetDisplayMode)(gfx_device, &DStack_54); DStack_54.Height = 0; DStack_54.Width = DStack_54.RefreshRate; g_perfCounterRate = (float)DStack_54.RefreshRate; @@ -187,6 +207,4 @@ LAB_0046fa6f: } return 0; } - } - diff --git a/game_re/gh_fix/r3_initAllModules.cxx b/game_re/gh_fix/r3_initAllModules.cxx index f0cad8b5..97c52d92 100644 --- a/game_re/gh_fix/r3_initAllModules.cxx +++ b/game_re/gh_fix/r3_initAllModules.cxx @@ -4,13 +4,13 @@ #include extern "C" { -undefined r3_module_big_init(void); // 00443f10 // r3_module_big_init -undefined r3_module1_init(void); // 0043e630 // r3_module1_init -byte Erm_fn_ucInitErrMsg(void); // 0043e1d0 // Erm_fn_ucInitErrMsg -undefined Mmg_fn_vFirstInitMmgModule(undefined1 ucMaxNbChannel); // 0043f830 // Mmg_fn_vFirstInitMmgModule +undefined r3_module1_init(void); // 0043e630 // r3_module1_init // cdecl +byte Erm_fn_ucInitErrMsg(void); // 0043e1d0 // Erm_fn_ucInitErrMsg // stdcall +undefined r3_module_big_init(void); // 00443f10 // r3_module_big_init // cdecl +undefined Mmg_fn_vFirstInitMmgModule(undefined1 ucMaxNbChannel); // 0043f830 // Mmg_fn_vFirstInitMmgModule // stdcall // 00401000 -void r3_initAllModules(void) +void __cdecl r3_initAllModules(void) { char cVar1; diff --git a/game_re/r3/binders/dbg_mem.cxx b/game_re/r3/binders/dbg_mem.cxx index 20c867e6..1592c2c4 100644 --- a/game_re/r3/binders/dbg_mem.cxx +++ b/game_re/r3/binders/dbg_mem.cxx @@ -31,19 +31,16 @@ struct R3Bin { R3Bin() { loadOriginal(); } void loadOriginal() { + // This assumes we're using the Rayman3 patched launcher as the exe + module = GetModuleHandle(nullptr); SPDLOG_DEBUG("Loading original binary"); auto &config = getDefaultConfig(); - std::string path = config.gameRootDir + "/Rayman3.exe"; - - module = LoadLibraryA(path.c_str()); - if (!module) - throw std::runtime_error("Failed to load original binary"); - - fixupImports(module); g_gh_translationOffset = translationOffset = uintptr_t(module) - GH_BASE_ADDR; + if (g_gh_translationOffset != 0) + throw std::runtime_error("Somehow the binary failed to load at the correct base address"); std::string msg = fmt::format("Rayman3.exe Base address: 0x{:x}\n", uintptr_t(module)); @@ -54,7 +51,6 @@ struct R3Bin { OutputDebugStringA(msg.c_str()); // Now we have to relocate the module to the new base address - relocateModule(); patchFunctions(); } @@ -202,7 +198,6 @@ struct R3Bin { #define HOOK_S3(addr, name) HOOK(addr, name) #define HOOK_S4(addr, name) HOOK(addr, name) #define HOOK_S5(addr, name) HOOK(addr, name) - #include "hooks.def" } diff --git a/game_re/r3/main.cxx b/game_re/r3/main.cxx index 9fa92c25..a15a1f92 100644 --- a/game_re/r3/main.cxx +++ b/game_re/r3/main.cxx @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -21,15 +22,18 @@ void gh_pre_main(void); extern "C" int r3_main(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR *cmdline, int showCmd); +int mainImpl(int argc, char **argv) { + std::shared_ptr logger = spdlog::stderr_color_mt("game_re"); + spdlog::set_default_logger(logger); -int main(int argc, char **argv) { + SPDLOG_INFO("Starting Reman 3: The hooded ones"); CLI::App app("Reman 3: The hooded ones"); std::string log_level = "info"; app.add_option("-l,--log-level", log_level, "Log level"); - CLI11_PARSE(app, argc, argv); - auto log_level_enum = magic_enum::enum_cast(log_level); + auto log_level_enum = + magic_enum::enum_cast(log_level); if (log_level_enum.has_value()) { spdlog::set_level(log_level_enum.value()); } else { @@ -45,9 +49,59 @@ int main(int argc, char **argv) { gh_init_data_segment(); #endif - r3_main(GetModuleHandle(NULL), NULL, argv, SW_SHOW); + r3_main(GetModuleHandle(NULL), NULL, (char **)argv, SW_SHOW); } catch (const std::exception &e) { SPDLOG_ERROR("Unhandled exception: {}", e.what()); } return 0; -} \ No newline at end of file +} + +#if RE_DBG_INJECTED +static void setupWindowsStdErrLogging() { + // Check if stderr is redirected + HANDLE stderrHandle = GetStdHandle(STD_ERROR_HANDLE); + DWORD handleType = GetFileType(stderrHandle); + bool isRedirected = (handleType != FILE_TYPE_UNKNOWN); + if (!isRedirected && AttachConsole(ATTACH_PARENT_PROCESS)) { + freopen("CONOUT$", "wb", stderr); + HANDLE conOut = CreateFileA("CONOUT$", GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, + OPEN_EXISTING, 0, NULL); + DWORD mode{}; + if (GetConsoleMode(conOut, &mode)) + SetConsoleMode(conOut, mode | ENABLE_VIRTUAL_TERMINAL_INPUT); + SetStdHandle(STD_ERROR_HANDLE, conOut); + } +} +extern "C" int __declspec(dllexport) __cdecl re_dbg_attached( + const char *cmdLine_) { + + auto split = CLI::detail::split_program_name(cmdLine_); + auto cmdLine = std::move(split.second); + cmdLine = + CLI::detail::find_and_modify(cmdLine, "=", CLI::detail::escape_detect); + + auto args = CLI::detail::split_up(std::move(cmdLine)); + // Remove arguments to Rayman3p launcher + args.erase(args.begin()); + // Remove empty + args.erase(std::remove(args.begin(), args.end(), std::string{}), args.end()); + + std::vector args_c{split.first.data()}; + for (auto &arg : args) { + args_c.push_back(arg.data()); + } + args_c.push_back(nullptr); + + // Attach process console + setupWindowsStdErrLogging(); + try { + return mainImpl(args_c.size() - 1, args_c.data()); + } catch (...) { + SPDLOG_ERROR("Unhandled exception in re_dbg_attached"); + return 1; + } +} +#else +int main(int argc, char **argv) { return mainImpl(argc, argv); } +#endif \ No newline at end of file diff --git a/msvc_template/game_dbg.vcxproj.user b/msvc_template/game_dbg.vcxproj.user new file mode 100644 index 00000000..a74f3fc7 --- /dev/null +++ b/msvc_template/game_dbg.vcxproj.user @@ -0,0 +1,8 @@ + + + + C:\Projects\R3\game\Rayman3p.exe + WindowsLocalDebugger + $(TargetPath) + + \ No newline at end of file diff --git a/patcher/ref.cpp b/patcher/ref.cpp index 0a5ba225..967a9bd7 100644 --- a/patcher/ref.cpp +++ b/patcher/ref.cpp @@ -62,14 +62,17 @@ extern "C" __cdecl void ref() { goto fail; } - // Successfully loaded DLL - MessageBoxA(NULL, "DLL loaded successfully", "Success", - MB_OK | MB_ICONINFORMATION); + auto fn = (int (*)(const char *))GetProcAddress(hModule, "re_dbg_attached"); + if (fn == NULL) { + MessageBoxA(NULL, "Failed to get function address", "Error", + MB_OK | MB_ICONERROR); + goto fail; + } + + fn(cmdLine); - // Free the library FreeLibrary(hModule); - return; fail: ExitProcess(1); } diff --git a/third_party/CMakeLists.txt b/third_party/CMakeLists.txt index bacc993c..57c1272a 100644 --- a/third_party/CMakeLists.txt +++ b/third_party/CMakeLists.txt @@ -8,21 +8,6 @@ if(WIN32) IMPORTED_IMPLIB ${CMAKE_CURRENT_LIST_DIR}/bink/binkw32.lib ) - # Copy to output dir - if(CMAKE_CONFIGURATION_TYPES) - # Multi-config generators (MSVC, Xcode, etc.) - set(BINK_DST ${CMAKE_BINARY_DIR}/bin/$/binkw32.dll) - else() - # Single-config generators (Make, Ninja, etc.) - set(BINK_DST ${CMAKE_BINARY_DIR}/bin/binkw32.dll) - endif() - add_custom_command( - OUTPUT ${BINK_DST} - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/third_party/bink/binkw32.dll ${BINK_DST} - ) - add_custom_target(copy_binkw32 ALL DEPENDS ${BINK_DST}) - add_dependencies(binkw32_imp copy_binkw32) - add_library(binkw32 INTERFACE) target_link_libraries(binkw32 INTERFACE binkw32_imp)