From: "Erich E. Hoover" <ehoover@mymail.mines.edu>
Subject: [PATCH 4/7] advapi32: Support service objects in SetNamedSecurityInfo (try 4).
Message-Id: <CAEU2+vptBQBMwjfkj+VZ+X0NKz5+9vUWhy9ee6n+DrmBAkRKxA@mail.gmail.com>
Date: Mon, 17 Dec 2012 18:59:20 -0700

This patch adds support for service objects (SE_SERVICE) in
SetNamedSecurityInfo by utilizing OpenSCManagerW, OpenServiceW, and
CloseServiceHandle.

From 4b83d83af073cd028f3b70d0bab31604126e6daf Mon Sep 17 00:00:00 2001
From: Erich Hoover <ehoover@mines.edu>
Date: Mon, 17 Dec 2012 13:36:41 -0700
Subject: advapi32: Support service objects in SetNamedSecurityInfo.

---
 dlls/advapi32/security.c |   26 +++++++++++++++++++++++---
 1 file changed, 23 insertions(+), 3 deletions(-)

diff --git a/dlls/advapi32/security.c b/dlls/advapi32/security.c
index a89a3b4..8b4a114 100644
--- a/dlls/advapi32/security.c
+++ b/dlls/advapi32/security.c
@@ -3987,8 +3987,12 @@ DWORD WINAPI SetNamedSecurityInfoW(LPWSTR pObjectName,
 
     TRACE( "%s %d %d %p %p %p %p\n", debugstr_w(pObjectName), ObjectType,
            SecurityInfo, psidOwner, psidGroup, pDacl, pSacl);
-    if (ObjectType != SE_FILE_OBJECT)
+    switch (ObjectType)
     {
+    case SE_FILE_OBJECT:
+    case SE_SERVICE:
+        break;
+    default:
         FIXME( "Object type %d is not currently supported.\n", ObjectType );
         return ERROR_SUCCESS;
     }
@@ -4002,11 +4006,27 @@ DWORD WINAPI SetNamedSecurityInfoW(LPWSTR pObjectName,
     if (SecurityInfo & SACL_SECURITY_INFORMATION)
         access |= ACCESS_SYSTEM_SECURITY;
 
-    err = get_security_file( pObjectName, access, &handle );
+    switch (ObjectType)
+    {
+    case SE_SERVICE:
+        err = get_security_service( pObjectName, access, &handle );
+        break;
+    default: /* SE_FILE_OBJECT */
+        err = get_security_file( pObjectName, access, &handle );
+        break;
+    }
     if (err != ERROR_SUCCESS)
         return err;
     err = SetSecurityInfo( handle, ObjectType, SecurityInfo, psidOwner, psidGroup, pDacl, pSacl );
-    CloseHandle( handle );
+    switch (ObjectType)
+    {
+    case SE_SERVICE:
+        CloseServiceHandle( handle );
+        break;
+    default: /* SE_FILE_OBJECT */
+        CloseHandle( handle );
+        break;
+    }
     return err;
 }
 
-- 
1.7.9.5