aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2023-12-01 19:53:13 +0100
committerShauren <shauren.trinity@gmail.com>2023-12-02 15:57:09 +0100
commiteb50b29ab3d95c713bdc5cb508ec06a69704921d (patch)
tree48d50f659a2015e01af0d4c6556c43e8f6ba5544
parente2b26f2038e40760a0f46ae587af9ec985d041eb (diff)
Core/Misc: Added windows version checks during startup to avoid confusion about crashes when running on unsupported OS
(cherry picked from commit 333630b7de15c4090392fcbbc1bc58da4d5fb138)
-rw-r--r--cmake/platform/win/settings.cmake4
-rw-r--r--src/common/Debugging/WheatyExceptionReport.cpp2
-rw-r--r--src/common/Utilities/Util.cpp24
-rw-r--r--src/common/Utilities/Util.h2
-rw-r--r--src/server/authserver/Main.cpp2
-rw-r--r--src/server/worldserver/Main.cpp2
-rw-r--r--src/tools/map_extractor/System.cpp3
-rw-r--r--src/tools/mmaps_generator/PathGenerator.cpp2
-rw-r--r--src/tools/vmap4_assembler/VMapAssembler.cpp3
-rw-r--r--src/tools/vmap4_extractor/vmapexport.cpp3
10 files changed, 41 insertions, 6 deletions
diff --git a/cmake/platform/win/settings.cmake b/cmake/platform/win/settings.cmake
index 60614b1ec6e..16064584e24 100644
--- a/cmake/platform/win/settings.cmake
+++ b/cmake/platform/win/settings.cmake
@@ -1,6 +1,8 @@
-add_definitions(-D_WIN32_WINNT=0x0601)
+add_definitions(-D_WIN32_WINNT=0x0A00) # Windows 10
+add_definitions(-DNTDDI_VERSION=0x0A000007) # 19H1 (1903)
add_definitions(-DWIN32_LEAN_AND_MEAN)
add_definitions(-DNOMINMAX)
+add_definitions(-DTRINITY_REQUIRED_WINDOWS_BUILD=18362)
if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
include(${CMAKE_SOURCE_DIR}/cmake/compiler/msvc/settings.cmake)
diff --git a/src/common/Debugging/WheatyExceptionReport.cpp b/src/common/Debugging/WheatyExceptionReport.cpp
index e0b0bd105de..943c0699381 100644
--- a/src/common/Debugging/WheatyExceptionReport.cpp
+++ b/src/common/Debugging/WheatyExceptionReport.cpp
@@ -234,7 +234,7 @@ BOOL WheatyExceptionReport::_GetWindowsVersion(TCHAR* szVersion, DWORD cntMax)
RTL_OSVERSIONINFOEXW osvi = { };
osvi.dwOSVersionInfoSize = sizeof(RTL_OSVERSIONINFOEXW);
NTSTATUS bVersionEx = RtlGetVersion((PRTL_OSVERSIONINFOW)&osvi);
- if (bVersionEx < 0)
+ if (FAILED(bVersionEx))
{
osvi.dwOSVersionInfoSize = sizeof(RTL_OSVERSIONINFOW);
if (!RtlGetVersion((PRTL_OSVERSIONINFOW)&osvi))
diff --git a/src/common/Utilities/Util.cpp b/src/common/Utilities/Util.cpp
index 8ca639ba6a4..9f9762980b5 100644
--- a/src/common/Utilities/Util.cpp
+++ b/src/common/Utilities/Util.cpp
@@ -31,11 +31,27 @@
#include <ctime>
#include <boost/core/demangle.hpp>
-#if TRINITY_COMPILER == TRINITY_COMPILER_GNU
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
+void Trinity::VerifyOsVersion()
+{
+#if TRINITY_PLATFORM == TRINITY_PLATFORM_WINDOWS
+ auto isWindowsBuildGreaterOrEqual = [](DWORD build)
+ {
+ OSVERSIONINFOEX osvi = { sizeof(osvi), 0, 0, build, 0, {0}, 0, 0, 0, 0 };
+ ULONGLONG conditionMask = 0;
+ VER_SET_CONDITION(conditionMask, VER_BUILDNUMBER, VER_GREATER_EQUAL);
+
+ return VerifyVersionInfo(&osvi, VER_BUILDNUMBER, conditionMask);
+ };
+
+ if (!isWindowsBuildGreaterOrEqual(TRINITY_REQUIRED_WINDOWS_BUILD))
+ {
+ OSVERSIONINFOEX osvi = { sizeof(osvi), 0, 0, 0, 0, {0}, 0, 0, 0, 0 };
+ GetVersionEx((LPOSVERSIONINFO)&osvi);
+ ABORT_MSG("TrinityCore requires Windows 10 19H1 (1903) or Windows Server 2019 (1903) - require build number 10.0.%d but found %d.%d.%d",
+ TRINITY_REQUIRED_WINDOWS_BUILD, osvi.dwMajorVersion, osvi.dwMinorVersion, osvi.dwBuildNumber);
+ }
#endif
+}
std::vector<std::string_view> Trinity::Tokenize(std::string_view str, char sep, bool keepEmpty)
{
diff --git a/src/common/Utilities/Util.h b/src/common/Utilities/Util.h
index 14d633e2ae8..6ddbedd2054 100644
--- a/src/common/Utilities/Util.h
+++ b/src/common/Utilities/Util.h
@@ -39,6 +39,8 @@ enum class TimeFormat : uint8
namespace Trinity
{
+ TC_COMMON_API void VerifyOsVersion();
+
TC_COMMON_API std::vector<std::string_view> Tokenize(std::string_view str, char sep, bool keepEmpty);
/* this would return string_view into temporary otherwise */
diff --git a/src/server/authserver/Main.cpp b/src/server/authserver/Main.cpp
index c4f4873ff57..1fc178b7dbd 100644
--- a/src/server/authserver/Main.cpp
+++ b/src/server/authserver/Main.cpp
@@ -86,6 +86,8 @@ int main(int argc, char** argv)
Trinity::Impl::CurrentServerProcessHolder::_type = SERVER_PROCESS_AUTHSERVER;
signal(SIGABRT, &Trinity::AbortHandler);
+ Trinity::VerifyOsVersion();
+
Trinity::Locale::Init();
auto configFile = fs::absolute(_TRINITY_REALM_CONFIG);
diff --git a/src/server/worldserver/Main.cpp b/src/server/worldserver/Main.cpp
index 39a9ae7d6f3..b9b74598a8f 100644
--- a/src/server/worldserver/Main.cpp
+++ b/src/server/worldserver/Main.cpp
@@ -127,6 +127,8 @@ extern int main(int argc, char** argv)
Trinity::Impl::CurrentServerProcessHolder::_type = SERVER_PROCESS_WORLDSERVER;
signal(SIGABRT, &Trinity::AbortHandler);
+ Trinity::VerifyOsVersion();
+
Trinity::Locale::Init();
auto configFile = fs::absolute(_TRINITY_CORE_CONFIG);
diff --git a/src/tools/map_extractor/System.cpp b/src/tools/map_extractor/System.cpp
index d5210560b10..25eb1a9f9e7 100644
--- a/src/tools/map_extractor/System.cpp
+++ b/src/tools/map_extractor/System.cpp
@@ -20,6 +20,7 @@
#include "Locales.h"
#include "mpq_libmpq04.h"
#include "StringFormat.h"
+#include "Util.h"
#include "adt.h"
#include "wdt.h"
@@ -1121,6 +1122,8 @@ inline void CloseMPQFiles()
int main(int argc, char * arg[])
{
+ Trinity::VerifyOsVersion();
+
Trinity::Locale::Init();
Trinity::Banner::Show("Map & DBC Extractor", [](char const* text) { printf("%s\n", text); }, nullptr);
diff --git a/src/tools/mmaps_generator/PathGenerator.cpp b/src/tools/mmaps_generator/PathGenerator.cpp
index d8693bce323..c24240ef205 100644
--- a/src/tools/mmaps_generator/PathGenerator.cpp
+++ b/src/tools/mmaps_generator/PathGenerator.cpp
@@ -298,6 +298,8 @@ std::unordered_map<uint32, uint8> LoadLiquid()
int main(int argc, char** argv)
{
+ Trinity::VerifyOsVersion();
+
Trinity::Locale::Init();
Trinity::Banner::Show("MMAP generator", [](char const* text) { printf("%s\n", text); }, nullptr);
diff --git a/src/tools/vmap4_assembler/VMapAssembler.cpp b/src/tools/vmap4_assembler/VMapAssembler.cpp
index aedafb6d3da..38eb53ed9be 100644
--- a/src/tools/vmap4_assembler/VMapAssembler.cpp
+++ b/src/tools/vmap4_assembler/VMapAssembler.cpp
@@ -21,9 +21,12 @@
#include "TileAssembler.h"
#include "Banner.h"
#include "Locales.h"
+#include "Util.h"
int main(int argc, char* argv[])
{
+ Trinity::VerifyOsVersion();
+
Trinity::Locale::Init();
Trinity::Banner::Show("VMAP assembler", [](char const* text) { std::cout << text << std::endl; }, nullptr);
diff --git a/src/tools/vmap4_extractor/vmapexport.cpp b/src/tools/vmap4_extractor/vmapexport.cpp
index 4b60199260f..8809c94a0fc 100644
--- a/src/tools/vmap4_extractor/vmapexport.cpp
+++ b/src/tools/vmap4_extractor/vmapexport.cpp
@@ -21,6 +21,7 @@
#include "StringFormat.h"
#include "vmapexport.h"
#include "Locales.h"
+#include "Util.h"
#include "wdtfile.h"
#include "wmo.h"
#include "mpq_libmpq04.h"
@@ -407,6 +408,8 @@ bool processArgv(int argc, char ** argv, const char *versionString)
int main(int argc, char ** argv)
{
+ Trinity::VerifyOsVersion();
+
Trinity::Locale::Init();
Trinity::Banner::Show("VMAP data extractor", [](char const* text) { printf("%s\n", text); }, nullptr);