[NTOSKRNL] Implement SeComputeQuotaInformationSize()
authorPierre Schweitzer <pierre@reactos.org>
Sat, 27 Oct 2018 17:32:42 +0000 (19:32 +0200)
committerPierre Schweitzer <pierre@reactos.org>
Sat, 27 Oct 2018 17:36:14 +0000 (19:36 +0200)
ntoskrnl/include/internal/se.h
ntoskrnl/se/sd.c

index 6095bd9..563cd23 100644 (file)
@@ -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(
index ab10515..37dc1a1 100644 (file)
@@ -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 */