1
+ extern " C" {
1
2
#include " os.h"
2
3
#include " common/library.h"
3
- #include "util/windows/unicode.h"
4
4
#include " util/stringUtils.h"
5
5
#include " util/windows/registry.h"
6
+ }
7
+ #include " util/windows/unicode.hpp"
8
+ #include " util/windows/wmi.hpp"
9
+
10
+ static const char * getOsNameByWmi (FFstrbuf* osName)
11
+ {
12
+ FFWmiQuery query (L" SELECT Caption FROM Win32_OperatingSystem" );
13
+ if (!query)
14
+ return " Query WMI service failed" ;
15
+
16
+ if (FFWmiRecord record = query.next ())
17
+ {
18
+ if (auto vtCaption = record.get (L" Caption" ))
19
+ {
20
+ ffStrbufSetWSV (osName, vtCaption.get <std::wstring_view>());
21
+ ffStrbufTrimRight (osName, ' ' );
22
+ return NULL ;
23
+ }
24
+ return " Get Caption failed" ;
25
+ }
6
26
7
- #include <windows.h>
27
+ return " No WMI result returned" ;
28
+ }
8
29
9
30
PWSTR WINAPI BrandingFormatString (PCWSTR format);
10
31
@@ -24,19 +45,32 @@ static bool getCodeName(FFOSResult* os)
24
45
return true ;
25
46
}
26
47
27
- void ffDetectOSImpl ( FFOSResult * os )
48
+ static const char * getOsNameByWinbrand (FFstrbuf* osName )
28
49
{
29
50
// https://dennisbabkin.com/blog/?t=how-to-tell-the-real-version-of-windows-your-app-is-running-on#ver_string
30
- const wchar_t * rawName = BrandingFormatString (L"%WINDOWS_LONG%" );
31
- ffStrbufSetWS (& os -> variant , rawName );
51
+ FF_LIBRARY_LOAD (winbrand, " dlopen winbrand" FF_LIBRARY_EXTENSION " failed" , " winbrand" FF_LIBRARY_EXTENSION, 1 );
52
+ FF_LIBRARY_LOAD_SYMBOL_MESSAGE (winbrand, BrandingFormatString);
53
+
54
+ const wchar_t * rawName = ffBrandingFormatString (L" %WINDOWS_LONG%" );
55
+ ffStrbufSetWS (osName, rawName);
32
56
GlobalFree ((HGLOBAL)rawName);
33
- ffStrbufSet (& os -> prettyName , & os -> variant );
57
+ return NULL ;
58
+ }
59
+
60
+ extern " C"
61
+ void ffDetectOSImpl (FFOSResult* os)
62
+ {
63
+ if (getOsNameByWinbrand (&os->variant ) && getOsNameByWmi (&os->variant ))
64
+ return ;
65
+
34
66
ffStrbufTrimRight (&os->variant , ' ' );
35
67
36
68
// WMI returns the "Microsoft" prefix while BrandingFormatString doesn't. Make them consistent.
37
69
if (ffStrbufStartsWithS (&os->variant , " Microsoft " ))
38
70
ffStrbufSubstrAfter (&os->variant , strlen (" Microsoft " ) - 1 );
39
71
72
+ ffStrbufSet (&os->prettyName , &os->variant );
73
+
40
74
if (ffStrbufStartsWithS (&os->variant , " Windows " ))
41
75
{
42
76
ffStrbufAppendS (&os->name , " Windows" );
0 commit comments