Paul Vriens : advapi/service: Create specific access rights for service handles.

Alexandre Julliard julliard at wine.codeweavers.com
Fri Jul 13 08:30:13 CDT 2007


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

Author: Paul Vriens <paul.vriens.wine at gmail.com>
Date:   Thu Jul 12 16:22:21 2007 +0200

advapi/service: Create specific access rights for service handles.

---

 dlls/advapi32/service.c |   17 ++++++++++++++++-
 1 files changed, 16 insertions(+), 1 deletions(-)

diff --git a/dlls/advapi32/service.c b/dlls/advapi32/service.c
index 802dcaa..f087d75 100644
--- a/dlls/advapi32/service.c
+++ b/dlls/advapi32/service.c
@@ -52,6 +52,13 @@ static const GENERIC_MAPPING scm_generic = {
     SC_MANAGER_ALL_ACCESS
 };
 
+static const GENERIC_MAPPING svc_generic = {
+    (STANDARD_RIGHTS_READ | SERVICE_QUERY_CONFIG | SERVICE_QUERY_STATUS | SERVICE_INTERROGATE | SERVICE_ENUMERATE_DEPENDENTS),
+    (STANDARD_RIGHTS_WRITE | SERVICE_CHANGE_CONFIG),
+    (STANDARD_RIGHTS_EXECUTE | SERVICE_START | SERVICE_STOP | SERVICE_PAUSE_CONTINUE | SERVICE_USER_DEFINED_CONTROL),
+    SERVICE_ALL_ACCESS
+};
+
 typedef struct service_start_info_t
 {
     DWORD cmd;
@@ -1234,6 +1241,7 @@ SC_HANDLE WINAPI OpenServiceW( SC_HANDLE hSCManager, LPCWSTR lpServiceName,
     HKEY hKey;
     long r;
     DWORD len;
+    DWORD new_mask = dwDesiredAccess;
 
     TRACE("%p %s %d\n", hSCManager, debugstr_w(lpServiceName), dwDesiredAccess);
 
@@ -1268,7 +1276,9 @@ SC_HANDLE WINAPI OpenServiceW( SC_HANDLE hSCManager, LPCWSTR lpServiceName,
     }
     strcpyW( hsvc->name, lpServiceName );
     hsvc->hkey = hKey;
-    hsvc->dwAccess = dwDesiredAccess;
+
+    RtlMapGenericMask(&new_mask, &svc_generic);
+    hsvc->dwAccess = new_mask;
 
     /* add reference to SCM handle */
     hscm->hdr.ref_count++;
@@ -1298,6 +1308,7 @@ CreateServiceW( SC_HANDLE hSCManager, LPCWSTR lpServiceName,
     DWORD dp, len;
     struct reg_value val[10];
     int n = 0;
+    DWORD new_mask = dwDesiredAccess;
 
     TRACE("%p %s %s\n", hSCManager, 
           debugstr_w(lpServiceName), debugstr_w(lpDisplayName));
@@ -1379,6 +1390,10 @@ CreateServiceW( SC_HANDLE hSCManager, LPCWSTR lpServiceName,
         goto error;
     lstrcpyW( hsvc->name, lpServiceName );
     hsvc->hkey = hKey;
+
+    RtlMapGenericMask(&new_mask, &svc_generic);
+    hsvc->dwAccess = new_mask;
+
     hsvc->scm = hscm;
     hscm->hdr.ref_count++;
 




More information about the wine-cvs mailing list