[PATCH 7/7] kernel32: Implement GetEnabledXStateFeatures().

Paul Gofman pgofman at codeweavers.com
Wed Aug 19 16:23:00 CDT 2020


Signed-off-by: Paul Gofman <pgofman at codeweavers.com>
---
 dlls/kernel32/process.c             |  6 ++++--
 dlls/ntdll/exception.c              | 10 +++++++++
 dlls/ntdll/ntdll.spec               |  1 +
 dlls/ntdll/tests/virtual.c          | 33 +++++++++++++++++++++++------
 dlls/ntoskrnl.exe/ntoskrnl.exe.spec |  1 +
 include/ddk/wdm.h                   |  2 ++
 include/winbase.h                   |  1 +
 7 files changed, 45 insertions(+), 9 deletions(-)

diff --git a/dlls/kernel32/process.c b/dlls/kernel32/process.c
index b2bd5980fd9..4f27fc3298b 100644
--- a/dlls/kernel32/process.c
+++ b/dlls/kernel32/process.c
@@ -741,13 +741,15 @@ DWORD WINAPI GetMaximumProcessorCount(WORD group)
     return cpus;
 }
 
+ULONG64 WINAPI RtlGetEnabledExtendedFeatures(ULONG64 feature_mask);
+
 /***********************************************************************
  *           GetEnabledXStateFeatures (KERNEL32.@)
  */
 DWORD64 WINAPI GetEnabledXStateFeatures(void)
 {
-    FIXME("\n");
-    return 0;
+    TRACE(".\n");
+    return RtlGetEnabledExtendedFeatures(~(ULONG64)0);
 }
 
 /***********************************************************************
diff --git a/dlls/ntdll/exception.c b/dlls/ntdll/exception.c
index f8aca6dfb7f..3f7443bb45b 100644
--- a/dlls/ntdll/exception.c
+++ b/dlls/ntdll/exception.c
@@ -30,6 +30,7 @@
 #define WIN32_NO_STATUS
 #include "windef.h"
 #include "winternl.h"
+#include "ddk/wdm.h"
 #include "wine/exception.h"
 #include "wine/server.h"
 #include "wine/list.h"
@@ -655,3 +656,12 @@ BOOL WINAPI IsBadStringPtrW( LPCWSTR str, UINT_PTR max )
     __ENDTRY
     return FALSE;
 }
+
+
+/**********************************************************************
+ *              RtlGetEnabledExtendedFeatures   (NTDLL.@)
+ */
+ULONG64 WINAPI RtlGetEnabledExtendedFeatures(ULONG64 feature_mask)
+{
+    return user_shared_data->XState.EnabledFeatures & feature_mask;
+}
diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec
index 2a95dddf202..9981c57bd7d 100644
--- a/dlls/ntdll/ntdll.spec
+++ b/dlls/ntdll/ntdll.spec
@@ -693,6 +693,7 @@
 @ stdcall RtlGetDaclSecurityDescriptor(ptr ptr ptr ptr)
 @ stub RtlGetElementGenericTable
 # @ stub RtlGetElementGenericTableAvl
+@ stdcall RtlGetEnabledExtendedFeatures(int64)
 @ stdcall RtlGetExePath(wstr ptr)
 # @ stub RtlGetFirstRange
 @ stdcall RtlGetFrame()
diff --git a/dlls/ntdll/tests/virtual.c b/dlls/ntdll/tests/virtual.c
index 4a0a4a6b8e5..47eb784cbbc 100644
--- a/dlls/ntdll/tests/virtual.c
+++ b/dlls/ntdll/tests/virtual.c
@@ -29,7 +29,9 @@
 
 static unsigned int page_size;
 
+static DWORD64 (WINAPI *pGetEnabledXStateFeatures)(void);
 static NTSTATUS (WINAPI *pRtlCreateUserStack)(SIZE_T, SIZE_T, ULONG, SIZE_T, SIZE_T, INITIAL_TEB *);
+static ULONG64 (WINAPI *pRtlGetEnabledExtendedFeatures)(ULONG64);
 static NTSTATUS (WINAPI *pRtlFreeUserStack)(void *);
 static BOOL (WINAPI *pIsWow64Process)(HANDLE, PBOOL);
 static const BOOL is_win64 = sizeof(void*) != sizeof(int);
@@ -543,6 +545,7 @@ static void test_user_shared_data(void)
     };
     const KSHARED_USER_DATA *user_shared_data = (void *)0x7ffe0000;
     XSTATE_CONFIGURATION xstate = user_shared_data->XState;
+    ULONG64 feature_mask;
     unsigned int i;
 
     ok(user_shared_data->NumberOfPhysicalPages == sbi.MmNumberOfPhysicalPages,
@@ -560,17 +563,24 @@ static void test_user_shared_data(void)
             || broken(!user_shared_data->ActiveGroupCount) /* before Win7 */,
             "Got unexpected ActiveGroupCount %u.\n", user_shared_data->ActiveGroupCount);
 
+    if (!pRtlGetEnabledExtendedFeatures)
+    {
+        skip("RtlGetEnabledExtendedFeatures is not available.\n");
+        return;
+    }
+
+    feature_mask = pRtlGetEnabledExtendedFeatures(~(ULONG64)0);
+    if (!feature_mask)
+    {
+        skip("XState features are not available.\n");
+        return;
+    }
+
     if (!xstate.EnabledFeatures)
     {
         struct old_xstate_configuration *xs_old
                 = (struct old_xstate_configuration *)((char *)user_shared_data + 0x3e0);
 
-        if (!xs_old->EnabledFeatures)
-        {
-            skip("XState features are not supported.\n");
-            return;
-        }
-
         memset(&xstate, 0, sizeof(xstate));
         xstate.EnabledFeatures = xstate.EnabledVolatileFeatures = xs_old->EnabledFeatures;
         memcpy(&xstate.Size, &xs_old->Size, sizeof(*xs_old) - offsetof(struct old_xstate_configuration, Size));
@@ -580,6 +590,14 @@ static void test_user_shared_data(void)
     }
 
     trace("XState EnabledFeatures %s.\n", wine_dbgstr_longlong(xstate.EnabledFeatures));
+    feature_mask = pRtlGetEnabledExtendedFeatures(0);
+    ok(!feature_mask, "Got unexpected feature_mask %s.\n", wine_dbgstr_longlong(feature_mask));
+    feature_mask = pRtlGetEnabledExtendedFeatures(~(ULONG64)0);
+    ok(feature_mask == xstate.EnabledFeatures, "Got unexpected feature_mask %s.\n",
+            wine_dbgstr_longlong(feature_mask));
+    feature_mask = pGetEnabledXStateFeatures();
+    ok(feature_mask == xstate.EnabledFeatures, "Got unexpected feature_mask %s.\n",
+            wine_dbgstr_longlong(feature_mask));
     ok((xstate.EnabledFeatures & SUPPORTED_XSTATE_FEATURES) == SUPPORTED_XSTATE_FEATURES,
             "Got unexpected EnabledFeatures %s.\n", wine_dbgstr_longlong(xstate.EnabledFeatures));
     ok((xstate.EnabledVolatileFeatures & SUPPORTED_XSTATE_FEATURES) == xstate.EnabledFeatures,
@@ -623,10 +641,11 @@ START_TEST(virtual)
 
     mod = GetModuleHandleA("kernel32.dll");
     pIsWow64Process = (void *)GetProcAddress(mod, "IsWow64Process");
-
+    pGetEnabledXStateFeatures = (void *)GetProcAddress(mod, "GetEnabledXStateFeatures");
     mod = GetModuleHandleA("ntdll.dll");
     pRtlCreateUserStack = (void *)GetProcAddress(mod, "RtlCreateUserStack");
     pRtlFreeUserStack = (void *)GetProcAddress(mod, "RtlFreeUserStack");
+    pRtlGetEnabledExtendedFeatures = (void *)GetProcAddress(mod, "RtlGetEnabledExtendedFeatures");
 
     NtQuerySystemInformation(SystemBasicInformation, &sbi, sizeof(sbi), NULL);
     trace("system page size %#x\n", sbi.PageSize);
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
index 4d39f8eea2f..0e8082fad26 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
+++ b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
@@ -1105,6 +1105,7 @@
 @ stdcall RtlGetProductInfo(long long long long ptr)
 @ stdcall RtlGetSaclSecurityDescriptor(ptr ptr ptr ptr)
 @ stub RtlGetSetBootStatusData
+@ stdcall RtlGetEnabledExtendedFeatures(int64)
 @ stdcall RtlGetVersion(ptr)
 @ stdcall RtlHashUnicodeString(ptr long long ptr)
 @ stdcall RtlIdnToAscii(long wstr long ptr ptr)
diff --git a/include/ddk/wdm.h b/include/ddk/wdm.h
index b8bb7bd971f..23bee1ba9ee 100644
--- a/include/ddk/wdm.h
+++ b/include/ddk/wdm.h
@@ -1843,6 +1843,8 @@ void      WINAPI RtlCopyMemoryNonTemporal(void*,const void*,SIZE_T);
 #endif
 BOOLEAN   WINAPI RtlIsNtDdiVersionAvailable(ULONG);
 
+ULONG64   WINAPI RtlGetEnabledExtendedFeatures(ULONG64 feature_mask);
+
 NTSTATUS  WINAPI ZwAddBootEntry(PUNICODE_STRING,PUNICODE_STRING);
 NTSTATUS  WINAPI ZwAccessCheckAndAuditAlarm(PUNICODE_STRING,HANDLE,PUNICODE_STRING,PUNICODE_STRING,PSECURITY_DESCRIPTOR,ACCESS_MASK,PGENERIC_MAPPING,BOOLEAN,PACCESS_MASK,PBOOLEAN,PBOOLEAN);
 NTSTATUS  WINAPI ZwAdjustPrivilegesToken(HANDLE,BOOLEAN,PTOKEN_PRIVILEGES,DWORD,PTOKEN_PRIVILEGES,PDWORD);
diff --git a/include/winbase.h b/include/winbase.h
index 319423b572f..f2177ada1e4 100644
--- a/include/winbase.h
+++ b/include/winbase.h
@@ -2136,6 +2136,7 @@ WINBASEAPI DWORD       WINAPI GetDllDirectoryW(DWORD,LPWSTR);
 WINBASEAPI UINT        WINAPI GetDriveTypeA(LPCSTR);
 WINBASEAPI UINT        WINAPI GetDriveTypeW(LPCWSTR);
 #define                       GetDriveType WINELIB_NAME_AW(GetDriveType)
+WINBASEAPI DWORD64     WINAPI GetEnabledXStateFeatures(void);
 WINBASEAPI LPSTR       WINAPI GetEnvironmentStringsA(void);
 WINBASEAPI LPWSTR      WINAPI GetEnvironmentStringsW(void);
 #define                       GetEnvironmentStrings WINELIB_NAME_AW(GetEnvironmentStrings)
-- 
2.26.2




More information about the wine-devel mailing list