Zebediah Figura : advapi32: Support GetSecurityInfo() with special root HKEY constants.

Alexandre Julliard julliard at winehq.org
Fri Feb 5 16:50:48 CST 2021


Module: wine
Branch: master
Commit: e0302343542a9b2c6ad21e75bdea202852bae0b5
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=e0302343542a9b2c6ad21e75bdea202852bae0b5

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Thu Feb  4 21:24:11 2021 -0600

advapi32: Support GetSecurityInfo() with special root HKEY constants.

This fixes a message box with the ASCOM Platform installer.

Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/advapi32/security.c       | 31 ++++++++++++++++++++++++++++++-
 dlls/advapi32/tests/security.c |  4 ++--
 2 files changed, 32 insertions(+), 3 deletions(-)

diff --git a/dlls/advapi32/security.c b/dlls/advapi32/security.c
index a01791bbf0b..9f80a846966 100644
--- a/dlls/advapi32/security.c
+++ b/dlls/advapi32/security.c
@@ -1467,6 +1467,9 @@ BOOL WINAPI PrivilegedServiceAuditAlarmA( LPCSTR SubsystemName, LPCSTR ServiceNa
     return TRUE;
 }
 
+#define HKEY_SPECIAL_ROOT_FIRST   HKEY_CLASSES_ROOT
+#define HKEY_SPECIAL_ROOT_LAST    HKEY_DYN_DATA
+
 /******************************************************************************
  * GetSecurityInfo [ADVAPI32.@]
  *
@@ -1522,17 +1525,43 @@ DWORD WINAPI GetSecurityInfo( HANDLE handle, SE_OBJECT_TYPE type, SECURITY_INFOR
     }
     else
     {
+        HKEY key = NULL;
+
+        if (type == SE_REGISTRY_KEY && (HandleToUlong(handle) >= HandleToUlong(HKEY_SPECIAL_ROOT_FIRST))
+                && (HandleToUlong(handle) <= HandleToUlong(HKEY_SPECIAL_ROOT_LAST)))
+        {
+            REGSAM access = READ_CONTROL;
+            DWORD ret;
+
+            if (SecurityInfo & SACL_SECURITY_INFORMATION)
+                access |= ACCESS_SYSTEM_SECURITY;
+
+            if ((ret = RegCreateKeyExW( handle, NULL, 0, NULL, 0, access, NULL, &key, NULL )))
+                return ret;
+
+            handle = key;
+        }
+
         status = NtQuerySecurityObject( handle, SecurityInfo, NULL, 0, &size );
         if (status != STATUS_SUCCESS && status != STATUS_BUFFER_TOO_SMALL)
+        {
+            RegCloseKey( key );
             return RtlNtStatusToDosError( status );
+        }
 
-        if (!(sd = LocalAlloc( 0, size ))) return ERROR_NOT_ENOUGH_MEMORY;
+        if (!(sd = LocalAlloc( 0, size )))
+        {
+            RegCloseKey( key );
+            return ERROR_NOT_ENOUGH_MEMORY;
+        }
 
         if ((status = NtQuerySecurityObject( handle, SecurityInfo, sd, size, &size )))
         {
+            RegCloseKey( key );
             LocalFree(sd);
             return RtlNtStatusToDosError( status );
         }
+        RegCloseKey( key );
     }
 
     if (ppsidOwner)
diff --git a/dlls/advapi32/tests/security.c b/dlls/advapi32/tests/security.c
index 91b358543d5..b8908b2b136 100644
--- a/dlls/advapi32/tests/security.c
+++ b/dlls/advapi32/tests/security.c
@@ -7913,12 +7913,12 @@ static void test_pseudo_handle_security(void)
         ret = GetSecurityInfo(keys[i], SE_REGISTRY_KEY,
                 DACL_SECURITY_INFORMATION, NULL, NULL, NULL, NULL, &sd_ptr);
         if (keys[i] == HKEY_PERFORMANCE_DATA)
-            ok(ret == ERROR_INVALID_HANDLE, "key %p: got error %u\n", keys[i], ret);
+            todo_wine ok(ret == ERROR_INVALID_HANDLE, "key %p: got error %u\n", keys[i], ret);
         else if (keys[i] == HKEY_DYN_DATA)
             todo_wine ok(ret == ERROR_CALL_NOT_IMPLEMENTED || broken(ret == ERROR_INVALID_HANDLE) /* <7 */,
                     "key %p: got error %u\n", keys[i], ret);
         else
-            todo_wine ok(!ret, "key %p: got error %u\n", keys[i], ret);
+            ok(!ret, "key %p: got error %u\n", keys[i], ret);
         LocalFree(sd_ptr);
 
         ret = GetSecurityInfo(keys[i], SE_KERNEL_OBJECT,




More information about the wine-cvs mailing list