Author: gbrunmar
Date: Wed Oct 24 01:42:03 2007
New Revision: 29837
URL:
http://svn.reactos.org/svn/reactos?rev=29837&view=rev
Log:
Added RtlCopySecurityDescriptor
Modified:
trunk/reactos/dll/ntdll/def/ntdll.def
trunk/reactos/include/ndk/rtlfuncs.h
trunk/reactos/lib/rtl/sd.c
Modified: trunk/reactos/dll/ntdll/def/ntdll.def
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/ntdll/def/ntdll.def?re…
==============================================================================
--- trunk/reactos/dll/ntdll/def/ntdll.def (original)
+++ trunk/reactos/dll/ntdll/def/ntdll.def Wed Oct 24 01:42:03 2007
@@ -361,7 +361,7 @@
RtlCopyLuid@8
RtlCopyLuidAndAttributesArray@12
RtlCopyRangeList@8
-;RtlCopySecurityDescriptor
+RtlCopySecurityDescriptor@8
RtlCopySid@12
RtlCopySidAndAttributesArray@28
RtlCopyString@8
Modified: trunk/reactos/include/ndk/rtlfuncs.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/include/ndk/rtlfuncs.h?rev…
==============================================================================
--- trunk/reactos/include/ndk/rtlfuncs.h (original)
+++ trunk/reactos/include/ndk/rtlfuncs.h Wed Oct 24 01:42:03 2007
@@ -911,6 +911,14 @@
NTSYSAPI
NTSTATUS
NTAPI
+RtlCopySecurityDescriptor(
+ IN PSECURITY_DESCRIPTOR pSourceSecurityDescriptor,
+ OUT PSECURITY_DESCRIPTOR pDestinationSecurityDescriptor
+);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
RtlDeleteAce(
PACL Acl,
ULONG AceIndex
Modified: trunk/reactos/lib/rtl/sd.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/rtl/sd.c?rev=29837&…
==============================================================================
--- trunk/reactos/lib/rtl/sd.c (original)
+++ trunk/reactos/lib/rtl/sd.c Wed Oct 24 01:42:03 2007
@@ -129,6 +129,93 @@
pSD->Dacl = NULL;
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;
}