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
/*