Please don't do this -- now nobody will know that the Rtl function
needs to be called!
On 2-Jan-09, at 12:14 PM, sginsberg(a)svn.reactos.org wrote:
  Author: sginsberg
 Date: Fri Jan  2 11:14:42 2009
 New Revision: 38508
 URL: 
http://svn.reactos.org/svn/reactos?rev=38508&view=rev
 Log:
 - Add Wine's GetPrivateObjectSecurity and use it instead of our that
 uses the unimplemented RtlQuerySecurityObject routine
 Modified:
    trunk/reactos/dll/win32/advapi32/sec/misc.c
 Modified: trunk/reactos/dll/win32/advapi32/sec/misc.c
 URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/advapi32/sec/mis…
 =
 =
 =
 =
 =
 =
 =
 =
 ======================================================================
 --- trunk/reactos/dll/win32/advapi32/sec/misc.c [iso-8859-1]
 (original)
 +++ trunk/reactos/dll/win32/advapi32/sec/misc.c [iso-8859-1] Fri
 Jan  2 11:14:42 2009
 @@ -2250,19 +2250,25 @@
 }
 +#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 @@
                                     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
 /*