diff --git a/shared/sdk/Utility.cpp b/shared/sdk/Utility.cpp index a0dedc72..bf208795 100644 --- a/shared/sdk/Utility.cpp +++ b/shared/sdk/Utility.cpp @@ -1,3 +1,5 @@ +#include + #include #include #include @@ -127,4 +129,34 @@ bool check_file_version(uint32_t ms, uint32_t ls) { return false; } + +std::optional search_for_version(const std::wstring& input) { + std::wregex regex_pattern(LR"(\+\+ue[4|5].*([4|5]\.\d+))", std::regex::icase); + std::wsmatch matches; + + if (std::regex_search(input, matches, regex_pattern)) { + return matches[1].str(); + } + + return std::nullopt; +} + +std::optional search_for_version(HMODULE h) { + const auto module_size = utility::get_module_size(h).value_or(0); + const auto module_start = (const wchar_t*)h; + + for (size_t i = 0; i < module_size / 2; ++i) try { + const wchar_t* ptr = module_start + i; + + if (ptr[0] == L'+' && ptr[1] == L'+') { + if (auto version = search_for_version(ptr)) { + return version; + } + } + } catch(...) { + + } + + return std::nullopt; +} } \ No newline at end of file diff --git a/shared/sdk/Utility.hpp b/shared/sdk/Utility.hpp index 2544171a..25f3c7ec 100644 --- a/shared/sdk/Utility.hpp +++ b/shared/sdk/Utility.hpp @@ -17,4 +17,7 @@ bool is_vfunc_pattern(uintptr_t addr, std::string_view pattern); VS_FIXEDFILEINFO get_file_version_info(); bool check_file_version(uint32_t ms, uint32_t ls); + +std::optional search_for_version(const std::string& input); +std::optional search_for_version(HMODULE h); } \ No newline at end of file diff --git a/src/mods/vr/IXRTrackingSystemHook.cpp b/src/mods/vr/IXRTrackingSystemHook.cpp index 3b58cdde..ef8b2bbf 100644 --- a/src/mods/vr/IXRTrackingSystemHook.cpp +++ b/src/mods/vr/IXRTrackingSystemHook.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include "utility/Logging.hpp" @@ -15,65 +16,66 @@ #include "IXRTrackingSystemHook.hpp" detail::IXRTrackingSystemVT& get_tracking_system_vtable() { + const auto str_version = utility::narrow(sdk::search_for_version(utility::get_executable()).value_or(L"0.00")); const auto version = sdk::get_file_version_info(); // >= 5.1 - if (version.dwFileVersionMS >= 0x50001) { + if (version.dwFileVersionMS == 0x50001 || str_version.starts_with("5.1")) { return ue5_1::IXRTrackingSystemVT::get(); } // >= 5.0 - if (version.dwFileVersionMS == 0x50000) { + if (version.dwFileVersionMS == 0x50000 || str_version.starts_with("5.0")) { return ue5_00::IXRTrackingSystemVT::get(); } // 4.27 - if (version.dwFileVersionMS == 0x4001B) { + if (version.dwFileVersionMS == 0x4001B || str_version.starts_with("4.27")) { return ue4_27::IXRTrackingSystemVT::get(); } // 4.26 - if (version.dwFileVersionMS == 0x4001A) { + if (version.dwFileVersionMS == 0x4001A || str_version.starts_with("4.26")) { return ue4_26::IXRTrackingSystemVT::get(); } // 4.25 - if (version.dwFileVersionMS == 0x40019) { + if (version.dwFileVersionMS == 0x40019 || str_version.starts_with("4.25")) { return ue4_25::IXRTrackingSystemVT::get(); } // 4.24 - if (version.dwFileVersionMS == 0x40018) { + if (version.dwFileVersionMS == 0x40018 || str_version.starts_with("4.24")) { return ue4_24::IXRTrackingSystemVT::get(); } // 4.23 - if (version.dwFileVersionMS == 0x40017) { + if (version.dwFileVersionMS == 0x40017 || str_version.starts_with("4.23")) { return ue4_23::IXRTrackingSystemVT::get(); } // 4.22 - if (version.dwFileVersionMS == 0x40016) { + if (version.dwFileVersionMS == 0x40016 || str_version.starts_with("4.22")) { return ue4_22::IXRTrackingSystemVT::get(); } // 4.21 - if (version.dwFileVersionMS == 0x40015) { + if (version.dwFileVersionMS == 0x40015 || str_version.starts_with("4.21")) { return ue4_21::IXRTrackingSystemVT::get(); } // 4.20 - if (version.dwFileVersionMS == 0x40014) { + if (version.dwFileVersionMS == 0x40014 || str_version.starts_with("4.20")) { return ue4_20::IXRTrackingSystemVT::get(); } // 4.19 - if (version.dwFileVersionMS == 0x40013) { + if (version.dwFileVersionMS == 0x40013 || str_version.starts_with("4.19")) { return ue4_19::IXRTrackingSystemVT::get(); } // 4.18 - if (version.dwFileVersionMS == 0x40012) { + if (version.dwFileVersionMS == 0x40012 || str_version.starts_with("4.18")) { return ue4_18::IXRTrackingSystemVT::get(); } @@ -83,65 +85,66 @@ detail::IXRTrackingSystemVT& get_tracking_system_vtable() { detail::IXRCameraVT& get_camera_vtable() { + const auto str_version = utility::narrow(sdk::search_for_version(utility::get_executable()).value_or(L"0.00")); const auto version = sdk::get_file_version_info(); // >= 5.1 - if (version.dwFileVersionMS >= 0x50001) { + if (version.dwFileVersionMS == 0x50001 || str_version.starts_with("5.1")) { return ue5_1::IXRCameraVT::get(); } // >= 5.0 - if (version.dwFileVersionMS == 0x50000) { + if (version.dwFileVersionMS == 0x50000 || str_version.starts_with("5.0")) { return ue5_00::IXRCameraVT::get(); } // 4.27 - if (version.dwFileVersionMS == 0x4001B) { + if (version.dwFileVersionMS == 0x4001B || str_version.starts_with("4.27")) { return ue4_27::IXRCameraVT::get(); } // 4.26 - if (version.dwFileVersionMS == 0x4001A) { + if (version.dwFileVersionMS == 0x4001A || str_version.starts_with("4.26")) { return ue4_26::IXRCameraVT::get(); } // 4.25 - if (version.dwFileVersionMS == 0x40019) { + if (version.dwFileVersionMS == 0x40019 || str_version.starts_with("4.25")) { return ue4_25::IXRCameraVT::get(); } // 4.24 - if (version.dwFileVersionMS == 0x40018) { + if (version.dwFileVersionMS == 0x40018 || str_version.starts_with("4.24")) { return ue4_24::IXRCameraVT::get(); } // 4.23 - if (version.dwFileVersionMS == 0x40017) { + if (version.dwFileVersionMS == 0x40017 || str_version.starts_with("4.23")) { return ue4_23::IXRCameraVT::get(); } // 4.22 - if (version.dwFileVersionMS == 0x40016) { + if (version.dwFileVersionMS == 0x40016 || str_version.starts_with("4.22")) { return ue4_22::IXRCameraVT::get(); } // 4.21 - if (version.dwFileVersionMS == 0x40015) { + if (version.dwFileVersionMS == 0x40015 || str_version.starts_with("4.21")) { return ue4_21::IXRCameraVT::get(); } // 4.20 - if (version.dwFileVersionMS == 0x40014) { + if (version.dwFileVersionMS == 0x40014 || str_version.starts_with("4.20")) { return ue4_20::IXRCameraVT::get(); } // 4.19 - if (version.dwFileVersionMS == 0x40013) { + if (version.dwFileVersionMS == 0x40013 || str_version.starts_with("4.19")) { return ue4_19::IXRCameraVT::get(); } // 4.18 - if (version.dwFileVersionMS == 0x40012) { + if (version.dwFileVersionMS == 0x40012 || str_version.starts_with("4.18")) { return ue4_18::IXRCameraVT::get(); } @@ -150,100 +153,101 @@ detail::IXRCameraVT& get_camera_vtable() { } detail::IHeadMountedDisplayVT& get_hmd_vtable() { + const auto str_version = utility::narrow(sdk::search_for_version(utility::get_executable()).value_or(L"0.00")); const auto version = sdk::get_file_version_info(); // >= 5.1 - if (version.dwFileVersionMS >= 0x50001) { + if (version.dwFileVersionMS == 0x50001 || str_version.starts_with("5.1")) { return ue5_1::IHeadMountedDisplayVT::get(); } // >= 5.0 - if (version.dwFileVersionMS == 0x50000) { + if (version.dwFileVersionMS == 0x50000 || str_version.starts_with("5.0")) { return ue5_00::IHeadMountedDisplayVT::get(); } // 4.27 - if (version.dwFileVersionMS == 0x4001B) { + if (version.dwFileVersionMS == 0x4001B || str_version.starts_with("4.27")) { return ue4_27::IHeadMountedDisplayVT::get(); } // 4.26 - if (version.dwFileVersionMS == 0x4001A) { + if (version.dwFileVersionMS == 0x4001A || str_version.starts_with("4.26")) { return ue4_26::IHeadMountedDisplayVT::get(); } // 4.25 - if (version.dwFileVersionMS == 0x40019) { + if (version.dwFileVersionMS == 0x40019 || str_version.starts_with("4.25")) { return ue4_25::IHeadMountedDisplayVT::get(); } // 4.24 - if (version.dwFileVersionMS == 0x40018) { + if (version.dwFileVersionMS == 0x40018 || str_version.starts_with("4.24")) { return ue4_24::IHeadMountedDisplayVT::get(); } // 4.23 - if (version.dwFileVersionMS == 0x40017) { + if (version.dwFileVersionMS == 0x40017 || str_version.starts_with("4.23")) { return ue4_23::IHeadMountedDisplayVT::get(); } // 4.22 - if (version.dwFileVersionMS == 0x40016) { + if (version.dwFileVersionMS == 0x40016 || str_version.starts_with("4.22")) { return ue4_22::IHeadMountedDisplayVT::get(); } // 4.21 - if (version.dwFileVersionMS == 0x40015) { + if (version.dwFileVersionMS == 0x40015 || str_version.starts_with("4.21")) { return ue4_21::IHeadMountedDisplayVT::get(); } // 4.20 - if (version.dwFileVersionMS == 0x40014) { + if (version.dwFileVersionMS == 0x40014 || str_version.starts_with("4.20")) { return ue4_20::IHeadMountedDisplayVT::get(); } // 4.19 - if (version.dwFileVersionMS == 0x40013) { + if (version.dwFileVersionMS == 0x40013 || str_version.starts_with("4.19")) { return ue4_19::IHeadMountedDisplayVT::get(); } // 4.18 - if (version.dwFileVersionMS == 0x40012) { + if (version.dwFileVersionMS == 0x40012 || str_version.starts_with("4.18")) { return ue4_18::IHeadMountedDisplayVT::get(); } // 4.17 - if (version.dwFileVersionMS == 0x40011) { + if (version.dwFileVersionMS == 0x40011 || str_version.starts_with("4.17")) { return ue4_17::IHeadMountedDisplayVT::get(); } // 4.16 - if (version.dwFileVersionMS == 0x40010) { + if (version.dwFileVersionMS == 0x40010 || str_version.starts_with("4.16")) { return ue4_16::IHeadMountedDisplayVT::get(); } // 4.15 - if (version.dwFileVersionMS == 0x4000F) { + if (version.dwFileVersionMS == 0x4000F || str_version.starts_with("4.15")) { return ue4_15::IHeadMountedDisplayVT::get(); } // 4.14 - if (version.dwFileVersionMS == 0x4000E) { + if (version.dwFileVersionMS == 0x4000E || str_version.starts_with("4.14")) { return ue4_14::IHeadMountedDisplayVT::get(); } // 4.13 - if (version.dwFileVersionMS == 0x4000D) { + if (version.dwFileVersionMS == 0x4000D || str_version.starts_with("4.13")) { return ue4_13::IHeadMountedDisplayVT::get(); } // 4.12 - if (version.dwFileVersionMS == 0x4000C) { + if (version.dwFileVersionMS == 0x4000C || str_version.starts_with("4.12")) { return ue4_12::IHeadMountedDisplayVT::get(); } // 4.11 - if (version.dwFileVersionMS == 0x4000B) { + if (version.dwFileVersionMS == 0x4000B || str_version.starts_with("4.11")) { return ue4_11::IHeadMountedDisplayVT::get(); }