diff --git a/impl11/ddraw/config.cpp b/impl11/ddraw/config.cpp index 82a19e7d..c944ddd2 100644 --- a/impl11/ddraw/config.cpp +++ b/impl11/ddraw/config.cpp @@ -10,6 +10,9 @@ #include #include "joystick.h" +#include "XwaDrawTextHook.h" +#include "XwaDrawRadarHook.h" +#include "XwaDrawBracketHook.h" // Wrapper to avoid undefined behaviour due to // sign-extending char to int when passing to isspace. @@ -221,7 +224,7 @@ Config::Config() GetModuleFileNameA(NULL, name, sizeof(name)); int len = strlen(name); - bool isXWA = len >= 17 && _stricmp(name + len - 17, "xwingalliance.exe") == 0; + isXWA = len >= 17 && _stricmp(name + len - 17, "xwingalliance.exe") == 0; isXWing = len >= 11 && _stricmp(name + len - 11, "xwing95.exe") == 0; isTIE = len >= 9 && _stricmp(name + len - 9, "tie95.exe") == 0; isXvT = len >= 11 && _stricmp(name + len - 11, "z_xvt__.exe") == 0 && @@ -334,6 +337,15 @@ Config::Config() DisableProcessWindowsGhosting(); } +static bool patchCall(int address, void *dst) { + if (*(unsigned char*)(address) != 0xE8) return false; + DWORD old, dummy; + VirtualProtect((void *)address, 5, PAGE_READWRITE, &old); + *(int*)(address + 0x01) = (int)dst - (address + 0x05); + VirtualProtect((void *)address, 5, old, &dummy); + return true; +} + void Config::runAutopatch() { if (RuntimeAutoPatchDone) return; @@ -379,5 +391,28 @@ void Config::runAutopatch() *(unsigned *)0x4f2a8c = 0x3d000000u; VirtualProtect((void *)0x4f2a8c, 4, old, &dummy); } + if (AutoPatch >= 2 && isXWA && g_config.XWAMode) { + // RenderCharHook + patchCall(0x00450A47, RenderCharHook); + + // ComputeMetricsHook + patchCall(0x00510385, ComputeMetricsHook); + + // DrawRadarHook + DWORD old, dummy; + VirtualProtect((void *)(0x00434977 + 0x6), 0x00434995 - 0x00434977 + 4, PAGE_READWRITE, &old); + *(int*)(0x00434977 + 0x06) = (int)DrawRadarHook; + *(int*)(0x00434995 + 0x06) = (int)DrawRadarSelectedHook; + VirtualProtect((void *)(0x00434977 + 0x6), 0x00434995 - 0x00434977 + 4, old, &dummy); + + // DrawBracketInFlightHook + patchCall(0x00503D46, DrawBracketInFlightHook); + + // DrawBracketInFlightHook CMD + patchCall(0x00478E44, DrawBracketInFlightHook); + + // DrawBracketMapHook + patchCall(0x00503CFE, DrawBracketMapHook); + } FlushInstructionCache(GetCurrentProcess(), NULL, 0); } diff --git a/impl11/ddraw/config.h b/impl11/ddraw/config.h index e4a69048..8e30aff4 100644 --- a/impl11/ddraw/config.h +++ b/impl11/ddraw/config.h @@ -31,6 +31,7 @@ class Config float MouseSensitivity; float KbdSensitivity; bool XWAMode; + bool isXWA; bool isTIE; bool isXWing; bool isXvT; diff --git a/impl11/ddraw/ddraw.rc b/impl11/ddraw/ddraw.rc index f0325bd6..558769f0 100644 --- a/impl11/ddraw/ddraw.rc +++ b/impl11/ddraw/ddraw.rc @@ -48,8 +48,8 @@ END // 1 VERSIONINFO - FILEVERSION 1,5,11 - PRODUCTVERSION 1,5,11 + FILEVERSION 1,5,12 + PRODUCTVERSION 1,5,12 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -66,12 +66,12 @@ BEGIN BEGIN VALUE "CompanyName", "Jérémy Ansel" VALUE "FileDescription", "Direct3D 11 implementation for X-Wing series" - VALUE "FileVersion", "1.5.11" + VALUE "FileVersion", "1.5.12" VALUE "InternalName", "ddraw.dll" VALUE "LegalCopyright", "Copyright (C) Jérémy Ansel 2014, Reimar Döffinger 2015-2020" VALUE "OriginalFilename", "ddraw.dll" VALUE "ProductName", "xwa_ddraw_d3d11" - VALUE "ProductVersion", "1.5.11" + VALUE "ProductVersion", "1.5.12" END END BLOCK "VarFileInfo" diff --git a/impl11/ddraw/dllmain.cpp b/impl11/ddraw/dllmain.cpp index 4d967813..3690513b 100644 --- a/impl11/ddraw/dllmain.cpp +++ b/impl11/ddraw/dllmain.cpp @@ -7,63 +7,11 @@ #define STRICT #include -#include "XwaDrawTextHook.h" -#include "XwaDrawRadarHook.h" -#include "XwaDrawBracketHook.h" - -bool IsXwaExe() -{ - char filename[4096]; - - if (GetModuleFileName(nullptr, filename, sizeof(filename)) == 0) - { - return false; - } - - int length = strlen(filename); - - if (length < 17) - { - return false; - } - - return _stricmp(filename + length - 17, "xwingalliance.exe") == 0; -} - BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: - if (IsXwaExe()) - { - // RenderCharHook - *(unsigned char*)(0x00450A47 + 0x00) = 0xE8; - *(int*)(0x00450A47 + 0x01) = (int)RenderCharHook - (0x00450A47 + 0x05); - - // ComputeMetricsHook - *(unsigned char*)(0x00510385 + 0x00) = 0xE8; - *(int*)(0x00510385 + 0x01) = (int)ComputeMetricsHook - (0x00510385 + 0x05); - - // DrawRadarHook - *(int*)(0x00434977 + 0x06) = (int)DrawRadarHook; - *(int*)(0x00434995 + 0x06) = (int)DrawRadarSelectedHook; - - // DrawBracketInFlightHook - *(unsigned char*)(0x00503D46 + 0x00) = 0xE8; - *(int*)(0x00503D46 + 0x01) = (int)DrawBracketInFlightHook - (0x00503D46 + 0x05); - - // DrawBracketInFlightHook CMD - *(unsigned char*)(0x00478E44 + 0x00) = 0xE8; - *(int*)(0x00478E44 + 0x01) = (int)DrawBracketInFlightHook - (0x00478E44 + 0x05); - - // DrawBracketMapHook - *(unsigned char*)(0x00503CFE + 0x00) = 0xE8; - *(int*)(0x00503CFE + 0x01) = (int)DrawBracketMapHook - (0x00503CFE + 0x05); - } - - break; - case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: