From a217ab37ca4333de90395654b8665c1f8f77cf09 Mon Sep 17 00:00:00 2001 From: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com> Date: Sun, 21 Jun 2026 17:07:36 -0400 Subject: [PATCH 1/2] build: use 4 part version scheme --- .github/workflows/ci.yml | 1 + cmake/build_version.cmake | 9 ++++++++- cmake/packaging/common.cmake | 1 + src/platform/windows/driver/CMakeLists.txt | 3 ++- src/platform/windows/driver/libvirtualhid_umdf.cpp | 6 +----- 5 files changed, 13 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6eb7c3b..12609e1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -37,6 +37,7 @@ jobs: id: setup_release uses: LizardByte/actions/actions/release_setup@200eaeb897a2b065a65cb6f16b41077432007490 # v2026.605.34721 with: + dotnet: true github_token: ${{ secrets.GITHUB_TOKEN }} build: diff --git a/cmake/build_version.cmake b/cmake/build_version.cmake index d77f29c..7cf063b 100644 --- a/cmake/build_version.cmake +++ b/cmake/build_version.cmake @@ -22,18 +22,25 @@ if(DEFINED ENV{BUILD_VERSION} AND NOT "$ENV{BUILD_VERSION}" STREQUAL "") # cmak set(CMAKE_PROJECT_VERSION "${PROJECT_VERSION}") endif() -if(PROJECT_VERSION MATCHES "^([0-9]+)\\.([0-9]+)\\.([0-9]+)") +if(PROJECT_VERSION MATCHES "^([0-9]+)\\.([0-9]+)\\.([0-9]+)(\\.([0-9]+))?$") set(PROJECT_VERSION_MAJOR "${CMAKE_MATCH_1}") set(CMAKE_PROJECT_VERSION_MAJOR "${CMAKE_MATCH_1}") set(PROJECT_VERSION_MINOR "${CMAKE_MATCH_2}") set(CMAKE_PROJECT_VERSION_MINOR "${CMAKE_MATCH_2}") set(PROJECT_VERSION_PATCH "${CMAKE_MATCH_3}") set(CMAKE_PROJECT_VERSION_PATCH "${CMAKE_MATCH_3}") + if(CMAKE_MATCH_5) + set(PROJECT_VERSION_TWEAK "${CMAKE_MATCH_5}") + else() + set(PROJECT_VERSION_TWEAK 0) + endif() + set(CMAKE_PROJECT_VERSION_TWEAK "${PROJECT_VERSION_TWEAK}") endif() message(STATUS "PROJECT_VERSION: ${PROJECT_VERSION}") message(STATUS "PROJECT_VERSION_MAJOR: ${PROJECT_VERSION_MAJOR}") message(STATUS "PROJECT_VERSION_MINOR: ${PROJECT_VERSION_MINOR}") message(STATUS "PROJECT_VERSION_PATCH: ${PROJECT_VERSION_PATCH}") +message(STATUS "PROJECT_VERSION_TWEAK: ${PROJECT_VERSION_TWEAK}") message(STATUS "GITHUB_BRANCH: ${GITHUB_BRANCH}") message(STATUS "GITHUB_COMMIT: ${GITHUB_COMMIT}") diff --git a/cmake/packaging/common.cmake b/cmake/packaging/common.cmake index 8b31e36..5cc6bed 100644 --- a/cmake/packaging/common.cmake +++ b/cmake/packaging/common.cmake @@ -5,6 +5,7 @@ set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION}) set(CPACK_PACKAGE_VERSION_MAJOR ${PROJECT_VERSION_MAJOR}) set(CPACK_PACKAGE_VERSION_MINOR ${PROJECT_VERSION_MINOR}) set(CPACK_PACKAGE_VERSION_PATCH ${PROJECT_VERSION_PATCH}) +set(CPACK_PACKAGE_VERSION_TWEAK ${PROJECT_VERSION_TWEAK}) set(CPACK_PACKAGE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/cpack_artifacts) set(CPACK_PACKAGE_CONTACT "https://app.lizardbyte.dev") set(CPACK_PACKAGE_DESCRIPTION ${CMAKE_PROJECT_DESCRIPTION}) diff --git a/src/platform/windows/driver/CMakeLists.txt b/src/platform/windows/driver/CMakeLists.txt index 6b50d38..0e197c6 100644 --- a/src/platform/windows/driver/CMakeLists.txt +++ b/src/platform/windows/driver/CMakeLists.txt @@ -30,7 +30,8 @@ elseif(LIBVIRTUALHID_WDK_ARCH STREQUAL "win32" OR LIBVIRTUALHID_WDK_ARCH STREQUA else() message(FATAL_ERROR "Unsupported WDK architecture: ${LIBVIRTUALHID_WDK_ARCH}") endif() -set(LIBVIRTUALHID_DRIVER_VERSION "${PROJECT_VERSION}.0") +set(LIBVIRTUALHID_DRIVER_VERSION + "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}.${PROJECT_VERSION_TWEAK}") set(_lvh_wdk_roots) foreach(lvh_wdk_root IN ITEMS diff --git a/src/platform/windows/driver/libvirtualhid_umdf.cpp b/src/platform/windows/driver/libvirtualhid_umdf.cpp index daace80..96b4f93 100644 --- a/src/platform/windows/driver/libvirtualhid_umdf.cpp +++ b/src/platform/windows/driver/libvirtualhid_umdf.cpp @@ -35,7 +35,6 @@ #include #include #include -#include #include #include @@ -296,10 +295,7 @@ namespace { } void set_device_path(std::uint64_t driver_device_id, char (&device_path)[LVH_WINDOWS_MAX_DEVICE_PATH_SIZE]) { - std::ostringstream stream; - stream << LVH_WINDOWS_CONTROL_DEVICE_PATH << '#' << driver_device_id; - - const auto path = stream.str(); + const auto path = std::string {LVH_WINDOWS_CONTROL_DEVICE_PATH} + "#" + std::to_string(driver_device_id); const auto copied_size = std::min(path.size(), sizeof(device_path) - 1U); std::memcpy(device_path, path.data(), copied_size); device_path[copied_size] = '\0'; From accc8301a0c1cb996c9dd8c4f2e3ed786c307b95 Mon Sep 17 00:00:00 2001 From: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com> Date: Sun, 21 Jun 2026 17:15:47 -0400 Subject: [PATCH 2/2] Use to_chars for device path formatting Replace allocation-based std::string/std::to_string usage in set_device_path with std::to_chars to write the numeric driver ID directly into the provided buffer. Add include, remove unused , and use memcpy for the constant prefix and '#' separator. Add a static_assert to ensure buffer capacity and handle to_chars errors by ensuring the buffer remains null-terminated. This avoids heap allocation and makes path formatting safer and more efficient. --- .../windows/driver/libvirtualhid_umdf.cpp | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/platform/windows/driver/libvirtualhid_umdf.cpp b/src/platform/windows/driver/libvirtualhid_umdf.cpp index 96b4f93..35d918f 100644 --- a/src/platform/windows/driver/libvirtualhid_umdf.cpp +++ b/src/platform/windows/driver/libvirtualhid_umdf.cpp @@ -29,13 +29,13 @@ // standard includes #include #include +#include #include #include #include #include #include #include -#include #include // local includes @@ -295,10 +295,23 @@ namespace { } void set_device_path(std::uint64_t driver_device_id, char (&device_path)[LVH_WINDOWS_MAX_DEVICE_PATH_SIZE]) { - const auto path = std::string {LVH_WINDOWS_CONTROL_DEVICE_PATH} + "#" + std::to_string(driver_device_id); - const auto copied_size = std::min(path.size(), sizeof(device_path) - 1U); - std::memcpy(device_path, path.data(), copied_size); - device_path[copied_size] = '\0'; + constexpr auto path_prefix_size = sizeof(LVH_WINDOWS_CONTROL_DEVICE_PATH) - 1U; + constexpr auto separator_size = 1U; + static_assert(path_prefix_size + separator_size < LVH_WINDOWS_MAX_DEVICE_PATH_SIZE); + + std::memcpy(device_path, LVH_WINDOWS_CONTROL_DEVICE_PATH, path_prefix_size); + device_path[path_prefix_size] = '#'; + + const auto output = std::to_chars( + device_path + path_prefix_size + separator_size, + device_path + sizeof(device_path) - 1U, + driver_device_id + ); + if (output.ec == std::errc {}) { + *output.ptr = '\0'; + } else { + device_path[path_prefix_size + separator_size] = '\0'; + } } void handle_create_gamepad_request(WDFREQUEST request) {