From b1b637fe2fe8e647728114036ad6e7e011fec76b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Sun, 25 Jun 2023 14:01:50 +0800 Subject: [PATCH] OS (Windows): code refactor; fix `common/library.h` usage for C++ --- src/common/library.h | 8 ++++---- src/detection/os/os_windows.cpp | 18 +++++------------- 2 files changed, 9 insertions(+), 17 deletions(-) diff --git a/src/common/library.h b/src/common/library.h index a0de3d621..67590ce8f 100644 --- a/src/common/library.h +++ b/src/common/library.h @@ -10,7 +10,7 @@ #include #define FF_DLOPEN_FLAGS 0 FF_C_NODISCARD static inline void* dlopen(const char* path, int mode) { FF_UNUSED(mode); return LoadLibraryA(path); } - FF_C_NODISCARD static inline void* dlsym(void* handle, const char* symbol) { return GetProcAddress((HMODULE)handle, symbol); } + FF_C_NODISCARD static inline void* dlsym(void* handle, const char* symbol) { return (void*) GetProcAddress((HMODULE)handle, symbol); } static inline int dlclose(void* handle) { return !FreeLibrary((HMODULE)handle); } #else #include @@ -40,20 +40,20 @@ static inline void ffLibraryUnload(void** handle) return returnValue; #define FF_LIBRARY_LOAD_SYMBOL_ADDRESS(library, symbolMapping, symbolName, returnValue) \ - symbolMapping = dlsym(library, #symbolName); \ + symbolMapping = (__typeof__(&symbolName)) dlsym(library, #symbolName); \ if(symbolMapping == NULL) \ return returnValue; #define FF_LIBRARY_LOAD_SYMBOL_ADDRESS2(library, symbolMapping, symbolName, alternateName, returnValue) \ symbolMapping = dlsym(library, #symbolName); \ - if(symbolMapping == NULL && !(symbolMapping = dlsym(library, #alternateName))) \ + if(symbolMapping == NULL && !(symbolMapping = (__typeof__(&symbolName)) dlsym(library, #alternateName))) \ return returnValue; #define FF_LIBRARY_LOAD_SYMBOL(library, symbolName, returnValue) \ __typeof__(&symbolName) FF_LIBRARY_LOAD_SYMBOL_ADDRESS(library, ff ## symbolName, symbolName, returnValue); #define FF_LIBRARY_LOAD_SYMBOL_LAZY(library, symbolName) \ - __typeof__(&symbolName) ff ## symbolName = dlsym(library, #symbolName); + __typeof__(&symbolName) ff ## symbolName = (__typeof__(&symbolName)) dlsym(library, #symbolName); #define FF_LIBRARY_LOAD_SYMBOL_MESSAGE(library, symbolName) \ __typeof__(&symbolName) FF_LIBRARY_LOAD_SYMBOL_ADDRESS(library, ff ## symbolName, symbolName, "dlsym " #symbolName " failed"); diff --git a/src/detection/os/os_windows.cpp b/src/detection/os/os_windows.cpp index aa25e90ae..2b18f198d 100644 --- a/src/detection/os/os_windows.cpp +++ b/src/detection/os/os_windows.cpp @@ -1,5 +1,6 @@ extern "C" { #include "os.h" +#include "common/library.h" #include "util/windows/unicode.h" } #include "util/windows/wmi.hpp" @@ -20,27 +21,18 @@ static const char* getOsNameByWmi(FFstrbuf* osName) return "No WMI result returned"; } -static inline void wrapFreeLibrary(HMODULE* module) -{ - if(*module) - FreeLibrary(*module); -} +PWSTR WINAPI BrandingFormatString(PCWSTR format); static const char* getOsNameByWinbrand(FFstrbuf* osName) { //https://dennisbabkin.com/blog/?t=how-to-tell-the-real-version-of-windows-your-app-is-running-on#ver_string - if(HMODULE __attribute__((__cleanup__(wrapFreeLibrary))) hWinbrand = LoadLibraryW(L"winbrand.dll")) - { - auto BrandingFormatString = (PWSTR(WINAPI*)(PCWSTR))(void*)GetProcAddress(hWinbrand, "BrandingFormatString"); - if(!BrandingFormatString) - return "GetProcAddress(BrandingFormatString) failed"; + FF_LIBRARY_LOAD(winbrand, nullptr, "dlopen winbrand" FF_LIBRARY_EXTENSION " failed", "winbrand" FF_LIBRARY_EXTENSION, 1); + FF_LIBRARY_LOAD_SYMBOL_MESSAGE(winbrand, BrandingFormatString); - const wchar_t* rawName = BrandingFormatString(L"%WINDOWS_LONG%"); + const wchar_t* rawName = ffBrandingFormatString(L"%WINDOWS_LONG%"); ffStrbufSetWS(osName, rawName); GlobalFree((HGLOBAL)rawName); return NULL; - } - return "LoadLibraryW(winbrand.dll) failed"; } extern "C"