Added RtlCopySecurityDescriptor

svn path=/trunk/; revision=29837
This commit is contained in:
Gregor Brunmar 2007-10-23 21:42:03 +00:00
parent d68e72bf84
commit f1546e5b22
3 changed files with 96 additions and 1 deletions

View file

@ -361,7 +361,7 @@ RtlConvertUlongToLargeInteger@4
RtlCopyLuid@8
RtlCopyLuidAndAttributesArray@12
RtlCopyRangeList@8
;RtlCopySecurityDescriptor
RtlCopySecurityDescriptor@8
RtlCopySid@12
RtlCopySidAndAttributesArray@28
RtlCopyString@8

View file

@ -908,6 +908,14 @@ RtlCreateSecurityDescriptorRelative(
IN ULONG Revision
);
NTSYSAPI
NTSTATUS
NTAPI
RtlCopySecurityDescriptor(
IN PSECURITY_DESCRIPTOR pSourceSecurityDescriptor,
OUT PSECURITY_DESCRIPTOR pDestinationSecurityDescriptor
);
NTSYSAPI
NTSTATUS
NTAPI

View file

@ -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,