Module: wine Branch: master Commit: 2b22cf580e9281760e69e0c64a6a444aa68ccfe6 URL: https://gitlab.winehq.org/wine/wine/-/commit/2b22cf580e9281760e69e0c64a6a444...
Author: Rémi Bernon rbernon@codeweavers.com Date: Thu Nov 23 12:02:30 2023 +0100
twinapi.appcore: Implement Windows.System.Profile.AnalyticsInfo_get_DeviceFamilyVersion.
---
dlls/twinapi.appcore/Makefile.in | 2 +- dlls/twinapi.appcore/analytics_info.c | 21 +++++++++++++++++++-- dlls/twinapi.appcore/tests/Makefile.in | 2 +- dlls/twinapi.appcore/tests/twinapi.c | 23 +++++++++++++++++++++++ 4 files changed, 44 insertions(+), 4 deletions(-)
diff --git a/dlls/twinapi.appcore/Makefile.in b/dlls/twinapi.appcore/Makefile.in index 0b15039e768..c115182d948 100644 --- a/dlls/twinapi.appcore/Makefile.in +++ b/dlls/twinapi.appcore/Makefile.in @@ -1,6 +1,6 @@ EXTRADEFS = -D_CONTRACT_GEN MODULE = twinapi.appcore.dll -IMPORTS = combase +IMPORTS = combase advapi32
SOURCES = \ analytics_info.c \ diff --git a/dlls/twinapi.appcore/analytics_info.c b/dlls/twinapi.appcore/analytics_info.c index ee640e54daf..abbdb621e1d 100644 --- a/dlls/twinapi.appcore/analytics_info.c +++ b/dlls/twinapi.appcore/analytics_info.c @@ -19,6 +19,8 @@
#include "private.h"
+#include "winternl.h" + WINE_DEFAULT_DEBUG_CHANNEL(twinapi);
struct analytics_version_info @@ -95,8 +97,23 @@ static HRESULT WINAPI analytics_version_info_get_DeviceFamily( IAnalyticsVersion
static HRESULT WINAPI analytics_version_info_get_DeviceFamilyVersion( IAnalyticsVersionInfo *iface, HSTRING *value ) { - FIXME( "iface %p, value %p stub!\n", iface, value ); - return E_NOTIMPL; + DWORD revision, size; + WCHAR buffer[32]; + UINT64 version; + UINT len; + + TRACE( "iface %p, value %p\n", iface, value ); + + if (RegGetValueW( HKEY_LOCAL_MACHINE, L"Software\Microsoft\Windows NT\CurrentVersion", L"UBR", + RRF_RT_REG_DWORD, NULL, &revision, &size )) + revision = 0; + version = NtCurrentTeb()->Peb->OSMajorVersion & 0xffff; + version = (version << 16) | (NtCurrentTeb()->Peb->OSMinorVersion & 0xffff); + version = (version << 16) | (NtCurrentTeb()->Peb->OSBuildNumber & 0xffff); + version = (version << 16) | revision; + + len = swprintf( buffer, ARRAY_SIZE(buffer), L"%I64u", version ); + return WindowsCreateString( buffer, len, value ); }
static IAnalyticsVersionInfoVtbl analytics_version_info_vtbl = diff --git a/dlls/twinapi.appcore/tests/Makefile.in b/dlls/twinapi.appcore/tests/Makefile.in index 65db4bdd3e6..292924c91e2 100644 --- a/dlls/twinapi.appcore/tests/Makefile.in +++ b/dlls/twinapi.appcore/tests/Makefile.in @@ -1,5 +1,5 @@ TESTDLL = twinapi.appcore.dll -IMPORTS = combase +IMPORTS = combase advapi32
SOURCES = \ twinapi.c diff --git a/dlls/twinapi.appcore/tests/twinapi.c b/dlls/twinapi.appcore/tests/twinapi.c index a32b232af9a..17c572e0f3a 100644 --- a/dlls/twinapi.appcore/tests/twinapi.c +++ b/dlls/twinapi.appcore/tests/twinapi.c @@ -25,6 +25,7 @@ #define COBJMACROS #include "initguid.h" #include "winstring.h" +#include "winternl.h" #include "roapi.h"
#define WIDL_using_Windows_Foundation @@ -118,6 +119,9 @@ static void test_AnalyticsVersionInfo(void) IAnalyticsVersionInfo *analytics_version_info; IActivationFactory *factory; HSTRING str, expect_str; + DWORD revision, size; + WCHAR buffer[32]; + UINT64 version; HRESULT hr; INT32 res; LONG ref; @@ -158,6 +162,25 @@ static void test_AnalyticsVersionInfo(void) WindowsDeleteString( str ); WindowsDeleteString( expect_str );
+ if (RegGetValueW( HKEY_LOCAL_MACHINE, L"Software\Microsoft\Windows NT\CurrentVersion", L"UBR", + RRF_RT_REG_DWORD, NULL, &revision, &size )) + revision = 0; + version = NtCurrentTeb()->Peb->OSMajorVersion & 0xffff; + version = (version << 16) | (NtCurrentTeb()->Peb->OSMinorVersion & 0xffff); + version = (version << 16) | (NtCurrentTeb()->Peb->OSBuildNumber & 0xffff); + version = (version << 16) | revision; + + res = swprintf( buffer, ARRAY_SIZE(buffer), L"%I64u", version ); + hr = WindowsCreateString( buffer, res, &expect_str ); + ok( hr == S_OK, "got hr %#lx.\n", hr ); + hr = IAnalyticsVersionInfo_get_DeviceFamilyVersion( analytics_version_info, &str ); + ok( hr == S_OK, "got hr %#lx.\n", hr ); + hr = WindowsCompareStringOrdinal( str, expect_str, &res ); + ok( hr == S_OK, "got hr %#lx.\n", hr ); + ok( !res || broken(revision == 0) /* Win11 */, "got unexpected string %s.\n", debugstr_hstring(str) ); + WindowsDeleteString( str ); + WindowsDeleteString( expect_str ); + ref = IAnalyticsVersionInfo_Release( analytics_version_info ); ok( ref == 0, "got ref %ld.\n", ref );