diff --git a/reactos/dll/win32/advapi32/sec/misc.c b/reactos/dll/win32/advapi32/sec/misc.c index 9781b2a1976..11a2b679869 100644 --- a/reactos/dll/win32/advapi32/sec/misc.c +++ b/reactos/dll/win32/advapi32/sec/misc.c @@ -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 /*