From f1546e5b224aba45425f3bf5e463761dc5498e84 Mon Sep 17 00:00:00 2001 From: Gregor Brunmar Date: Tue, 23 Oct 2007 21:42:03 +0000 Subject: [PATCH] Added RtlCopySecurityDescriptor svn path=/trunk/; revision=29837 --- reactos/dll/ntdll/def/ntdll.def | 2 +- reactos/include/ndk/rtlfuncs.h | 8 +++ reactos/lib/rtl/sd.c | 87 +++++++++++++++++++++++++++++++++ 3 files changed, 96 insertions(+), 1 deletion(-) diff --git a/reactos/dll/ntdll/def/ntdll.def b/reactos/dll/ntdll/def/ntdll.def index b565636186d..bbae1c3f4fa 100644 --- a/reactos/dll/ntdll/def/ntdll.def +++ b/reactos/dll/ntdll/def/ntdll.def @@ -361,7 +361,7 @@ RtlConvertUlongToLargeInteger@4 RtlCopyLuid@8 RtlCopyLuidAndAttributesArray@12 RtlCopyRangeList@8 -;RtlCopySecurityDescriptor +RtlCopySecurityDescriptor@8 RtlCopySid@12 RtlCopySidAndAttributesArray@28 RtlCopyString@8 diff --git a/reactos/include/ndk/rtlfuncs.h b/reactos/include/ndk/rtlfuncs.h index dedf53a24c9..65bb785ddda 100644 --- a/reactos/include/ndk/rtlfuncs.h +++ b/reactos/include/ndk/rtlfuncs.h @@ -908,6 +908,14 @@ RtlCreateSecurityDescriptorRelative( IN ULONG Revision ); +NTSYSAPI +NTSTATUS +NTAPI +RtlCopySecurityDescriptor( + IN PSECURITY_DESCRIPTOR pSourceSecurityDescriptor, + OUT PSECURITY_DESCRIPTOR pDestinationSecurityDescriptor +); + NTSYSAPI NTSTATUS NTAPI diff --git a/reactos/lib/rtl/sd.c b/reactos/lib/rtl/sd.c index 565c1d043a0..664e03e2ee2 100644 --- a/reactos/lib/rtl/sd.c +++ b/reactos/lib/rtl/sd.c @@ -131,6 +131,93 @@ RtlCreateSecurityDescriptor(OUT PSECURITY_DESCRIPTOR SecurityDescriptor, return STATUS_SUCCESS; } +/* + * @implemented + */ +NTSTATUS NTAPI +RtlCopySecurityDescriptor(IN PSECURITY_DESCRIPTOR pSourceSecurityDescriptor, + OUT PSECURITY_DESCRIPTOR pDestinationSecurityDescriptor) +{ + PSID Owner, Group; + PACL Dacl, Sacl; + BOOLEAN Defaulted, Present; + DWORD OwnerLength, GroupLength; + PSECURITY_DESCRIPTOR srcSD = pSourceSecurityDescriptor; + PSECURITY_DESCRIPTOR destSD = pDestinationSecurityDescriptor; + + if (srcSD->Revision != SECURITY_DESCRIPTOR_REVISION) + return STATUS_UNKNOWN_REVISION; + + /* Copy non relative dependent data */ + destSD->Revision = srcSD->Revision; + destSD->Sbz1 = srcSD->Sbz1; + destSD->Control = srcSD->Control; + + /* Read relative data */ + RtlGetOwnerSecurityDescriptor(srcSD, &Owner, &Defaulted); + OwnerLength = RtlLengthSid(Owner); + RtlGetGroupSecurityDescriptor(srcSD, &Group, &Defaulted); + GroupLength = RtlLengthSid(Group); + RtlGetDaclSecurityDescriptor(srcSD, &Present, &Dacl, &Defaulted); + RtlGetSaclSecurityDescriptor(srcSD, &Present, &Sacl, &Defaulted); + + if (srcSD->Control & SE_SELF_RELATIVE) + { + destSD->Owner = srcSD->Owner; + RtlCopySid(OwnerLength, (LPBYTE)destSD + (DWORD_PTR)destSD->Owner, Owner); + + destSD->Group = srcSD->Group; + RtlCopySid(GroupLength, (LPBYTE)destSD + (DWORD_PTR)destSD->Group, Group); + + if (srcSD->Control & SE_DACL_PRESENT) + { + destSD->Dacl = srcSD->Dacl; + + if(srcSD->Dacl != NULL && RtlValidAcl(srcSD->Dacl)) + { + RtlCopyMemory(((LPBYTE)destSD + (DWORD_PTR)destSD->Dacl), Dacl, Dacl->AclSize); + } + } + + if (srcSD->Control & SE_SACL_PRESENT) + { + destSD->Sacl = srcSD->Sacl; + + if(srcSD->Sacl != NULL && RtlValidAcl(srcSD->Sacl)) + { + RtlCopyMemory(((LPBYTE)destSD + (DWORD_PTR)destSD->Sacl), Sacl, Sacl->AclSize); + } + } + } + else + { + RtlCopySid(OwnerLength, destSD->Owner, Owner); + RtlCopySid(GroupLength, destSD->Group, Group); + + if (srcSD->Control & SE_DACL_PRESENT) + { + destSD->Dacl = RtlAllocateHeap(RtlGetProcessHeap(), 0, Dacl->AclSize); + + if(srcSD->Dacl != NULL && RtlValidAcl(srcSD->Dacl)) + { + RtlCopyMemory(destSD->Dacl, Dacl, Dacl->AclSize); + } + } + + if (srcSD->Control & SE_SACL_PRESENT) + { + destSD->Sacl = RtlAllocateHeap(RtlGetProcessHeap(), 0, Sacl->AclSize); + + if(srcSD->Sacl != NULL && RtlValidAcl(srcSD->Sacl)) + { + RtlCopyMemory(destSD->Sacl, Sacl, Sacl->AclSize); + } + } + } + + return STATUS_SUCCESS; +} + NTSTATUS NTAPI RtlCreateSecurityDescriptorRelative (OUT PISECURITY_DESCRIPTOR_RELATIVE SecurityDescriptor,