- Add Wine's GetPrivateObjectSecurity and use it instead of our that uses the unimple...
authorStefan Ginsberg <stefanginsberg@gmail.com>
Fri, 2 Jan 2009 17:14:42 +0000 (17:14 +0000)
committerStefan Ginsberg <stefanginsberg@gmail.com>
Fri, 2 Jan 2009 17:14:42 +0000 (17:14 +0000)
svn path=/trunk/; revision=38508

reactos/dll/win32/advapi32/sec/misc.c

index 9781b2a..11a2b67 100644 (file)
@@ -2250,19 +2250,25 @@ DestroyPrivateObjectSecurity(PSECURITY_DESCRIPTOR *ObjectDescriptor)
 }
 
 
+#if 0
+//
+// Use when RtlQuerySecurityObject is implemented
+//
+
 /*
  * @implemented
  */
 BOOL
 WINAPI
-GetPrivateObjectSecurity(PSECURITY_DESCRIPTOR ObjectDescriptor,
-                         SECURITY_INFORMATION SecurityInformation,
-                         PSECURITY_DESCRIPTOR ResultantDescriptor,
-                         DWORD DescriptorLength,
-                         PDWORD ReturnLength)
+GetPrivateObjectSecurity(IN PSECURITY_DESCRIPTOR ObjectDescriptor,
+                         IN SECURITY_INFORMATION SecurityInformation,
+                         OUT PSECURITY_DESCRIPTOR ResultantDescriptor OPTIONAL,
+                         IN DWORD DescriptorLength,
+                         OUT PDWORD ReturnLength)
 {
     NTSTATUS Status;
 
+    /* Call RTL */
     Status = RtlQuerySecurityObject(ObjectDescriptor,
                                     SecurityInformation,
                                     ResultantDescriptor,
@@ -2270,12 +2276,73 @@ GetPrivateObjectSecurity(PSECURITY_DESCRIPTOR ObjectDescriptor,
                                     ReturnLength);
     if (!NT_SUCCESS(Status))
     {
+        /* Fail */
         SetLastError(RtlNtStatusToDosError(Status));
         return FALSE;
     }
 
+    /* Success */
     return TRUE;
 }
+#else
+//
+// Wine's implementation (as of December 30th 2008)
+//
+
+/*
+ * @implemented
+ */
+BOOL
+WINAPI
+GetPrivateObjectSecurity(IN PSECURITY_DESCRIPTOR ObjectDescriptor,
+                         IN SECURITY_INFORMATION SecurityInformation,
+                         OUT PSECURITY_DESCRIPTOR ResultantDescriptor OPTIONAL,
+                         IN DWORD DescriptorLength,
+                         OUT PDWORD ReturnLength)
+{
+    SECURITY_DESCRIPTOR desc;
+    BOOL defaulted, present;
+    PACL pacl;
+    PSID psid;
+
+    TRACE("(%p,0x%08x,%p,0x%08x,%p)\n", ObjectDescriptor, SecurityInformation,
+          ResultantDescriptor, DescriptorLength, ReturnLength);
+
+    if (!InitializeSecurityDescriptor(&desc, SECURITY_DESCRIPTOR_REVISION))
+        return FALSE;
+
+    if (SecurityInformation & OWNER_SECURITY_INFORMATION)
+    {
+        if (!GetSecurityDescriptorOwner(ObjectDescriptor, &psid, &defaulted))
+            return FALSE;
+        SetSecurityDescriptorOwner(&desc, psid, defaulted);
+    }
+
+    if (SecurityInformation & GROUP_SECURITY_INFORMATION)
+    {
+        if (!GetSecurityDescriptorGroup(ObjectDescriptor, &psid, &defaulted))
+            return FALSE;
+        SetSecurityDescriptorGroup(&desc, psid, defaulted);
+    }
+
+    if (SecurityInformation & DACL_SECURITY_INFORMATION)
+    {
+        if (!GetSecurityDescriptorDacl(ObjectDescriptor, &present, &pacl, &defaulted))
+            return FALSE;
+        SetSecurityDescriptorDacl(&desc, present, pacl, defaulted);
+    }
+
+    if (SecurityInformation & SACL_SECURITY_INFORMATION)
+    {
+        if (!GetSecurityDescriptorSacl(ObjectDescriptor, &present, &pacl, &defaulted))
+            return FALSE;
+        SetSecurityDescriptorSacl(&desc, present, pacl, defaulted);
+    }
+
+    *ReturnLength = DescriptorLength;
+    return MakeSelfRelativeSD(&desc, ResultantDescriptor, ReturnLength);
+}
+#endif
 
 
 /*