diff --git a/ntoskrnl/include/internal/se.h b/ntoskrnl/include/internal/se.h index 6095bd9e013..563cd23d331 100644 --- a/ntoskrnl/include/internal/se.h +++ b/ntoskrnl/include/internal/se.h @@ -485,6 +485,12 @@ SeReleaseSidAndAttributesArray( _In_ KPROCESSOR_MODE AccessMode, _In_ BOOLEAN CaptureIfKernel); +NTSTATUS +NTAPI +SeComputeQuotaInformationSize( + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _Out_ PULONG QuotaInfoSize); + NTSTATUS NTAPI SepCaptureAcl( diff --git a/ntoskrnl/se/sd.c b/ntoskrnl/se/sd.c index ab10515e79f..37dc1a162bd 100644 --- a/ntoskrnl/se/sd.c +++ b/ntoskrnl/se/sd.c @@ -1429,4 +1429,46 @@ SeAssignSecurity( PoolType); } +/* + * @implemented + */ +_IRQL_requires_max_(PASSIVE_LEVEL) +NTSTATUS +NTAPI +SeComputeQuotaInformationSize( + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _Out_ PULONG QuotaInfoSize) +{ + PSID Group; + PACL Dacl; + + PAGED_CODE(); + + *QuotaInfoSize = 0; + + /* Validate security descriptor revision */ + if (((PISECURITY_DESCRIPTOR)SecurityDescriptor)->Revision != SECURITY_DESCRIPTOR_REVISION1) + { + return STATUS_UNKNOWN_REVISION; + } + + /* Get group and DACL, if any */ + Group = SepGetGroupFromDescriptor(SecurityDescriptor); + Dacl = SepGetDaclFromDescriptor(SecurityDescriptor); + + /* Return SID length if any */ + if (Group != NULL) + { + *QuotaInfoSize = ALIGN_UP_BY(RtlLengthSid(Group), sizeof(ULONG)); + } + + /* Return DACL if any */ + if (Dacl != NULL) + { + *QuotaInfoSize += ALIGN_UP_BY(Dacl->AclSize, sizeof(ULONG)); + } + + return STATUS_SUCCESS; +} + /* EOF */