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"