Author: tfaber Date: Tue Jul 29 22:21:37 2014 New Revision: 63777
URL: http://svn.reactos.org/svn/reactos?rev=63777&view=rev Log: [NTOS:CM] - Return a valid security descriptor for keys, even though it's hacked. Based on code removed in r26704. CORE-8382 #resolve #comment Fixed, now we fail with E_FAIL instead. Hurray.
Modified: trunk/reactos/ntoskrnl/config/cmse.c
Modified: trunk/reactos/ntoskrnl/config/cmse.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/config/cmse.c?rev=... ============================================================================== --- trunk/reactos/ntoskrnl/config/cmse.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/config/cmse.c [iso-8859-1] Tue Jul 29 22:21:37 2014 @@ -138,6 +138,74 @@ }
NTSTATUS +CmpQuerySecurityDescriptor(IN PCM_KEY_BODY KeyBody, + IN SECURITY_INFORMATION SecurityInformation, + OUT PSECURITY_DESCRIPTOR SecurityDescriptor, + IN OUT PULONG BufferLength) +{ + PISECURITY_DESCRIPTOR_RELATIVE RelSd; + PUCHAR Current; + ULONG SidSize; + ULONG SdSize; + NTSTATUS Status; + + DBG_UNREFERENCED_PARAMETER(KeyBody); + + if (SecurityInformation == 0) + { + return STATUS_ACCESS_DENIED; + } + + SidSize = RtlLengthSid(SeWorldSid); + SdSize = sizeof(*RelSd) + 2 * SidSize; + RelSd = SecurityDescriptor; + + if (*BufferLength < SdSize) + { + *BufferLength = SdSize; + return STATUS_BUFFER_TOO_SMALL; + } + + *BufferLength = SdSize; + + Status = RtlCreateSecurityDescriptorRelative(RelSd, + SECURITY_DESCRIPTOR_REVISION); + if (!NT_SUCCESS(Status)) + return Status; + + Current = (PUCHAR)(RelSd + 1); + ASSERT((ULONG_PTR)Current - (ULONG_PTR)RelSd <= SdSize); + + if (SecurityInformation & OWNER_SECURITY_INFORMATION) + { + RtlCopyMemory(Current, SeWorldSid, SidSize); + RelSd->Owner = Current - (PUCHAR)RelSd; + Current += SidSize; + ASSERT((ULONG_PTR)Current - (ULONG_PTR)RelSd <= SdSize); + } + + if (SecurityInformation & GROUP_SECURITY_INFORMATION) + { + RtlCopyMemory(Current, SeWorldSid, SidSize); + RelSd->Group = Current - (PUCHAR)RelSd; + Current += SidSize; + ASSERT((ULONG_PTR)Current - (ULONG_PTR)RelSd <= SdSize); + } + + if (SecurityInformation & DACL_SECURITY_INFORMATION) + { + RelSd->Control |= SE_DACL_PRESENT; + } + + if (SecurityInformation & SACL_SECURITY_INFORMATION) + { + RelSd->Control |= SE_SACL_PRESENT; + } + + return STATUS_SUCCESS; +} + +NTSTATUS NTAPI CmpSecurityMethod(IN PVOID ObjectBody, IN SECURITY_OPERATION_CODE OperationCode, @@ -148,6 +216,38 @@ IN POOL_TYPE PoolType, IN PGENERIC_MAPPING GenericMapping) { + DBG_UNREFERENCED_PARAMETER(OldSecurityDescriptor); + DBG_UNREFERENCED_PARAMETER(GenericMapping); + + switch (OperationCode) + { + case SetSecurityDescriptor: + DPRINT("Set security descriptor\n"); + ASSERT((PoolType == PagedPool) || (PoolType == NonPagedPool)); + /* HACK */ + break; + + case QuerySecurityDescriptor: + DPRINT("Query security descriptor\n"); + return CmpQuerySecurityDescriptor(ObjectBody, + *SecurityInformation, + SecurityDescriptor, + BufferLength); + + case DeleteSecurityDescriptor: + DPRINT("Delete security descriptor\n"); + /* HACK */ + break; + + case AssignSecurityDescriptor: + DPRINT("Assign security descriptor\n"); + /* HACK */ + break; + + default: + KeBugCheckEx(SECURITY_SYSTEM, 0, STATUS_INVALID_PARAMETER, 0, 0); + } + /* HACK */ return STATUS_SUCCESS; }