Erich Hoover : advapi32: Support registry objects in GetNamedSecurityInfo.

Alexandre Julliard julliard at winehq.org
Tue Feb 5 13:25:26 CST 2013


Module: wine
Branch: master
Commit: 5368301a482d3b48b5b3aae10c426f992e8ba919
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=5368301a482d3b48b5b3aae10c426f992e8ba919

Author: Erich Hoover <ehoover at mines.edu>
Date:   Sat Feb  2 08:52:04 2013 -0700

advapi32: Support registry objects in GetNamedSecurityInfo.

---

 dlls/advapi32/security.c |   36 ++++++++++++++++++++++++++++++++++--
 1 files changed, 34 insertions(+), 2 deletions(-)

diff --git a/dlls/advapi32/security.c b/dlls/advapi32/security.c
index 474c522..825d02e 100644
--- a/dlls/advapi32/security.c
+++ b/dlls/advapi32/security.c
@@ -436,6 +436,31 @@ static inline DWORD get_security_service( LPWSTR full_service_name, DWORD access
     return err;
 }
 
+/* helper function for SE_REGISTRY_KEY objects in [Get|Set]NamedSecurityInfo */
+static inline DWORD get_security_regkey( LPWSTR full_key_name, DWORD access, HANDLE *key )
+{
+    WCHAR classes_rootW[] = {'C','L','A','S','S','E','S','_','R','O','O','T',0};
+    WCHAR current_userW[] = {'C','U','R','R','E','N','T','_','U','S','E','R',0};
+    WCHAR machineW[] = {'M','A','C','H','I','N','E',0};
+    WCHAR usersW[] = {'U','S','E','R','S',0};
+    LPWSTR p = strchrW(full_key_name, '\\');
+    int len = p-full_key_name;
+    HKEY hParent;
+
+    if (!p) return ERROR_INVALID_PARAMETER;
+    if (strncmpW( full_key_name, classes_rootW, len ) == 0)
+        hParent = HKEY_CLASSES_ROOT;
+    else if (strncmpW( full_key_name, current_userW, len ) == 0)
+        hParent = HKEY_CURRENT_USER;
+    else if (strncmpW( full_key_name, machineW, len ) == 0)
+        hParent = HKEY_LOCAL_MACHINE;
+    else if (strncmpW( full_key_name, usersW, len ) == 0)
+        hParent = HKEY_USERS;
+    else
+        return ERROR_INVALID_PARAMETER;
+    return RegOpenKeyExW( hParent, p+1, 0, access, (HKEY *)key );
+}
+
 #define	WINE_SIZE_OF_WORLD_ACCESS_ACL	(sizeof(ACL) + sizeof(ACCESS_ALLOWED_ACE) + sizeof(sidWorld) - sizeof(DWORD))
 
 static void GetWorldAccessACL(PACL pACL)
@@ -5578,14 +5603,21 @@ DWORD WINAPI GetNamedSecurityInfoW( LPWSTR name, SE_OBJECT_TYPE type,
     switch (type)
     {
     case SE_SERVICE:
-        if (!(err = get_security_service( name, access, &handle)))
+        if (!(err = get_security_service( name, access, &handle )))
         {
             err = GetSecurityInfo( handle, type, info, owner, group, dacl, sacl, descriptor );
             CloseServiceHandle( handle );
         }
         break;
+    case SE_REGISTRY_KEY:
+        if (!(err = get_security_regkey( name, access, &handle )))
+        {
+            err = GetSecurityInfo( handle, type, info, owner, group, dacl, sacl, descriptor );
+            RegCloseKey( handle );
+        }
+        break;
     case SE_FILE_OBJECT:
-        if (!(err = get_security_file( name, access, &handle)))
+        if (!(err = get_security_file( name, access, &handle )))
         {
             err = GetSecurityInfo( handle, type, info, owner, group, dacl, sacl, descriptor );
             CloseHandle( handle );




More information about the wine-cvs mailing list