2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: ntoskrnl/se/sd.c
5 * PURPOSE: Security manager
7 * PROGRAMMERS: David Welch <welch@cwcom.net>
10 /* INCLUDES *******************************************************************/
16 #if defined (ALLOC_PRAGMA)
17 #pragma alloc_text(INIT, SepInitSDs)
20 /* GLOBALS ********************************************************************/
22 PSECURITY_DESCRIPTOR SePublicDefaultSd
= NULL
;
23 PSECURITY_DESCRIPTOR SePublicDefaultUnrestrictedSd
= NULL
;
24 PSECURITY_DESCRIPTOR SePublicOpenSd
= NULL
;
25 PSECURITY_DESCRIPTOR SePublicOpenUnrestrictedSd
= NULL
;
26 PSECURITY_DESCRIPTOR SeSystemDefaultSd
= NULL
;
27 PSECURITY_DESCRIPTOR SeUnrestrictedSd
= NULL
;
29 /* PRIVATE FUNCTIONS **********************************************************/
36 /* Create PublicDefaultSd */
37 SePublicDefaultSd
= ExAllocatePoolWithTag(PagedPool
,
38 sizeof(SECURITY_DESCRIPTOR
), TAG_SD
);
39 if (SePublicDefaultSd
== NULL
)
42 RtlCreateSecurityDescriptor(SePublicDefaultSd
,
43 SECURITY_DESCRIPTOR_REVISION
);
44 RtlSetDaclSecurityDescriptor(SePublicDefaultSd
,
49 /* Create PublicDefaultUnrestrictedSd */
50 SePublicDefaultUnrestrictedSd
= ExAllocatePoolWithTag(PagedPool
,
51 sizeof(SECURITY_DESCRIPTOR
), TAG_SD
);
52 if (SePublicDefaultUnrestrictedSd
== NULL
)
55 RtlCreateSecurityDescriptor(SePublicDefaultUnrestrictedSd
,
56 SECURITY_DESCRIPTOR_REVISION
);
57 RtlSetDaclSecurityDescriptor(SePublicDefaultUnrestrictedSd
,
59 SePublicDefaultUnrestrictedDacl
,
62 /* Create PublicOpenSd */
63 SePublicOpenSd
= ExAllocatePoolWithTag(PagedPool
,
64 sizeof(SECURITY_DESCRIPTOR
), TAG_SD
);
65 if (SePublicOpenSd
== NULL
)
68 RtlCreateSecurityDescriptor(SePublicOpenSd
,
69 SECURITY_DESCRIPTOR_REVISION
);
70 RtlSetDaclSecurityDescriptor(SePublicOpenSd
,
75 /* Create PublicOpenUnrestrictedSd */
76 SePublicOpenUnrestrictedSd
= ExAllocatePoolWithTag(PagedPool
,
77 sizeof(SECURITY_DESCRIPTOR
), TAG_SD
);
78 if (SePublicOpenUnrestrictedSd
== NULL
)
81 RtlCreateSecurityDescriptor(SePublicOpenUnrestrictedSd
,
82 SECURITY_DESCRIPTOR_REVISION
);
83 RtlSetDaclSecurityDescriptor(SePublicOpenUnrestrictedSd
,
85 SePublicOpenUnrestrictedDacl
,
88 /* Create SystemDefaultSd */
89 SeSystemDefaultSd
= ExAllocatePoolWithTag(PagedPool
,
90 sizeof(SECURITY_DESCRIPTOR
), TAG_SD
);
91 if (SeSystemDefaultSd
== NULL
)
94 RtlCreateSecurityDescriptor(SeSystemDefaultSd
,
95 SECURITY_DESCRIPTOR_REVISION
);
96 RtlSetDaclSecurityDescriptor(SeSystemDefaultSd
,
101 /* Create UnrestrictedSd */
102 SeUnrestrictedSd
= ExAllocatePoolWithTag(PagedPool
,
103 sizeof(SECURITY_DESCRIPTOR
), TAG_SD
);
104 if (SeUnrestrictedSd
== NULL
)
107 RtlCreateSecurityDescriptor(SeUnrestrictedSd
,
108 SECURITY_DESCRIPTOR_REVISION
);
109 RtlSetDaclSecurityDescriptor(SeUnrestrictedSd
,
119 SeSetWorldSecurityDescriptor(SECURITY_INFORMATION SecurityInformation
,
120 PISECURITY_DESCRIPTOR SecurityDescriptor
,
127 PISECURITY_DESCRIPTOR_RELATIVE SdRel
= (PISECURITY_DESCRIPTOR_RELATIVE
)SecurityDescriptor
;
129 DPRINT("SeSetWorldSecurityDescriptor() called\n");
131 if (SecurityInformation
== 0)
133 return STATUS_ACCESS_DENIED
;
136 /* calculate the minimum size of the buffer */
137 SidSize
= RtlLengthSid(SeWorldSid
);
138 SdSize
= sizeof(SECURITY_DESCRIPTOR_RELATIVE
);
139 if (SecurityInformation
& OWNER_SECURITY_INFORMATION
)
141 if (SecurityInformation
& GROUP_SECURITY_INFORMATION
)
143 if (SecurityInformation
& DACL_SECURITY_INFORMATION
)
145 SdSize
+= sizeof(ACL
) + sizeof(ACE
) + SidSize
;
148 if (*BufferLength
< SdSize
)
150 *BufferLength
= SdSize
;
151 return STATUS_BUFFER_TOO_SMALL
;
154 *BufferLength
= SdSize
;
156 Status
= RtlCreateSecurityDescriptorRelative(SdRel
,
157 SECURITY_DESCRIPTOR_REVISION
);
158 if (!NT_SUCCESS(Status
))
163 Current
= (ULONG_PTR
)(SdRel
+ 1);
165 if (SecurityInformation
& OWNER_SECURITY_INFORMATION
)
167 RtlCopyMemory((PVOID
)Current
,
170 SdRel
->Owner
= (ULONG
)((ULONG_PTR
)Current
- (ULONG_PTR
)SdRel
);
174 if (SecurityInformation
& GROUP_SECURITY_INFORMATION
)
176 RtlCopyMemory((PVOID
)Current
,
179 SdRel
->Group
= (ULONG
)((ULONG_PTR
)Current
- (ULONG_PTR
)SdRel
);
183 if (SecurityInformation
& DACL_SECURITY_INFORMATION
)
185 PACL Dacl
= (PACL
)Current
;
186 SdRel
->Control
|= SE_DACL_PRESENT
;
188 Status
= RtlCreateAcl(Dacl
,
189 sizeof(ACL
) + sizeof(ACE
) + SidSize
,
191 if (!NT_SUCCESS(Status
))
194 Status
= RtlAddAccessAllowedAce(Dacl
,
198 if (!NT_SUCCESS(Status
))
201 SdRel
->Dacl
= (ULONG
)((ULONG_PTR
)Current
- (ULONG_PTR
)SdRel
);
204 if (SecurityInformation
& SACL_SECURITY_INFORMATION
)
206 /* FIXME - SdRel->Control |= SE_SACL_PRESENT; */
209 return STATUS_SUCCESS
;
215 SepCaptureSecurityQualityOfService(IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
216 IN KPROCESSOR_MODE AccessMode
,
217 IN POOL_TYPE PoolType
,
218 IN BOOLEAN CaptureIfKernel
,
219 OUT PSECURITY_QUALITY_OF_SERVICE
*CapturedSecurityQualityOfService
,
220 OUT PBOOLEAN Present
)
222 PSECURITY_QUALITY_OF_SERVICE CapturedQos
;
223 NTSTATUS Status
= STATUS_SUCCESS
;
227 ASSERT(CapturedSecurityQualityOfService
);
230 if(ObjectAttributes
!= NULL
)
232 if(AccessMode
!= KernelMode
)
234 SECURITY_QUALITY_OF_SERVICE SafeQos
;
238 ProbeForRead(ObjectAttributes
,
239 sizeof(OBJECT_ATTRIBUTES
),
241 if(ObjectAttributes
->Length
== sizeof(OBJECT_ATTRIBUTES
))
243 if(ObjectAttributes
->SecurityQualityOfService
!= NULL
)
245 ProbeForRead(ObjectAttributes
->SecurityQualityOfService
,
246 sizeof(SECURITY_QUALITY_OF_SERVICE
),
249 if(((PSECURITY_QUALITY_OF_SERVICE
)ObjectAttributes
->SecurityQualityOfService
)->Length
==
250 sizeof(SECURITY_QUALITY_OF_SERVICE
))
252 /* don't allocate memory here because ExAllocate should bugcheck
253 the system if it's buggy, SEH would catch that! So make a local
254 copy of the qos structure.*/
255 RtlCopyMemory(&SafeQos
,
256 ObjectAttributes
->SecurityQualityOfService
,
257 sizeof(SECURITY_QUALITY_OF_SERVICE
));
262 Status
= STATUS_INVALID_PARAMETER
;
267 *CapturedSecurityQualityOfService
= NULL
;
273 Status
= STATUS_INVALID_PARAMETER
;
276 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
278 Status
= _SEH2_GetExceptionCode();
282 if(NT_SUCCESS(Status
))
286 CapturedQos
= ExAllocatePool(PoolType
,
287 sizeof(SECURITY_QUALITY_OF_SERVICE
));
288 if(CapturedQos
!= NULL
)
290 RtlCopyMemory(CapturedQos
,
292 sizeof(SECURITY_QUALITY_OF_SERVICE
));
293 *CapturedSecurityQualityOfService
= CapturedQos
;
297 Status
= STATUS_INSUFFICIENT_RESOURCES
;
302 *CapturedSecurityQualityOfService
= NULL
;
308 if(ObjectAttributes
->Length
== sizeof(OBJECT_ATTRIBUTES
))
312 if(ObjectAttributes
->SecurityQualityOfService
!= NULL
)
314 if(((PSECURITY_QUALITY_OF_SERVICE
)ObjectAttributes
->SecurityQualityOfService
)->Length
==
315 sizeof(SECURITY_QUALITY_OF_SERVICE
))
317 CapturedQos
= ExAllocatePool(PoolType
,
318 sizeof(SECURITY_QUALITY_OF_SERVICE
));
319 if(CapturedQos
!= NULL
)
321 RtlCopyMemory(CapturedQos
,
322 ObjectAttributes
->SecurityQualityOfService
,
323 sizeof(SECURITY_QUALITY_OF_SERVICE
));
324 *CapturedSecurityQualityOfService
= CapturedQos
;
329 Status
= STATUS_INSUFFICIENT_RESOURCES
;
334 Status
= STATUS_INVALID_PARAMETER
;
339 *CapturedSecurityQualityOfService
= NULL
;
345 *CapturedSecurityQualityOfService
= (PSECURITY_QUALITY_OF_SERVICE
)ObjectAttributes
->SecurityQualityOfService
;
346 *Present
= (ObjectAttributes
->SecurityQualityOfService
!= NULL
);
351 Status
= STATUS_INVALID_PARAMETER
;
357 *CapturedSecurityQualityOfService
= NULL
;
367 SepReleaseSecurityQualityOfService(IN PSECURITY_QUALITY_OF_SERVICE CapturedSecurityQualityOfService OPTIONAL
,
368 IN KPROCESSOR_MODE AccessMode
,
369 IN BOOLEAN CaptureIfKernel
)
373 if(CapturedSecurityQualityOfService
!= NULL
&&
374 (AccessMode
!= KernelMode
|| CaptureIfKernel
))
376 ExFreePool(CapturedSecurityQualityOfService
);
380 /* PUBLIC FUNCTIONS ***********************************************************/
387 SeCaptureSecurityDescriptor(IN PSECURITY_DESCRIPTOR _OriginalSecurityDescriptor
,
388 IN KPROCESSOR_MODE CurrentMode
,
389 IN POOL_TYPE PoolType
,
390 IN BOOLEAN CaptureIfKernel
,
391 OUT PSECURITY_DESCRIPTOR
*CapturedSecurityDescriptor
)
393 PISECURITY_DESCRIPTOR OriginalSecurityDescriptor
= _OriginalSecurityDescriptor
;
394 SECURITY_DESCRIPTOR DescriptorCopy
;
395 PISECURITY_DESCRIPTOR NewDescriptor
;
396 ULONG OwnerSAC
= 0, GroupSAC
= 0;
397 ULONG OwnerSize
= 0, GroupSize
= 0;
398 ULONG SaclSize
= 0, DaclSize
= 0;
399 ULONG DescriptorSize
= 0;
402 if(OriginalSecurityDescriptor
!= NULL
)
404 if(CurrentMode
!= KernelMode
)
406 RtlZeroMemory(&DescriptorCopy
, sizeof(DescriptorCopy
));
410 /* first only probe and copy until the control field of the descriptor
411 to determine whether it's a self-relative descriptor */
412 DescriptorSize
= FIELD_OFFSET(SECURITY_DESCRIPTOR
,
414 ProbeForRead(OriginalSecurityDescriptor
,
418 if(OriginalSecurityDescriptor
->Revision
!= SECURITY_DESCRIPTOR_REVISION1
)
420 _SEH2_YIELD(return STATUS_UNKNOWN_REVISION
);
423 /* make a copy on the stack */
424 DescriptorCopy
.Revision
= OriginalSecurityDescriptor
->Revision
;
425 DescriptorCopy
.Sbz1
= OriginalSecurityDescriptor
->Sbz1
;
426 DescriptorCopy
.Control
= OriginalSecurityDescriptor
->Control
;
427 DescriptorSize
= ((DescriptorCopy
.Control
& SE_SELF_RELATIVE
) ?
428 sizeof(SECURITY_DESCRIPTOR_RELATIVE
) : sizeof(SECURITY_DESCRIPTOR
));
430 /* probe and copy the entire security descriptor structure. The SIDs
431 and ACLs will be probed and copied later though */
432 ProbeForRead(OriginalSecurityDescriptor
,
435 if(DescriptorCopy
.Control
& SE_SELF_RELATIVE
)
437 PISECURITY_DESCRIPTOR_RELATIVE RelSD
= (PISECURITY_DESCRIPTOR_RELATIVE
)OriginalSecurityDescriptor
;
439 DescriptorCopy
.Owner
= (PSID
)((PCHAR
)RelSD
+ RelSD
->Owner
);
440 DescriptorCopy
.Group
= (PSID
)((PCHAR
)RelSD
+ RelSD
->Group
);
441 DescriptorCopy
.Sacl
= (PACL
)((PCHAR
)RelSD
+ RelSD
->Sacl
);
442 DescriptorCopy
.Dacl
= (PACL
)((PCHAR
)RelSD
+ RelSD
->Dacl
);
446 DescriptorCopy
.Owner
= OriginalSecurityDescriptor
->Owner
;
447 DescriptorCopy
.Group
= OriginalSecurityDescriptor
->Group
;
448 DescriptorCopy
.Sacl
= OriginalSecurityDescriptor
->Sacl
;
449 DescriptorCopy
.Dacl
= OriginalSecurityDescriptor
->Dacl
;
452 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
454 /* Return the exception code */
455 _SEH2_YIELD(return _SEH2_GetExceptionCode());
459 else if(!CaptureIfKernel
)
461 if(OriginalSecurityDescriptor
->Revision
!= SECURITY_DESCRIPTOR_REVISION1
)
463 return STATUS_UNKNOWN_REVISION
;
466 *CapturedSecurityDescriptor
= OriginalSecurityDescriptor
;
467 return STATUS_SUCCESS
;
471 if(OriginalSecurityDescriptor
->Revision
!= SECURITY_DESCRIPTOR_REVISION1
)
473 return STATUS_UNKNOWN_REVISION
;
476 /* make a copy on the stack */
477 DescriptorCopy
.Revision
= OriginalSecurityDescriptor
->Revision
;
478 DescriptorCopy
.Sbz1
= OriginalSecurityDescriptor
->Sbz1
;
479 DescriptorCopy
.Control
= OriginalSecurityDescriptor
->Control
;
480 DescriptorSize
= ((DescriptorCopy
.Control
& SE_SELF_RELATIVE
) ?
481 sizeof(SECURITY_DESCRIPTOR_RELATIVE
) : sizeof(SECURITY_DESCRIPTOR
));
482 if(DescriptorCopy
.Control
& SE_SELF_RELATIVE
)
484 PISECURITY_DESCRIPTOR_RELATIVE RelSD
= (PISECURITY_DESCRIPTOR_RELATIVE
)OriginalSecurityDescriptor
;
486 DescriptorCopy
.Owner
= (PSID
)((PCHAR
)RelSD
+ RelSD
->Owner
);
487 DescriptorCopy
.Group
= (PSID
)((PCHAR
)RelSD
+ RelSD
->Group
);
488 DescriptorCopy
.Sacl
= (PACL
)((PCHAR
)RelSD
+ RelSD
->Sacl
);
489 DescriptorCopy
.Dacl
= (PACL
)((PCHAR
)RelSD
+ RelSD
->Dacl
);
493 DescriptorCopy
.Owner
= OriginalSecurityDescriptor
->Owner
;
494 DescriptorCopy
.Group
= OriginalSecurityDescriptor
->Group
;
495 DescriptorCopy
.Sacl
= OriginalSecurityDescriptor
->Sacl
;
496 DescriptorCopy
.Dacl
= OriginalSecurityDescriptor
->Dacl
;
500 /* determine the size of the SIDs */
501 #define DetermineSIDSize(SidType) \
503 if(DescriptorCopy.SidType != NULL) \
505 SID *SidType = (SID*)DescriptorCopy.SidType; \
507 if(CurrentMode != KernelMode) \
509 /* securely access the buffers! */ \
512 SidType##SAC = ProbeForReadUchar(&SidType->SubAuthorityCount); \
513 SidType##Size = RtlLengthRequiredSid(SidType##SAC); \
514 DescriptorSize += ROUND_UP(SidType##Size, sizeof(ULONG)); \
515 ProbeForRead(SidType, \
519 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) \
521 _SEH2_YIELD(return _SEH2_GetExceptionCode()); \
528 SidType##SAC = SidType->SubAuthorityCount; \
529 SidType##Size = RtlLengthRequiredSid(SidType##SAC); \
530 DescriptorSize += ROUND_UP(SidType##Size, sizeof(ULONG)); \
535 DetermineSIDSize(Owner
);
536 DetermineSIDSize(Group
);
538 #undef DetermineSIDSize
540 /* determine the size of the ACLs */
541 #define DetermineACLSize(AclType, AclFlag) \
543 if((DescriptorCopy.Control & SE_##AclFlag##_PRESENT) && \
544 DescriptorCopy.AclType != NULL) \
546 PACL AclType = (PACL)DescriptorCopy.AclType; \
548 if(CurrentMode != KernelMode) \
550 /* securely access the buffers! */ \
553 AclType##Size = ProbeForReadUshort(&AclType->AclSize); \
554 DescriptorSize += ROUND_UP(AclType##Size, sizeof(ULONG)); \
555 ProbeForRead(AclType, \
559 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) \
561 _SEH2_YIELD(return _SEH2_GetExceptionCode()); \
568 AclType##Size = AclType->AclSize; \
569 DescriptorSize += ROUND_UP(AclType##Size, sizeof(ULONG)); \
574 DescriptorCopy.AclType = NULL; \
578 DetermineACLSize(Sacl
, SACL
);
579 DetermineACLSize(Dacl
, DACL
);
581 #undef DetermineACLSize
583 /* allocate enough memory to store a complete copy of a self-relative
584 security descriptor */
585 NewDescriptor
= ExAllocatePoolWithTag(PoolType
,
588 if(NewDescriptor
!= NULL
)
590 ULONG_PTR Offset
= sizeof(SECURITY_DESCRIPTOR
);
592 RtlZeroMemory(NewDescriptor
, DescriptorSize
);
593 NewDescriptor
->Revision
= DescriptorCopy
.Revision
;
594 NewDescriptor
->Sbz1
= DescriptorCopy
.Sbz1
;
595 NewDescriptor
->Control
= DescriptorCopy
.Control
| SE_SELF_RELATIVE
;
599 /* setup the offsets and copy the SIDs and ACLs to the new
600 self-relative security descriptor. Probing the pointers is not
601 neccessary anymore as we did that when collecting the sizes!
602 Make sure to validate the SIDs and ACLs *again* as they could have
603 been modified in the meanwhile! */
604 #define CopySID(Type) \
606 if(DescriptorCopy.Type != NULL) \
608 NewDescriptor->Type = (PVOID)Offset; \
609 RtlCopyMemory((PVOID)((ULONG_PTR)NewDescriptor + \
610 (ULONG_PTR)NewDescriptor->Type), \
611 DescriptorCopy.Type, \
613 if (!RtlValidSid((PSID)((ULONG_PTR)NewDescriptor + \
614 (ULONG_PTR)NewDescriptor->Type))) \
616 RtlRaiseStatus(STATUS_INVALID_SID); \
618 Offset += ROUND_UP(Type##Size, sizeof(ULONG)); \
627 #define CopyACL(Type) \
629 if(DescriptorCopy.Type != NULL) \
631 NewDescriptor->Type = (PVOID)Offset; \
632 RtlCopyMemory((PVOID)((ULONG_PTR)NewDescriptor + \
633 (ULONG_PTR)NewDescriptor->Type), \
634 DescriptorCopy.Type, \
636 if (!RtlValidAcl((PACL)((ULONG_PTR)NewDescriptor + \
637 (ULONG_PTR)NewDescriptor->Type))) \
639 RtlRaiseStatus(STATUS_INVALID_ACL); \
641 Offset += ROUND_UP(Type##Size, sizeof(ULONG)); \
650 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
652 /* we failed to copy the data to the new descriptor */
653 ExFreePool(NewDescriptor
);
654 _SEH2_YIELD(return _SEH2_GetExceptionCode());
658 /* we're finally done! copy the pointer to the captured descriptor to
660 *CapturedSecurityDescriptor
= NewDescriptor
;
661 return STATUS_SUCCESS
;
666 Status
= STATUS_INSUFFICIENT_RESOURCES
;
671 /* nothing to do... */
672 *CapturedSecurityDescriptor
= NULL
;
682 SeQuerySecurityDescriptorInfo(IN PSECURITY_INFORMATION SecurityInformation
,
683 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor
,
684 IN OUT PULONG Length
,
685 IN PSECURITY_DESCRIPTOR
*ObjectsSecurityDescriptor OPTIONAL
)
687 PISECURITY_DESCRIPTOR ObjectSd
;
688 PISECURITY_DESCRIPTOR_RELATIVE RelSD
;
693 ULONG OwnerLength
= 0;
694 ULONG GroupLength
= 0;
695 ULONG DaclLength
= 0;
696 ULONG SaclLength
= 0;
701 RelSD
= (PISECURITY_DESCRIPTOR_RELATIVE
)SecurityDescriptor
;
703 if (*ObjectsSecurityDescriptor
== NULL
)
705 if (*Length
< sizeof(SECURITY_DESCRIPTOR_RELATIVE
))
707 *Length
= sizeof(SECURITY_DESCRIPTOR_RELATIVE
);
708 return STATUS_BUFFER_TOO_SMALL
;
711 *Length
= sizeof(SECURITY_DESCRIPTOR_RELATIVE
);
712 RtlCreateSecurityDescriptorRelative(RelSD
,
713 SECURITY_DESCRIPTOR_REVISION
);
714 return STATUS_SUCCESS
;
717 ObjectSd
= *ObjectsSecurityDescriptor
;
719 /* Calculate the required security descriptor length */
720 Control
= SE_SELF_RELATIVE
;
721 if ((*SecurityInformation
& OWNER_SECURITY_INFORMATION
) &&
722 (ObjectSd
->Owner
!= NULL
))
724 Owner
= (PSID
)((ULONG_PTR
)ObjectSd
->Owner
+ (ULONG_PTR
)ObjectSd
);
725 OwnerLength
= ROUND_UP(RtlLengthSid(Owner
), 4);
726 Control
|= (ObjectSd
->Control
& SE_OWNER_DEFAULTED
);
729 if ((*SecurityInformation
& GROUP_SECURITY_INFORMATION
) &&
730 (ObjectSd
->Group
!= NULL
))
732 Group
= (PSID
)((ULONG_PTR
)ObjectSd
->Group
+ (ULONG_PTR
)ObjectSd
);
733 GroupLength
= ROUND_UP(RtlLengthSid(Group
), 4);
734 Control
|= (ObjectSd
->Control
& SE_GROUP_DEFAULTED
);
737 if ((*SecurityInformation
& DACL_SECURITY_INFORMATION
) &&
738 (ObjectSd
->Control
& SE_DACL_PRESENT
))
740 if (ObjectSd
->Dacl
!= NULL
)
742 Dacl
= (PACL
)((ULONG_PTR
)ObjectSd
->Dacl
+ (ULONG_PTR
)ObjectSd
);
743 DaclLength
= ROUND_UP((ULONG
)Dacl
->AclSize
, 4);
745 Control
|= (ObjectSd
->Control
& (SE_DACL_DEFAULTED
| SE_DACL_PRESENT
));
748 if ((*SecurityInformation
& SACL_SECURITY_INFORMATION
) &&
749 (ObjectSd
->Control
& SE_SACL_PRESENT
))
751 if (ObjectSd
->Sacl
!= NULL
)
753 Sacl
= (PACL
)((ULONG_PTR
)ObjectSd
->Sacl
+ (ULONG_PTR
)ObjectSd
);
754 SaclLength
= ROUND_UP(Sacl
->AclSize
, 4);
756 Control
|= (ObjectSd
->Control
& (SE_SACL_DEFAULTED
| SE_SACL_PRESENT
));
759 SdLength
= OwnerLength
+ GroupLength
+ DaclLength
+
760 SaclLength
+ sizeof(SECURITY_DESCRIPTOR_RELATIVE
);
761 if (*Length
< SdLength
)
764 return STATUS_BUFFER_TOO_SMALL
;
767 /* Build the new security descrtiptor */
768 RtlCreateSecurityDescriptorRelative(RelSD
,
769 SECURITY_DESCRIPTOR_REVISION
);
770 RelSD
->Control
= (USHORT
)Control
;
772 Current
= (ULONG_PTR
)(RelSD
+ 1);
774 if (OwnerLength
!= 0)
776 RtlCopyMemory((PVOID
)Current
,
779 RelSD
->Owner
= (ULONG
)(Current
- (ULONG_PTR
)SecurityDescriptor
);
780 Current
+= OwnerLength
;
783 if (GroupLength
!= 0)
785 RtlCopyMemory((PVOID
)Current
,
788 RelSD
->Group
= (ULONG
)(Current
- (ULONG_PTR
)SecurityDescriptor
);
789 Current
+= GroupLength
;
794 RtlCopyMemory((PVOID
)Current
,
797 RelSD
->Dacl
= (ULONG
)(Current
- (ULONG_PTR
)SecurityDescriptor
);
798 Current
+= DaclLength
;
803 RtlCopyMemory((PVOID
)Current
,
806 RelSD
->Sacl
= (ULONG
)(Current
- (ULONG_PTR
)SecurityDescriptor
);
807 Current
+= SaclLength
;
812 return STATUS_SUCCESS
;
820 SeReleaseSecurityDescriptor(IN PSECURITY_DESCRIPTOR CapturedSecurityDescriptor
,
821 IN KPROCESSOR_MODE CurrentMode
,
822 IN BOOLEAN CaptureIfKernelMode
)
826 /* WARNING! You need to call this function with the same value for CurrentMode
827 and CaptureIfKernelMode that you previously passed to
828 SeCaptureSecurityDescriptor() in order to avoid memory leaks! */
829 if(CapturedSecurityDescriptor
!= NULL
&&
830 (CurrentMode
!= KernelMode
||
831 (CurrentMode
== KernelMode
&& CaptureIfKernelMode
)))
833 /* only delete the descriptor when SeCaptureSecurityDescriptor() allocated one! */
834 ExFreePoolWithTag(CapturedSecurityDescriptor
, TAG_SD
);
837 return STATUS_SUCCESS
;
844 SeSetSecurityDescriptorInfo(IN PVOID Object OPTIONAL
,
845 IN PSECURITY_INFORMATION _SecurityInformation
,
846 IN PSECURITY_DESCRIPTOR _SecurityDescriptor
,
847 IN OUT PSECURITY_DESCRIPTOR
*ObjectsSecurityDescriptor
,
848 IN POOL_TYPE PoolType
,
849 IN PGENERIC_MAPPING GenericMapping
)
851 PISECURITY_DESCRIPTOR ObjectSd
;
852 PISECURITY_DESCRIPTOR NewSd
;
853 PISECURITY_DESCRIPTOR SecurityDescriptor
= _SecurityDescriptor
;
858 ULONG OwnerLength
= 0;
859 ULONG GroupLength
= 0;
860 ULONG DaclLength
= 0;
861 ULONG SaclLength
= 0;
864 SECURITY_INFORMATION SecurityInformation
;
866 ObjectSd
= *ObjectsSecurityDescriptor
;
869 return STATUS_NO_SECURITY_ON_OBJECT
; // The object does not have a security descriptor.
871 SecurityInformation
= *_SecurityInformation
;
873 /* Get owner and owner size */
874 if (SecurityInformation
& OWNER_SECURITY_INFORMATION
)
876 if (SecurityDescriptor
->Owner
!= NULL
)
878 if( SecurityDescriptor
->Control
& SE_SELF_RELATIVE
)
879 Owner
= (PSID
)((ULONG_PTR
)SecurityDescriptor
->Owner
+
880 (ULONG_PTR
)SecurityDescriptor
);
882 Owner
= (PSID
)SecurityDescriptor
->Owner
;
883 OwnerLength
= ROUND_UP(RtlLengthSid(Owner
), 4);
885 Control
|= (SecurityDescriptor
->Control
& SE_OWNER_DEFAULTED
);
889 if (ObjectSd
->Owner
!= NULL
)
891 Owner
= (PSID
)((ULONG_PTR
)ObjectSd
->Owner
+ (ULONG_PTR
)ObjectSd
);
892 OwnerLength
= ROUND_UP(RtlLengthSid(Owner
), 4);
894 Control
|= (ObjectSd
->Control
& SE_OWNER_DEFAULTED
);
897 /* Get group and group size */
898 if (SecurityInformation
& GROUP_SECURITY_INFORMATION
)
900 if (SecurityDescriptor
->Group
!= NULL
)
902 if( SecurityDescriptor
->Control
& SE_SELF_RELATIVE
)
903 Group
= (PSID
)((ULONG_PTR
)SecurityDescriptor
->Group
+
904 (ULONG_PTR
)SecurityDescriptor
);
906 Group
= (PSID
)SecurityDescriptor
->Group
;
907 GroupLength
= ROUND_UP(RtlLengthSid(Group
), 4);
909 Control
|= (SecurityDescriptor
->Control
& SE_GROUP_DEFAULTED
);
913 if (ObjectSd
->Group
!= NULL
)
915 Group
= (PSID
)((ULONG_PTR
)ObjectSd
->Group
+ (ULONG_PTR
)ObjectSd
);
916 GroupLength
= ROUND_UP(RtlLengthSid(Group
), 4);
918 Control
|= (ObjectSd
->Control
& SE_GROUP_DEFAULTED
);
921 /* Get DACL and DACL size */
922 if (SecurityInformation
& DACL_SECURITY_INFORMATION
)
924 if ((SecurityDescriptor
->Control
& SE_DACL_PRESENT
) &&
925 (SecurityDescriptor
->Dacl
!= NULL
))
927 if( SecurityDescriptor
->Control
& SE_SELF_RELATIVE
)
928 Dacl
= (PACL
)((ULONG_PTR
)SecurityDescriptor
->Dacl
+
929 (ULONG_PTR
)SecurityDescriptor
);
931 Dacl
= (PACL
)SecurityDescriptor
->Dacl
;
933 DaclLength
= ROUND_UP((ULONG
)Dacl
->AclSize
, 4);
935 Control
|= (SecurityDescriptor
->Control
& (SE_DACL_DEFAULTED
| SE_DACL_PRESENT
));
939 if ((ObjectSd
->Control
& SE_DACL_PRESENT
) &&
940 (ObjectSd
->Dacl
!= NULL
))
942 Dacl
= (PACL
)((ULONG_PTR
)ObjectSd
->Dacl
+ (ULONG_PTR
)ObjectSd
);
943 DaclLength
= ROUND_UP((ULONG
)Dacl
->AclSize
, 4);
945 Control
|= (ObjectSd
->Control
& (SE_DACL_DEFAULTED
| SE_DACL_PRESENT
));
948 /* Get SACL and SACL size */
949 if (SecurityInformation
& SACL_SECURITY_INFORMATION
)
951 if ((SecurityDescriptor
->Control
& SE_SACL_PRESENT
) &&
952 (SecurityDescriptor
->Sacl
!= NULL
))
954 if( SecurityDescriptor
->Control
& SE_SELF_RELATIVE
)
955 Sacl
= (PACL
)((ULONG_PTR
)SecurityDescriptor
->Sacl
+
956 (ULONG_PTR
)SecurityDescriptor
);
958 Sacl
= (PACL
)SecurityDescriptor
->Sacl
;
959 SaclLength
= ROUND_UP((ULONG
)Sacl
->AclSize
, 4);
961 Control
|= (SecurityDescriptor
->Control
& (SE_SACL_DEFAULTED
| SE_SACL_PRESENT
));
965 if ((ObjectSd
->Control
& SE_SACL_PRESENT
) &&
966 (ObjectSd
->Sacl
!= NULL
))
968 Sacl
= (PACL
)((ULONG_PTR
)ObjectSd
->Sacl
+ (ULONG_PTR
)ObjectSd
);
969 SaclLength
= ROUND_UP((ULONG
)Sacl
->AclSize
, 4);
971 Control
|= (ObjectSd
->Control
& (SE_SACL_DEFAULTED
| SE_SACL_PRESENT
));
974 NewSd
= ExAllocatePool(NonPagedPool
,
975 sizeof(SECURITY_DESCRIPTOR
) + OwnerLength
+ GroupLength
+
976 DaclLength
+ SaclLength
);
979 ObDereferenceObject(Object
);
980 return STATUS_INSUFFICIENT_RESOURCES
;
983 RtlCreateSecurityDescriptor(NewSd
,
984 SECURITY_DESCRIPTOR_REVISION1
);
985 /* We always build a self-relative descriptor */
986 NewSd
->Control
= (USHORT
)Control
| SE_SELF_RELATIVE
;
988 Current
= (ULONG_PTR
)NewSd
+ sizeof(SECURITY_DESCRIPTOR
);
990 if (OwnerLength
!= 0)
992 RtlCopyMemory((PVOID
)Current
,
995 NewSd
->Owner
= (PSID
)(Current
- (ULONG_PTR
)NewSd
);
996 Current
+= OwnerLength
;
999 if (GroupLength
!= 0)
1001 RtlCopyMemory((PVOID
)Current
,
1004 NewSd
->Group
= (PSID
)(Current
- (ULONG_PTR
)NewSd
);
1005 Current
+= GroupLength
;
1008 if (DaclLength
!= 0)
1010 RtlCopyMemory((PVOID
)Current
,
1013 NewSd
->Dacl
= (PACL
)(Current
- (ULONG_PTR
)NewSd
);
1014 Current
+= DaclLength
;
1017 if (SaclLength
!= 0)
1019 RtlCopyMemory((PVOID
)Current
,
1022 NewSd
->Sacl
= (PACL
)(Current
- (ULONG_PTR
)NewSd
);
1023 Current
+= SaclLength
;
1026 *ObjectsSecurityDescriptor
= NewSd
;
1027 return STATUS_SUCCESS
;
1035 SeSetSecurityDescriptorInfoEx(IN PVOID Object OPTIONAL
,
1036 IN PSECURITY_INFORMATION SecurityInformation
,
1037 IN PSECURITY_DESCRIPTOR ModificationDescriptor
,
1038 IN OUT PSECURITY_DESCRIPTOR
*ObjectsSecurityDescriptor
,
1039 IN ULONG AutoInheritFlags
,
1040 IN POOL_TYPE PoolType
,
1041 IN PGENERIC_MAPPING GenericMapping
)
1043 PISECURITY_DESCRIPTOR ObjectSd
= *ObjectsSecurityDescriptor
;
1046 return STATUS_NO_SECURITY_ON_OBJECT
; // The object does not have a security descriptor.
1049 return STATUS_NOT_IMPLEMENTED
;
1057 SeValidSecurityDescriptor(IN ULONG Length
,
1058 IN PSECURITY_DESCRIPTOR _SecurityDescriptor
)
1063 PISECURITY_DESCRIPTOR SecurityDescriptor
= _SecurityDescriptor
;
1065 if (Length
< SECURITY_DESCRIPTOR_MIN_LENGTH
)
1067 DPRINT1("Invalid Security Descriptor revision\n");
1071 if (SecurityDescriptor
->Revision
!= SECURITY_DESCRIPTOR_REVISION1
)
1073 DPRINT1("Invalid Security Descriptor revision\n");
1077 if (!(SecurityDescriptor
->Control
& SE_SELF_RELATIVE
))
1079 DPRINT1("No self-relative Security Descriptor\n");
1083 SdLength
= sizeof(SECURITY_DESCRIPTOR
);
1085 /* Check Owner SID */
1086 if (SecurityDescriptor
->Owner
== NULL
)
1088 DPRINT1("No Owner SID\n");
1092 if ((ULONG_PTR
)SecurityDescriptor
->Owner
% sizeof(ULONG
))
1094 DPRINT1("Invalid Owner SID alignment\n");
1098 Sid
= (PISID
)((ULONG_PTR
)SecurityDescriptor
+ (ULONG_PTR
)SecurityDescriptor
->Owner
);
1099 if (Sid
->Revision
!= SID_REVISION
)
1101 DPRINT1("Invalid Owner SID revision\n");
1105 SdLength
+= (sizeof(SID
) + (Sid
->SubAuthorityCount
- 1) * sizeof(ULONG
));
1106 if (Length
< SdLength
)
1108 DPRINT1("Invalid Owner SID size\n");
1112 /* Check Group SID */
1113 if (SecurityDescriptor
->Group
!= NULL
)
1115 if ((ULONG_PTR
)SecurityDescriptor
->Group
% sizeof(ULONG
))
1117 DPRINT1("Invalid Group SID alignment\n");
1121 Sid
= (PSID
)((ULONG_PTR
)SecurityDescriptor
+ (ULONG_PTR
)SecurityDescriptor
->Group
);
1122 if (Sid
->Revision
!= SID_REVISION
)
1124 DPRINT1("Invalid Group SID revision\n");
1128 SdLength
+= (sizeof(SID
) + (Sid
->SubAuthorityCount
- 1) * sizeof(ULONG
));
1129 if (Length
< SdLength
)
1131 DPRINT1("Invalid Group SID size\n");
1137 if (SecurityDescriptor
->Dacl
!= NULL
)
1139 if ((ULONG_PTR
)SecurityDescriptor
->Dacl
% sizeof(ULONG
))
1141 DPRINT1("Invalid DACL alignment\n");
1145 Acl
= (PACL
)((ULONG_PTR
)SecurityDescriptor
+ (ULONG_PTR
)SecurityDescriptor
->Dacl
);
1146 if ((Acl
->AclRevision
< MIN_ACL_REVISION
) &&
1147 (Acl
->AclRevision
> MAX_ACL_REVISION
))
1149 DPRINT1("Invalid DACL revision\n");
1153 SdLength
+= Acl
->AclSize
;
1154 if (Length
< SdLength
)
1156 DPRINT1("Invalid DACL size\n");
1162 if (SecurityDescriptor
->Sacl
!= NULL
)
1164 if ((ULONG_PTR
)SecurityDescriptor
->Sacl
% sizeof(ULONG
))
1166 DPRINT1("Invalid SACL alignment\n");
1170 Acl
= (PACL
)((ULONG_PTR
)SecurityDescriptor
+ (ULONG_PTR
)SecurityDescriptor
->Sacl
);
1171 if ((Acl
->AclRevision
< MIN_ACL_REVISION
) ||
1172 (Acl
->AclRevision
> MAX_ACL_REVISION
))
1174 DPRINT1("Invalid SACL revision\n");
1178 SdLength
+= Acl
->AclSize
;
1179 if (Length
< SdLength
)
1181 DPRINT1("Invalid SACL size\n");
1193 SeDeassignSecurity(PSECURITY_DESCRIPTOR
*SecurityDescriptor
)
1197 if (*SecurityDescriptor
!= NULL
)
1199 ExFreePool(*SecurityDescriptor
);
1200 *SecurityDescriptor
= NULL
;
1203 return STATUS_SUCCESS
;
1211 SeAssignSecurityEx(IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL
,
1212 IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL
,
1213 OUT PSECURITY_DESCRIPTOR
*NewDescriptor
,
1214 IN GUID
*ObjectType OPTIONAL
,
1215 IN BOOLEAN IsDirectoryObject
,
1216 IN ULONG AutoInheritFlags
,
1217 IN PSECURITY_SUBJECT_CONTEXT SubjectContext
,
1218 IN PGENERIC_MAPPING GenericMapping
,
1219 IN POOL_TYPE PoolType
)
1222 return STATUS_NOT_IMPLEMENTED
;
1229 SeAssignSecurity(PSECURITY_DESCRIPTOR _ParentDescriptor OPTIONAL
,
1230 PSECURITY_DESCRIPTOR _ExplicitDescriptor OPTIONAL
,
1231 PSECURITY_DESCRIPTOR
*NewDescriptor
,
1232 BOOLEAN IsDirectoryObject
,
1233 PSECURITY_SUBJECT_CONTEXT SubjectContext
,
1234 PGENERIC_MAPPING GenericMapping
,
1237 PISECURITY_DESCRIPTOR ParentDescriptor
= _ParentDescriptor
;
1238 PISECURITY_DESCRIPTOR ExplicitDescriptor
= _ExplicitDescriptor
;
1239 PISECURITY_DESCRIPTOR Descriptor
;
1241 ULONG OwnerLength
= 0;
1242 ULONG GroupLength
= 0;
1243 ULONG DaclLength
= 0;
1244 ULONG SaclLength
= 0;
1255 /* Lock subject context */
1256 SeLockSubjectContext(SubjectContext
);
1258 if (SubjectContext
->ClientToken
!= NULL
)
1260 Token
= SubjectContext
->ClientToken
;
1264 Token
= SubjectContext
->PrimaryToken
;
1268 /* Inherit the Owner SID */
1269 if (ExplicitDescriptor
!= NULL
&& ExplicitDescriptor
->Owner
!= NULL
)
1271 DPRINT("Use explicit owner sid!\n");
1272 Owner
= ExplicitDescriptor
->Owner
;
1274 if (ExplicitDescriptor
->Control
& SE_SELF_RELATIVE
)
1276 Owner
= (PSID
)(((ULONG_PTR
)Owner
) + (ULONG_PTR
)ExplicitDescriptor
);
1284 DPRINT("Use token owner sid!\n");
1285 Owner
= Token
->UserAndGroups
[Token
->DefaultOwnerIndex
].Sid
;
1289 DPRINT("Use default owner sid!\n");
1290 Owner
= SeLocalSystemSid
;
1293 Control
|= SE_OWNER_DEFAULTED
;
1296 OwnerLength
= ROUND_UP(RtlLengthSid(Owner
), 4);
1299 /* Inherit the Group SID */
1300 if (ExplicitDescriptor
!= NULL
&& ExplicitDescriptor
->Group
!= NULL
)
1302 DPRINT("Use explicit group sid!\n");
1303 Group
= ExplicitDescriptor
->Group
;
1304 if (ExplicitDescriptor
->Control
& SE_SELF_RELATIVE
)
1306 Group
= (PSID
)(((ULONG_PTR
)Group
) + (ULONG_PTR
)ExplicitDescriptor
);
1313 DPRINT("Use token group sid!\n");
1314 Group
= Token
->PrimaryGroup
;
1318 DPRINT("Use default group sid!\n");
1319 Group
= SeLocalSystemSid
;
1322 Control
|= SE_OWNER_DEFAULTED
;
1325 GroupLength
= ROUND_UP(RtlLengthSid(Group
), 4);
1328 /* Inherit the DACL */
1329 if (ExplicitDescriptor
!= NULL
&&
1330 (ExplicitDescriptor
->Control
& SE_DACL_PRESENT
) &&
1331 !(ExplicitDescriptor
->Control
& SE_DACL_DEFAULTED
))
1333 DPRINT("Use explicit DACL!\n");
1334 Dacl
= ExplicitDescriptor
->Dacl
;
1335 if (Dacl
!= NULL
&& (ExplicitDescriptor
->Control
& SE_SELF_RELATIVE
))
1337 Dacl
= (PACL
)(((ULONG_PTR
)Dacl
) + (ULONG_PTR
)ExplicitDescriptor
);
1340 Control
|= SE_DACL_PRESENT
;
1342 else if (ParentDescriptor
!= NULL
&&
1343 (ParentDescriptor
->Control
& SE_DACL_PRESENT
))
1345 DPRINT("Use parent DACL!\n");
1346 /* FIXME: Inherit */
1347 Dacl
= ParentDescriptor
->Dacl
;
1348 if (Dacl
!= NULL
&& (ParentDescriptor
->Control
& SE_SELF_RELATIVE
))
1350 Dacl
= (PACL
)(((ULONG_PTR
)Dacl
) + (ULONG_PTR
)ParentDescriptor
);
1352 Control
|= (SE_DACL_PRESENT
| SE_DACL_DEFAULTED
);
1354 else if (Token
!= NULL
&& Token
->DefaultDacl
!= NULL
)
1356 DPRINT("Use token default DACL!\n");
1357 /* FIXME: Inherit */
1358 Dacl
= Token
->DefaultDacl
;
1359 Control
|= (SE_DACL_PRESENT
| SE_DACL_DEFAULTED
);
1363 DPRINT("Use NULL DACL!\n");
1365 Control
|= (SE_DACL_PRESENT
| SE_DACL_DEFAULTED
);
1368 DaclLength
= (Dacl
!= NULL
) ? ROUND_UP(Dacl
->AclSize
, 4) : 0;
1371 /* Inherit the SACL */
1372 if (ExplicitDescriptor
!= NULL
&&
1373 (ExplicitDescriptor
->Control
& SE_SACL_PRESENT
) &&
1374 !(ExplicitDescriptor
->Control
& SE_SACL_DEFAULTED
))
1376 DPRINT("Use explicit SACL!\n");
1377 Sacl
= ExplicitDescriptor
->Sacl
;
1378 if (Sacl
!= NULL
&& (ExplicitDescriptor
->Control
& SE_SELF_RELATIVE
))
1380 Sacl
= (PACL
)(((ULONG_PTR
)Sacl
) + (ULONG_PTR
)ExplicitDescriptor
);
1383 Control
|= SE_SACL_PRESENT
;
1385 else if (ParentDescriptor
!= NULL
&&
1386 (ParentDescriptor
->Control
& SE_SACL_PRESENT
))
1388 DPRINT("Use parent SACL!\n");
1389 /* FIXME: Inherit */
1390 Sacl
= ParentDescriptor
->Sacl
;
1391 if (Sacl
!= NULL
&& (ParentDescriptor
->Control
& SE_SELF_RELATIVE
))
1393 Sacl
= (PACL
)(((ULONG_PTR
)Sacl
) + (ULONG_PTR
)ParentDescriptor
);
1395 Control
|= (SE_SACL_PRESENT
| SE_SACL_DEFAULTED
);
1398 SaclLength
= (Sacl
!= NULL
) ? ROUND_UP(Sacl
->AclSize
, 4) : 0;
1401 /* Allocate and initialize the new security descriptor */
1402 Length
= sizeof(SECURITY_DESCRIPTOR
) +
1403 OwnerLength
+ GroupLength
+ DaclLength
+ SaclLength
;
1405 DPRINT("L: sizeof(SECURITY_DESCRIPTOR) %d OwnerLength %d GroupLength %d DaclLength %d SaclLength %d\n",
1406 sizeof(SECURITY_DESCRIPTOR
),
1412 Descriptor
= ExAllocatePoolWithTag(PagedPool
,
1415 if (Descriptor
== NULL
)
1417 DPRINT1("ExAlloctePool() failed\n");
1418 /* FIXME: Unlock subject context */
1419 return STATUS_INSUFFICIENT_RESOURCES
;
1422 RtlZeroMemory( Descriptor
, Length
);
1423 RtlCreateSecurityDescriptor(Descriptor
,
1424 SECURITY_DESCRIPTOR_REVISION
);
1426 Descriptor
->Control
= (USHORT
)Control
| SE_SELF_RELATIVE
;
1428 Current
= (ULONG_PTR
)Descriptor
+ sizeof(SECURITY_DESCRIPTOR
);
1430 if (SaclLength
!= 0)
1432 RtlCopyMemory((PVOID
)Current
,
1435 Descriptor
->Sacl
= (PACL
)((ULONG_PTR
)Current
- (ULONG_PTR
)Descriptor
);
1436 Current
+= SaclLength
;
1439 if (DaclLength
!= 0)
1441 RtlCopyMemory((PVOID
)Current
,
1444 Descriptor
->Dacl
= (PACL
)((ULONG_PTR
)Current
- (ULONG_PTR
)Descriptor
);
1445 Current
+= DaclLength
;
1448 if (OwnerLength
!= 0)
1450 RtlCopyMemory((PVOID
)Current
,
1453 Descriptor
->Owner
= (PSID
)((ULONG_PTR
)Current
- (ULONG_PTR
)Descriptor
);
1454 Current
+= OwnerLength
;
1455 DPRINT("Owner of %x at %x\n", Descriptor
, Descriptor
->Owner
);
1458 DPRINT("Owner of %x is zero length\n", Descriptor
);
1460 if (GroupLength
!= 0)
1462 memmove((PVOID
)Current
,
1465 Descriptor
->Group
= (PSID
)((ULONG_PTR
)Current
- (ULONG_PTR
)Descriptor
);
1468 /* Unlock subject context */
1469 SeUnlockSubjectContext(SubjectContext
);
1471 *NewDescriptor
= Descriptor
;
1473 DPRINT("Descrptor %x\n", Descriptor
);
1474 ASSERT(RtlLengthSecurityDescriptor(Descriptor
));
1476 return STATUS_SUCCESS
;