[ros-diffs] [hpoussin] 24493: Read object security descriptors from .inf file. Apply them for registry keys and services and display a message for files

hpoussin at svn.reactos.org hpoussin at svn.reactos.org
Thu Oct 12 11:01:16 CEST 2006


Author: hpoussin
Date: Thu Oct 12 13:01:16 2006
New Revision: 24493

URL: http://svn.reactos.org/svn/reactos?rev=24493&view=rev
Log:
Read object security descriptors from .inf file. Apply them for registry keys and services and display a message for files

Modified:
    trunk/reactos/dll/win32/setupapi/devinst.c
    trunk/reactos/dll/win32/setupapi/install.c
    trunk/reactos/dll/win32/setupapi/queue.c
    trunk/reactos/dll/win32/setupapi/setupapi_private.h

Modified: trunk/reactos/dll/win32/setupapi/devinst.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/setupapi/devinst.c?rev=24493&r1=24492&r2=24493&view=diff
==============================================================================
--- trunk/reactos/dll/win32/setupapi/devinst.c (original)
+++ trunk/reactos/dll/win32/setupapi/devinst.c Thu Oct 12 13:01:16 2006
@@ -2270,8 +2270,8 @@
                 SetLastError(ERROR_NOT_ENOUGH_MEMORY);
                 goto cleanup;
             }
-            strcpyW(DriverKey, L"{");
-            strcatW(DriverKey, lpGuidString);
+            DriverKey[0] = '{';
+            strcpyW(&DriverKey[1], lpGuidString);
             strcatW(DriverKey, L"}\\");
             pDeviceInstance = &DriverKey[strlenW(DriverKey)];
             rc = RegOpenKeyExW(RootKey,

Modified: trunk/reactos/dll/win32/setupapi/install.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/setupapi/install.c?rev=24493&r1=24492&r2=24493&view=diff
==============================================================================
--- trunk/reactos/dll/win32/setupapi/install.c (original)
+++ trunk/reactos/dll/win32/setupapi/install.c Thu Oct 12 13:01:16 2006
@@ -89,6 +89,7 @@
 static const WCHAR ProfileItems[]    = {'P','r','o','f','i','l','e','I','t','e','m','s',0};
 static const WCHAR Include[]         = {'I','n','c','l','u','d','e',0};
 static const WCHAR Needs[]           = {'N','e','e','d','s',0};
+static const WCHAR DotSecurity[]     = {'.','S','e','c','u','r','i','t','y',0};
 
 
 /***********************************************************************
@@ -386,12 +387,49 @@
 static BOOL registry_callback( HINF hinf, PCWSTR field, void *arg )
 {
     struct registry_callback_info *info = arg;
-    INFCONTEXT context;
+    LPWSTR security_key, security_descriptor;
+    INFCONTEXT context, security_context;
+    PSECURITY_DESCRIPTOR sd = NULL;
+    SECURITY_ATTRIBUTES security_attributes = { 0, };
     HKEY root_key, hkey;
+    DWORD required;
 
     BOOL ok = SetupFindFirstLineW( hinf, field, NULL, &context );
-
-    for (; ok; ok = SetupFindNextLine( &context, &context ))
+    if (!ok)
+        return TRUE;
+
+    /* Check for .Security section */
+    security_key = MyMalloc( (strlenW( field ) + strlenW( DotSecurity )) * sizeof(WCHAR) + sizeof(UNICODE_NULL) );
+    if (!security_key)
+    {
+        SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+        return FALSE;
+    }
+    strcpyW( security_key, field );
+    strcatW( security_key, DotSecurity );
+    ok = SetupFindFirstLineW( hinf, security_key, NULL, &security_context );
+    MyFree(security_key);
+    if (ok)
+    {
+        if (!SetupGetLineText( &security_context, NULL, NULL, NULL, NULL, 0, &required ))
+            return FALSE;
+        security_descriptor = MyMalloc( required * sizeof(WCHAR) );
+        if (!security_descriptor)
+        {
+            SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+            return FALSE;
+        }
+        if (!SetupGetLineText( &security_context, NULL, NULL, NULL, security_descriptor, required, NULL ))
+            return FALSE;
+        ok = ConvertStringSecurityDescriptorToSecurityDescriptorW( security_descriptor, SDDL_REVISION_1, &sd, NULL );
+        MyFree( security_descriptor );
+        if (!ok)
+            return FALSE;
+        security_attributes.nLength = sizeof(SECURITY_ATTRIBUTES);
+        security_attributes.lpSecurityDescriptor = sd;
+    }
+
+    for (ok = TRUE; ok; ok = SetupFindNextLine( &context, &context ))
     {
         WCHAR buffer[MAX_INF_STRING_LENGTH];
         INT flags;
@@ -423,7 +461,8 @@
         {
             if (RegOpenKeyW( root_key, buffer, &hkey )) continue;  /* ignore if it doesn't exist */
         }
-        else if (RegCreateKeyW( root_key, buffer, &hkey ))
+        else if (RegCreateKeyExW( root_key, buffer, 0, NULL, 0, MAXIMUM_ALLOWED,
+            sd ? &security_attributes : NULL, &hkey, NULL ))
         {
             ERR( "could not create key %p %s\n", root_key, debugstr_w(buffer) );
             continue;
@@ -438,10 +477,12 @@
         if (!do_reg_operation( hkey, buffer, &context, flags ))
         {
             if (hkey != root_key) RegCloseKey( hkey );
+            if (sd) LocalFree( sd );
             return FALSE;
         }
         if (hkey != root_key) RegCloseKey( hkey );
     }
+    if (sd) LocalFree( sd );
     return TRUE;
 }
 
@@ -1274,6 +1315,8 @@
     LPWSTR DisplayName = NULL;
     LPWSTR Description = NULL;
     LPWSTR Dependencies = NULL;
+    LPWSTR SecurityDescriptor = NULL;
+    PSECURITY_DESCRIPTOR sd = NULL;
     INT ServiceType, StartType, ErrorControl;
     DWORD dwRegType;
     DWORD tagId = (DWORD)-1;
@@ -1304,7 +1347,7 @@
     hService = OpenServiceW(
         hSCManager,
         ServiceName,
-        GENERIC_READ | GENERIC_WRITE);
+        DELETE | SERVICE_QUERY_CONFIG | SERVICE_CHANGE_CONFIG | WRITE_DAC);
     if (hService == NULL && GetLastError() != ERROR_SERVICE_DOES_NOT_EXIST)
         goto cleanup;
 
@@ -1322,7 +1365,7 @@
             hSCManager,
             ServiceName,
             DisplayName,
-            0,
+            WRITE_DAC,
             ServiceType,
             StartType,
             ErrorControl,
@@ -1365,6 +1408,17 @@
             (ServiceFlags & SPSVCINST_NOCLOBBER_DEPENDENCIES && ServiceConfig->lpDependencies) ? NULL : Dependencies,
             NULL, NULL,
             (ServiceFlags & SPSVCINST_NOCLOBBER_DISPLAYNAME && ServiceConfig->lpDisplayName) ? NULL : DisplayName);
+        if (!ret)
+            goto cleanup;
+    }
+
+    /* Set security */
+    if (GetLineText(hInf, ServiceSection, L"Security", &SecurityDescriptor))
+    {
+        ret = ConvertStringSecurityDescriptorToSecurityDescriptorW(SecurityDescriptor, SDDL_REVISION_1, &sd, NULL);
+        if (!ret)
+            goto cleanup;
+        ret = SetServiceObjectSecurity(hService, DACL_SECURITY_INFORMATION, sd);
         if (!ret)
             goto cleanup;
     }
@@ -1462,12 +1516,15 @@
         CloseServiceHandle(hService);
     if (hGroupOrderListKey != NULL)
         RegCloseKey(hGroupOrderListKey);
+    if (sd != NULL)
+        LocalFree(sd);
     MyFree(ServiceConfig);
     MyFree(ServiceBinary);
     MyFree(LoadOrderGroup);
     MyFree(DisplayName);
     MyFree(Description);
     MyFree(Dependencies);
+    MyFree(SecurityDescriptor);
     MyFree(GroupOrder);
 
     TRACE("Returning %d\n", ret);

Modified: trunk/reactos/dll/win32/setupapi/queue.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/setupapi/queue.c?rev=24493&r1=24492&r2=24493&view=diff
==============================================================================
--- trunk/reactos/dll/win32/setupapi/queue.c (original)
+++ trunk/reactos/dll/win32/setupapi/queue.c Thu Oct 12 13:01:16 2006
@@ -22,6 +22,9 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(setupapi);
 
+/* Unicode constants */
+static const WCHAR DotSecurity[]     = {'.','S','e','c','u','r','i','t','y',0};
+
 /* context structure for the default queue callback */
 struct default_callback_context
 {
@@ -313,6 +316,7 @@
     }
     if (!op->src_path && !(op->style & SP_COPY_SOURCE_ABSOLUTE))
     {
+        len = len2 = 0;
         if (!(op->style & SP_COPY_SOURCEPATH_ABSOLUTE))
         {
             /* retrieve relative path for this disk */
@@ -331,7 +335,7 @@
                 ptr = op->src_path + strlenW(op->src_path);
                 if (len2 && ptr > op->src_path && ptr[-1] != '\\') *ptr++ = '\\';
             }
-            if (!SetupGetStringFieldW( &disk_ctx, 4, ptr, len2, NULL )) *ptr = 0;
+            if (!SetupGetStringFieldW( &file_ctx, 2, ptr, len2, NULL )) *ptr = 0;
         }
     }
     if (!op->src_root) op->src_root = PARSER_get_src_root(hinf);
@@ -486,6 +490,8 @@
     op->src_tag    = strdupW( params->SourceTagfile );
     op->dst_path   = strdupW( params->TargetDirectory );
     op->dst_file   = strdupW( params->TargetFilename );
+    if (params->SecurityDescriptor)
+        FIXME( "Need to apply %s to %s\n", debugstr_w( params->SecurityDescriptor ), debugstr_w( op->dst_file ));
 
     /* some defaults */
     if (!op->src_file) op->src_file = op->dst_file;
@@ -731,12 +737,43 @@
                                     PCWSTR section, DWORD style )
 {
     SP_FILE_COPY_PARAMS_W params;
-    INFCONTEXT context;
+    LPWSTR security_key, security_descriptor = NULL;
+    INFCONTEXT context, security_context;
     WCHAR dest[MAX_PATH], src[MAX_PATH];
     INT flags;
+    DWORD required;
+    BOOL ret;
 
     TRACE( "hinf=%p/%p section=%s root=%s\n",
            hinf, hlist, debugstr_w(section), debugstr_w(src_root) );
+
+    /* Check for .Security section */
+    security_key = MyMalloc( (strlenW( section ) + strlenW( DotSecurity )) * sizeof(WCHAR) + sizeof(UNICODE_NULL) );
+    if (!security_key)
+    {
+        SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+        return FALSE;
+    }
+    strcpyW( security_key, section );
+    strcatW( security_key, DotSecurity );
+    ret = SetupFindFirstLineW( hinf, security_key, NULL, &security_context );
+    MyFree(security_key);
+    if (ret)
+    {
+        if (!SetupGetLineText( &security_context, NULL, NULL, NULL, NULL, 0, &required ))
+            return FALSE;
+        security_descriptor = MyMalloc( required * sizeof(WCHAR) );
+        if (!security_descriptor)
+        {
+            SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+            return FALSE;
+        }
+        if (!SetupGetLineText( &security_context, NULL, NULL, NULL, security_descriptor, required, NULL ))
+        {
+            MyFree( security_descriptor );
+            return FALSE;
+        }
+    }
 
     params.cbSize             = sizeof(params);
     params.QueueHandle        = queue;
@@ -747,23 +784,29 @@
     params.TargetFilename     = dest;
     params.CopyStyle          = style;
     params.LayoutInf          = hinf;
-    params.SecurityDescriptor = NULL;
-
+    params.SecurityDescriptor = security_descriptor;
+
+    ret = FALSE;
     if (!hlist) hlist = hinf;
     if (!hinf) hinf = hlist;
-    if (!SetupFindFirstLineW( hlist, section, NULL, &context )) return FALSE;
-    if (!(params.TargetDirectory = get_destination_dir( hinf, section ))) return FALSE;
+    if (!SetupFindFirstLineW( hlist, section, NULL, &context )) goto done;
+    if (!(params.TargetDirectory = get_destination_dir( hinf, section ))) goto done;
     do
     {
         if (!SetupGetStringFieldW( &context, 1, dest, sizeof(dest)/sizeof(WCHAR), NULL ))
-            return FALSE;
+            goto done;
         if (!SetupGetStringFieldW( &context, 2, src, sizeof(src)/sizeof(WCHAR), NULL )) *src = 0;
         if (!SetupGetIntField( &context, 4, &flags )) flags = 0;  /* FIXME */
 
         params.SourceFilename = *src ? src : NULL;
-        if (!SetupQueueCopyIndirectW( &params )) return FALSE;
+        if (!SetupQueueCopyIndirectW( &params )) goto done;
     } while (SetupFindNextLine( &context, &context ));
-    return TRUE;
+    ret = TRUE;
+
+done:
+    if (security_descriptor)
+        MyFree( security_descriptor );
+    return ret;
 }
 
 

Modified: trunk/reactos/dll/win32/setupapi/setupapi_private.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/setupapi/setupapi_private.h?rev=24493&r1=24492&r2=24493&view=diff
==============================================================================
--- trunk/reactos/dll/win32/setupapi/setupapi_private.h (original)
+++ trunk/reactos/dll/win32/setupapi/setupapi_private.h Thu Oct 12 13:01:16 2006
@@ -32,6 +32,7 @@
 #include <cfgmgr32.h>
 #include <fdi.h>
 #include <regstr.h>
+#include <sddl.h>
 #include <setupapi.h>
 #include <shlobj.h>
 #include <wine/debug.h>




More information about the Ros-diffs mailing list