From 06cb12927c3732ae41de5badae60de1807b124a6 Mon Sep 17 00:00:00 2001 From: cen1 Date: Thu, 28 May 2026 00:07:48 +0200 Subject: [PATCH 1/5] CMake modernization, clean up exported symbols, clarify what MUTIL_LIB_BUILD def does, remove internal-only headers from install --- .gitignore | 3 +- CMakeLists.txt | 130 ++++++++++++++++++++----------------------- src/bncsutil/bsha1.h | 4 -- src/bncsutil/mutil.h | 19 +++++-- src/bncsutil/pe.c | 2 +- 5 files changed, 78 insertions(+), 80 deletions(-) diff --git a/.gitignore b/.gitignore index 6b38132..f0b5cef 100644 --- a/.gitignore +++ b/.gitignore @@ -42,4 +42,5 @@ conaninfo.txt graph_info.json CMakeUserPresets.json cmake-* -.idea/ \ No newline at end of file +.idea/ +obj-x86_64-linux-gnu/ diff --git a/CMakeLists.txt b/CMakeLists.txt index c6a0681..d9c5d23 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,12 +1,8 @@ cmake_minimum_required(VERSION 3.25) -SET(VERSION_MAJOR "1") -SET(VERSION_MINOR "4") -SET(VERSION_PATCH "3") -project(bncsutil VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}") +project(bncsutil VERSION 1.4.5) set(CMAKE_MODULE_PATH ${CMAKE_BINARY_DIR} "${PROJECT_SOURCE_DIR}/CMake/Modules") -message(${CMAKE_BINARY_DIR}) add_library(bncsutil SHARED) @@ -17,7 +13,6 @@ set(HEADERS "src/bncsutil/cdkeydecoder.h" "src/bncsutil/checkrevision.h" "src/bncsutil/decodekey.h" - "src/bncsutil/file.h" "src/bncsutil/keytables.h" "src/bncsutil/libinfo.h" "src/bncsutil/mutil.h" @@ -26,7 +21,6 @@ set(HEADERS "src/bncsutil/oldauth.h" "src/bncsutil/pe.h" "src/bncsutil/sha1.h" - "src/bncsutil/stack.h" ) set(SOURCES @@ -45,79 +39,79 @@ set(SOURCES target_sources(bncsutil PRIVATE ${SOURCES} ${HEADERS}) -if (WIN32) +if(WIN32) option(USE_SYSTEM_LIBS "Use system libraries" OFF) else() option(USE_SYSTEM_LIBS "Use system libraries" ON) endif() -if (CMAKE_GENERATOR_PLATFORM EQUAL "x86") - set_target_properties(bncsutil PROPERTIES COMPILE_FLAGS "-m32" LINK_FLAGS "-m32") - MESSAGE(STATUS "Excluding 64bit library paths from search.") +if(CMAKE_GENERATOR_PLATFORM STREQUAL "x86") + target_compile_options(bncsutil PRIVATE -m32) + target_link_options(bncsutil PRIVATE -m32) + message(STATUS "Excluding 64bit library paths from search.") set_property(GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS OFF) - set(ARCH_DEB i386) - set(ARCH_RPM i686) -elseif (CMAKE_GENERATOR_PLATFORM EQUAL "x64") - set_target_properties(bncsutil PROPERTIES COMPILE_FLAGS "-m64" LINK_FLAGS "-m64") - set(ARCH_DEB amd64) - set(ARCH_RPM x86_64) -else() - set(ARCH_DEB amd64) - set(ARCH_RPM x86_64) +elseif(CMAKE_GENERATOR_PLATFORM STREQUAL "x64") + target_compile_options(bncsutil PRIVATE -m64) + target_link_options(bncsutil PRIVATE -m64) endif() -if (USE_SYSTEM_LIBS) - message("Using system dependencies") +if(USE_SYSTEM_LIBS) + message(STATUS "Using system dependencies") find_package(GMP REQUIRED) target_include_directories(bncsutil PRIVATE src ${GMP_INCLUDE_DIR}) - target_link_libraries(bncsutil ${GMP_LIBRARIES}) + target_link_libraries(bncsutil PRIVATE ${GMP_LIBRARIES}) else() - message("Using conan dependencies") + message(STATUS "Using conan dependencies") find_package(gmp REQUIRED) - target_include_directories(bncsutil PRIVATE src gmp::gmp) + target_include_directories(bncsutil PRIVATE src) target_link_libraries(bncsutil PRIVATE gmp::gmp) endif() -set_target_properties(bncsutil PROPERTIES OUTPUT_NAME bncsutil) +target_compile_definitions(bncsutil PRIVATE MUTIL_LIB_BUILD) if(UNIX) - set_target_properties(bncsutil PROPERTIES VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}") - set_target_properties(bncsutil PROPERTIES SOVERSION 1) - - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -O3 -Wno-multichar -fPIC") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -O3 -Wno-multichar -fPIC") + set_target_properties(bncsutil PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + ) + target_compile_options(bncsutil PRIVATE + -Wall -O3 -Wno-multichar -fPIC + -fvisibility=hidden + $<$:-fvisibility-inlines-hidden> + ) endif() -if (WIN32) - add_definitions(-D_CRT_SECURE_NO_WARNINGS -DMUTIL_LIB_BUILD) +if(WIN32) + target_compile_definitions(bncsutil PRIVATE _CRT_SECURE_NO_WARNINGS) endif() -if (MSVC) - set_property(DIRECTORY PROPERTY VS_STARTUP_PROJECT "bncsutil") +if(MSVC) + set_property(DIRECTORY PROPERTY VS_STARTUP_PROJECT "bncsutil") endif() include(CMakePackageConfigHelpers) +include(GNUInstallDirs) install(TARGETS bncsutil EXPORT bncsutilTargets - RUNTIME DESTINATION bin - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib - INCLUDES DESTINATION include + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} ) -install(FILES ${HEADERS} DESTINATION include/bncsutil) +install(FILES ${HEADERS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/bncsutil) install(EXPORT bncsutilTargets FILE bncsutilTargets.cmake NAMESPACE bncsutil:: - DESTINATION lib/cmake/bncsutil + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/bncsutil ) configure_package_config_file( "${CMAKE_CURRENT_SOURCE_DIR}/CMake/bncsutilConfig.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/bncsutilConfig.cmake" - INSTALL_DESTINATION lib/cmake/bncsutil + INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/bncsutil ) write_basic_package_version_file( @@ -129,37 +123,35 @@ write_basic_package_version_file( install(FILES "${CMAKE_CURRENT_BINARY_DIR}/bncsutilConfig.cmake" "${CMAKE_CURRENT_BINARY_DIR}/bncsutilConfigVersion.cmake" - DESTINATION lib/cmake/bncsutil + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/bncsutil ) -#CPack configuration -SET(CPACK_GENERATOR "DEB" "RPM") -SET(CPACK_PACKAGE_NAME "bncsutil") -SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Battle.Net Chat Service Utility") -SET(CPACK_PACKAGE_VENDOR "bncsutil") -SET(CPACK_PACKAGE_DESCRIPTION "\ +# CPack configuration +set(CPACK_GENERATOR "DEB" "RPM") +set(CPACK_PACKAGE_NAME "bncsutil") +set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Battle.Net Chat Service Utility") +set(CPACK_PACKAGE_VENDOR "bncsutil") +set(CPACK_PACKAGE_DESCRIPTION "\ This will install the library to /usr/local/lib and header files to /usr/local/include.\n \ Make sure these directories are in your library and include paths. \ ") -SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/COPYING") -SET(CPACK_PACKAGE_VERSION_MAJOR "${VERSION_MAJOR}") -SET(CPACK_PACKAGE_VERSION_MINOR "${VERSION_MINOR}") -SET(CPACK_PACKAGE_VERSION_PATCH "${VERSION_PATCH}") +set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/COPYING") +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_PACKAGING_INSTALL_PREFIX "/usr/local") -#DEB configuration -SET(CPACK_DEBIAN_PACKAGE_SECTION "libs") -SET(CPACK_DEBIAN_PACKAGE_HOMEPAGE "https://github.com/BNETDocs/bncsutil") -SET(CPACK_DEBIAN_PACKAGE_MAINTAINER "imbacen@gmail.com") -SET(CPACK_DEBIAN_PACKAGE_ARCHITECTURE ${ARCH_DEB}) -SET(CPACK_DEBIAN_PACKAGE_DEPENDS "libgmp10") - -#RPM configuration -SET(CPACK_RPM_PACKAGE_RELEASE 1) -SET(CPACK_RPM_PACKAGE_LICENSE "LGPL-2.1") -SET(CPACK_RPM_PACKAGE_GROUP "bncsutil") -SET(CPACK_RPM_PACKAGE_URL "https://github.com/BNETDocs/bncsutil") -SET(CPACK_RPM_PACKAGE_REQUIRES "gmp") -SET(CPACK_RPM_PACKAGE_ARCHITECTURE ${ARCH_RPM}) - -INCLUDE(CPack) +# DEB configuration +set(CPACK_DEBIAN_PACKAGE_SECTION "libs") +set(CPACK_DEBIAN_PACKAGE_HOMEPAGE "https://github.com/BNETDocs/bncsutil") +set(CPACK_DEBIAN_PACKAGE_MAINTAINER "imbacen@gmail.com") +set(CPACK_DEBIAN_PACKAGE_DEPENDS "libgmp10") + +# RPM configuration +set(CPACK_RPM_PACKAGE_RELEASE 1) +set(CPACK_RPM_PACKAGE_LICENSE "LGPL-2.1") +set(CPACK_RPM_PACKAGE_GROUP "bncsutil") +set(CPACK_RPM_PACKAGE_URL "https://github.com/BNETDocs/bncsutil") +set(CPACK_RPM_PACKAGE_REQUIRES "gmp") + +include(CPack) diff --git a/src/bncsutil/bsha1.h b/src/bncsutil/bsha1.h index 71fb980..52cff86 100644 --- a/src/bncsutil/bsha1.h +++ b/src/bncsutil/bsha1.h @@ -42,10 +42,6 @@ extern "C" { */ MEXP(void) calcHashBuf(const char* data, size_t length, char* hash); -/* - * New implementation. Broken. No plans to fix. - */ -MEXP(void) bsha1_hash(const char* input, unsigned int length, char* result); #ifdef __cplusplus } // extern "C" diff --git a/src/bncsutil/mutil.h b/src/bncsutil/mutil.h index 981a132..09e4d4e 100644 --- a/src/bncsutil/mutil.h +++ b/src/bncsutil/mutil.h @@ -151,9 +151,18 @@ #endif /** - * I think what this tries to do is differentiate if you are trying to build - * this as a library exporting symbols versus using the library from this same project - * ..which I don't think makes much sense. TODO: evaluate and nuke import part in the future + * MUTIL_LIB_BUILD must be defined when compiling the library itself. + * It is set automatically by CMake via target_compile_definitions(). + * + * When defined (building the .so/.dll): + * MEXP marks symbols for export: + * Windows - __declspec(dllexport) + * Linux - __attribute__((visibility("default"))) (with -fvisibility=hidden) + * + * When not defined (consumer including the header): + * MEXP marks symbols for import: + * Windows - __declspec(dllimport) + * Linux - extern (no-op; ELF resolves symbols at load time) */ #ifdef MOS_WINDOWS # pragma comment(lib, "Version.lib") @@ -166,8 +175,8 @@ # endif #else # ifdef MUTIL_LIB_BUILD -# define MEXP(type) type -# define MCEXP(name) class name +# define MEXP(type) __attribute__((visibility("default"))) type +# define MCEXP(name) class __attribute__((visibility("default"))) name # else # define MEXP(type) extern type # define MCEXP(name) class name diff --git a/src/bncsutil/pe.c b/src/bncsutil/pe.c index decbb1c..2843e89 100644 --- a/src/bncsutil/pe.c +++ b/src/bncsutil/pe.c @@ -245,7 +245,7 @@ MEXP(void) cm_pe_unload(cm_pe_t pe) free(pe); } -MEXP(cm_pe_section_t*) cm_pe_get_section(cm_pe_t pe, const char* name) { +static cm_pe_section_t* cm_pe_get_section(cm_pe_t pe, const char* name) { unsigned int i; cm_pe_section_t* s; uint32_t section_count = pe->header.section_count; From 44bee746415812ecb5e3567359bc09536ea9d09d Mon Sep 17 00:00:00 2001 From: cen1 Date: Fri, 5 Jun 2026 21:10:37 +0200 Subject: [PATCH 2/5] add gnu export map to not export stl symbols --- CMakeLists.txt | 3 +++ bncsutil.map | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 bncsutil.map diff --git a/CMakeLists.txt b/CMakeLists.txt index d9c5d23..1b440e3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -79,6 +79,9 @@ if(UNIX) -fvisibility=hidden $<$:-fvisibility-inlines-hidden> ) + target_link_options(bncsutil PRIVATE + -Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/bncsutil.map + ) endif() if(WIN32) diff --git a/bncsutil.map b/bncsutil.map new file mode 100644 index 0000000..ee1cc9d --- /dev/null +++ b/bncsutil.map @@ -0,0 +1,68 @@ +{ + global: + /* bsha1 */ + calcHashBuf; + + /* checkrevision */ + checkRevision; + checkRevisionFlat; + extractMPQNumber; + getExeInfo; + get_mpq_seed; + set_mpq_seed; + + /* decodekey (C wrappers) */ + kd_calculateHash; + kd_create; + kd_free; + kd_getHash; + kd_init; + kd_isValid; + kd_longVal2; + kd_product; + kd_quick; + kd_val1; + kd_val2; + kd_val2Length; + + /* libinfo */ + bncsutil_getVersion; + bncsutil_getVersionString; + + /* nls */ + nls_account_change_proof; + nls_account_create; + nls_account_logon; + nls_check_M2; + nls_check_signature; + nls_free; + nls_get_A; + nls_get_K; + nls_get_M1; + nls_get_S; + nls_get_v; + nls_init; + nls_init_l; + nls_reinit; + nls_reinit_l; + + /* oldauth */ + doubleHashPassword; + hashPassword; + + /* pe */ + cm_pe_fixed_version; + cm_pe_load; + cm_pe_load_resources; + cm_pe_unload; + cm_pe_unload_resources; + + /* CDKeyDecoder C++ class (methods, vtable, typeinfo) */ + _ZN12CDKeyDecoder*; + _ZTI12CDKeyDecoder; + _ZTS12CDKeyDecoder; + _ZTV12CDKeyDecoder; + + local: + *; +}; From 45e89273662a600439ae58a931b87a96e018cfbd Mon Sep 17 00:00:00 2001 From: cen1 Date: Fri, 5 Jun 2026 23:08:10 +0200 Subject: [PATCH 3/5] ignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index f0b5cef..9c4b6e9 100644 --- a/.gitignore +++ b/.gitignore @@ -44,3 +44,4 @@ CMakeUserPresets.json cmake-* .idea/ obj-x86_64-linux-gnu/ +.claude/ From d701ea88063b95d5e456431f9ca08cb900c76b01 Mon Sep 17 00:00:00 2001 From: cen1 Date: Fri, 5 Jun 2026 23:32:27 +0200 Subject: [PATCH 4/5] remove the example .exe from git --- vb6_example/BNCSutilExample.exe | Bin 57344 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 vb6_example/BNCSutilExample.exe diff --git a/vb6_example/BNCSutilExample.exe b/vb6_example/BNCSutilExample.exe deleted file mode 100644 index c774f4fd65c4785317f94590b11b0c2b73dc6d9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57344 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 Date: Tue, 11 Aug 2026 22:12:49 +0200 Subject: [PATCH 5/5] do not hardcode VS version in ci --- .github/workflows/cmake.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index 1e5cf8f..c2648f2 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -111,6 +111,6 @@ jobs: - name: Build shell: cmd working-directory: ./build - run: .\conanbuild.bat && cmake .. -G "Visual Studio 17 2022" -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake -DBUILD_SHARED_LIBS=1 && cmake --build . --config Release + run: .\conanbuild.bat && cmake .. -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake -DBUILD_SHARED_LIBS=1 && cmake --build . --config Release \ No newline at end of file