From: "Erich E. Hoover" Subject: [PATCH 5/7] advapi32: Support registry objects in GetNamedSecurityInfo (try 2). Message-Id: Date: Mon, 17 Dec 2012 19:00:26 -0700 This patch adds support for registry objects (SE_REGISTRY_KEY) in GetNamedSecurityInfo by using RegOpenKeyW. From 6a5a104a902e2666a7fcad553ac3edec17c7b1e4 Mon Sep 17 00:00:00 2001 From: Erich Hoover Date: Mon, 17 Dec 2012 13:36:45 -0700 Subject: advapi32: Support registry objects in GetNamedSecurityInfo. --- dlls/advapi32/security.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/dlls/advapi32/security.c b/dlls/advapi32/security.c index 8b4a114..59d21f7 100644 --- a/dlls/advapi32/security.c +++ b/dlls/advapi32/security.c @@ -436,6 +436,33 @@ 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, 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; + DWORD err; + + 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; + err = RegOpenKeyW( hParent, p+1, (HKEY *)&key ); + return err; +} + #define WINE_SIZE_OF_WORLD_ACCESS_ACL (sizeof(ACL) + sizeof(ACCESS_ALLOWED_ACE) + sizeof(sidWorld) - sizeof(DWORD)) static void GetWorldAccessACL(PACL pACL) @@ -5540,6 +5567,7 @@ DWORD WINAPI GetNamedSecurityInfoW( LPWSTR name, SE_OBJECT_TYPE type, { case SE_FILE_OBJECT: case SE_SERVICE: + case SE_REGISTRY_KEY: break; default: FIXME( "Object type %d is not currently supported.\n", type ); @@ -5572,6 +5600,9 @@ DWORD WINAPI GetNamedSecurityInfoW( LPWSTR name, SE_OBJECT_TYPE type, case SE_SERVICE: err = get_security_service( name, access, &handle); break; + case SE_REGISTRY_KEY: + err = get_security_regkey( name, &handle ); + break; default: /* SE_FILE_OBJECT */ err = get_security_file( name, access, &handle); break; @@ -5584,6 +5615,9 @@ DWORD WINAPI GetNamedSecurityInfoW( LPWSTR name, SE_OBJECT_TYPE type, case SE_SERVICE: CloseServiceHandle( handle ); break; + case SE_REGISTRY_KEY: + RegCloseKey( handle ); + break; default: /* SE_FILE_OBJECT */ CloseHandle( handle ); break; -- 1.7.9.5