OS (Windows): restores compatibility with WINE

Revert "OS (Windows): hard linking winbrand"

This reverts commit 4146bb6731.
This commit is contained in:
Carter Li
2025-10-01 16:06:32 +08:00
parent 7a055a2254
commit 554184ec72
2 changed files with 41 additions and 8 deletions
+1 -2
View File
@@ -1035,7 +1035,7 @@ elseif(WIN32)
src/detection/physicalmemory/physicalmemory_linux.c
src/detection/netio/netio_windows.c
src/detection/opengl/opengl_windows.c
src/detection/os/os_windows.c
src/detection/os/os_windows.cpp
src/detection/packages/packages_windows.c
src/detection/poweradapter/poweradapter_nosupport.c
src/detection/processes/processes_windows.c
@@ -1689,7 +1689,6 @@ elseif(WIN32)
PRIVATE "wtsapi32"
PRIVATE "imagehlp"
PRIVATE "cfgmgr32"
PRIVATE "winbrand"
PRIVATE "propsys"
PRIVATE "secur32"
)
@@ -1,10 +1,31 @@
extern "C" {
#include "os.h"
#include "common/library.h"
#include "util/windows/unicode.h"
#include "util/stringUtils.h"
#include "util/windows/registry.h"
}
#include "util/windows/unicode.hpp"
#include "util/windows/wmi.hpp"
#include <windows.h>
static const char* getOsNameByWmi(FFstrbuf* osName)
{
FFWmiQuery query(L"SELECT Caption FROM Win32_OperatingSystem");
if(!query)
return "Query WMI service failed";
if(FFWmiRecord record = query.next())
{
if(auto vtCaption = record.get(L"Caption"))
{
ffStrbufSetWSV(osName, vtCaption.get<std::wstring_view>());
ffStrbufTrimRight(osName, ' ');
return NULL;
}
return "Get Caption failed";
}
return "No WMI result returned";
}
PWSTR WINAPI BrandingFormatString(PCWSTR format);
@@ -24,19 +45,32 @@ static bool getCodeName(FFOSResult* os)
return true;
}
void ffDetectOSImpl(FFOSResult* os)
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
const wchar_t* rawName = BrandingFormatString(L"%WINDOWS_LONG%");
ffStrbufSetWS(&os->variant, rawName);
FF_LIBRARY_LOAD(winbrand, "dlopen winbrand" FF_LIBRARY_EXTENSION " failed", "winbrand" FF_LIBRARY_EXTENSION, 1);
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(winbrand, BrandingFormatString);
const wchar_t* rawName = ffBrandingFormatString(L"%WINDOWS_LONG%");
ffStrbufSetWS(osName, rawName);
GlobalFree((HGLOBAL)rawName);
ffStrbufSet(&os->prettyName, &os->variant);
return NULL;
}
extern "C"
void ffDetectOSImpl(FFOSResult* os)
{
if(getOsNameByWinbrand(&os->variant) && getOsNameByWmi(&os->variant))
return;
ffStrbufTrimRight(&os->variant, ' ');
//WMI returns the "Microsoft" prefix while BrandingFormatString doesn't. Make them consistent.
if(ffStrbufStartsWithS(&os->variant, "Microsoft "))
ffStrbufSubstrAfter(&os->variant, strlen("Microsoft ") - 1);
ffStrbufSet(&os->prettyName, &os->variant);
if(ffStrbufStartsWithS(&os->variant, "Windows "))
{
ffStrbufAppendS(&os->name, "Windows");