diff --git a/CHANGELOG.md b/CHANGELOG.md index 753ccd03..34c75092 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Changelog +## 4.4.0.1 +* Fixed a crash on startup on Windows XP/2003 + ## 4.4 * Implemented a `mods_order.txt` to improve and simplify mod ordering and add support for mod managers. This replaces previous **.dat** file autoloading. Please refer to `ddraw.ini` for details * Implemented a **custom config file parser**, which greatly improves the performance of sfall initialization and reading files from scripts diff --git a/sfall/ddraw.vcxproj b/sfall/ddraw.vcxproj index e0093a32..2a8f76df 100644 --- a/sfall/ddraw.vcxproj +++ b/sfall/ddraw.vcxproj @@ -111,6 +111,7 @@ $(IntDir)/%(RelativeDir)/ stdafx.h;%(ForcedIncludeFiles) $(DXSDK_DIR)Include\ + /Zc:threadSafeInit- %(AdditionalOptions) d3d9.lib;d3dx9.lib;dinput.lib;Strmiids.lib;ws2_32.lib;%(AdditionalDependencies) @@ -174,6 +175,7 @@ stdafx.h;%(ForcedIncludeFiles) true $(DXSDK_DIR)Include\ + /Zc:threadSafeInit- %(AdditionalOptions) d3d9.lib;d3dx9.lib;dinput.lib;Strmiids.lib;ws2_32.lib;%(AdditionalDependencies) @@ -239,6 +241,7 @@ stdafx.h;%(ForcedIncludeFiles) true $(DXSDK_DIR)Include\ + /Zc:threadSafeInit- %(AdditionalOptions) d3d9.lib;d3dx9.lib;dinput.lib;Strmiids.lib;ws2_32.lib;%(AdditionalDependencies) @@ -305,6 +308,7 @@ false true $(DXSDK_DIR)Include\ + /Zc:threadSafeInit- %(AdditionalOptions) d3d9.lib;d3dx9.lib;dinput.lib;Strmiids.lib;ws2_32.lib;%(AdditionalDependencies) diff --git a/sfall/main.cpp b/sfall/main.cpp index f07f5cec..4cb66b99 100644 --- a/sfall/main.cpp +++ b/sfall/main.cpp @@ -90,6 +90,7 @@ #include ddrawDll ddraw; +static void LoadOriginalDll(DWORD fdwReason); namespace sfall { @@ -205,6 +206,9 @@ static int CheckEXE() { static HMODULE SfallInit() { char filepath[MAX_PATH]; + + LoadOriginalDll(DLL_PROCESS_ATTACH); + GetModuleFileName(0, filepath, MAX_PATH); auto initStart = std::chrono::high_resolution_clock::now(); @@ -304,7 +308,7 @@ defaultIni: } -static bool LoadOriginalDll(DWORD fdwReason) { +static void LoadOriginalDll(DWORD fdwReason) { switch (fdwReason) { case DLL_PROCESS_ATTACH: char path[MAX_PATH]; @@ -335,20 +339,21 @@ static bool LoadOriginalDll(DWORD fdwReason) { ddraw.ReleaseDDThreadLock = GetProcAddress(ddraw.dll, "ReleaseDDThreadLock"); ddraw.SetAppCompatData = GetProcAddress(ddraw.dll, "SetAppCompatData"); } - return true; + break; case DLL_PROCESS_DETACH: if (ddraw.dll) FreeLibrary(ddraw.dll); break; } - return false; } bool __stdcall DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved) { - if (LoadOriginalDll(fdwReason)) { + if (fdwReason == DLL_PROCESS_ATTACH) { if (sfall::CheckEXE()) { ddraw.sfall = hinstDLL; sfall::MakeCall(0x4DE8DE, sfall::SfallInit); // LoadDirectX_ } + } else { + LoadOriginalDll(fdwReason); } return true; } diff --git a/sfall/version.h b/sfall/version.h index 1b98980e..0e497835 100644 --- a/sfall/version.h +++ b/sfall/version.h @@ -25,6 +25,6 @@ #define VERSION_MAJOR 4 #define VERSION_MINOR 4 #define VERSION_BUILD 0 -#define VERSION_REV 0 +#define VERSION_REV 1 -#define VERSION_STRING "4.4" +#define VERSION_STRING "4.4.0.1"