https://git.reactos.org/?p=reactos.git;a=commitdiff;h=2ce071d19a78c4ac663facdb7d2fcd5566299e6f

commit 2ce071d19a78c4ac663facdb7d2fcd5566299e6f
Author:     Pierre Schweitzer <[email protected]>
AuthorDate: Sat Oct 27 19:32:42 2018 +0200
Commit:     Pierre Schweitzer <[email protected]>
CommitDate: Sat Oct 27 19:36:14 2018 +0200

    [NTOSKRNL] Implement SeComputeQuotaInformationSize()
---
 ntoskrnl/include/internal/se.h |  6 ++++++
 ntoskrnl/se/sd.c               | 42 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 48 insertions(+)

diff --git a/ntoskrnl/include/internal/se.h b/ntoskrnl/include/internal/se.h
index 6095bd9e01..563cd23d33 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 ab10515e79..37dc1a162b 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 */

Reply via email to