From: "Erich E. Hoover" <ehoover@mymail.mines.edu>
Subject: [PATCH 5/7] advapi32: Support registry objects in GetNamedSecurityInfo (try 2).
Message-Id: <CAEU2+vqFk0E51V_PwdowRSCJPOE584P86jxWvvJG9KRSPMtESA@mail.gmail.com>
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 <ehoover@mines.edu>
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