diff --git a/reactos/include/ntos/rtl.h b/reactos/include/ntos/rtl.h index ff7026eed26..e3276f8560b 100755 --- a/reactos/include/ntos/rtl.h +++ b/reactos/include/ntos/rtl.h @@ -2294,6 +2294,11 @@ RtlSetBits ( ULONG NumberToSet ); +NTSTATUS STDCALL +RtlSetControlSecurityDescriptor(IN PSECURITY_DESCRIPTOR SecurityDescriptor, + IN SECURITY_DESCRIPTOR_CONTROL ControlBitsOfInterest, + IN SECURITY_DESCRIPTOR_CONTROL ControlBitsToSet); + NTSTATUS STDCALL RtlSetDaclSecurityDescriptor (PSECURITY_DESCRIPTOR SecurityDescriptor, BOOLEAN DaclPresent, diff --git a/reactos/lib/ntdll/def/ntdll.def b/reactos/lib/ntdll/def/ntdll.def index 1b9bb31c0db..ca0ab12cbae 100644 --- a/reactos/lib/ntdll/def/ntdll.def +++ b/reactos/lib/ntdll/def/ntdll.def @@ -321,7 +321,6 @@ RtlCharToInteger@12 RtlCheckRegistryKey@8 RtlClearAllBits@4 RtlClearBits@12 -;RtlClosePropertySet RtlCompactHeap@8 RtlCompareMemory@12 RtlCompareMemoryUlong@12 @@ -350,7 +349,6 @@ RtlCreateAtomTable@8 RtlCreateEnvironment@8 RtlCreateHeap@24 RtlCreateProcessParameters@40 -;RtlCreatePropertySet RtlCreateQueryDebugBuffer@8 RtlCreateRegistryKey@8 RtlCreateSecurityDescriptor@8 @@ -404,7 +402,6 @@ RtlEnterCriticalSection@4 RtlEnumProcessHeaps@8 ;RtlEnumerateGenericTable ;RtlEnumerateGenericTableWithoutSplaying -;RtlEnumerateProperties RtlEqualComputerName@8 RtlEqualDomainName@8 RtlEqualLuid@8 @@ -435,7 +432,6 @@ RtlFindRange@48 RtlFindSetBits@12 RtlFindSetBitsAndClear@12 RtlFirstFreeAce@8 -;RtlFlushPropertySet RtlFormatCurrentUserKeyPath@4 RtlFormatMessage@32 RtlFreeAnsiString@4 @@ -468,7 +464,6 @@ RtlGetProcessHeaps@8 RtlGetSaclSecurityDescriptor@16 ;RtlGetUserInfoHeap RtlGetVersion@4 -;RtlGuidToPropertySetName RtlIdentifierAuthoritySid@4 RtlImageDirectoryEntryToData@16 RtlImageNtHeader@4 @@ -559,7 +554,6 @@ RtlOpenCurrentUser@8 RtlPinAtomInAtomTable@8 RtlPrefixString@12 RtlPrefixUnicodeString@12 -;RtlPropertySetNameToGuid ;RtlProtectHeap RtlQueryAtomInAtomTable@24 RtlQueryEnvironmentVariable_U@12 @@ -568,9 +562,6 @@ RtlQueryInformationAcl@16 RtlQueryProcessDebugInformation@12 ;RtlQueryProcessHeapInformation ;RtlQueryProcessLockInformation -;RtlQueryProperties -;RtlQueryPropertyNames -;RtlQueryPropertySet RtlQueryRegistryValues@20 ;RtlQuerySecurityObject ;RtlQueryTagHeap @@ -594,6 +585,7 @@ RtlSelfRelativeToAbsoluteSD@44 RtlSetAllBits@4 ;RtlSetAttributesSecurityDescriptor RtlSetBits@12 +RtlSetControlSecurityDescriptor@12 RtlSetCurrentDirectory_U@4 RtlSetCurrentEnvironment@8 RtlSetDaclSecurityDescriptor@16 @@ -601,9 +593,6 @@ RtlSetEnvironmentVariable@12 RtlSetGroupSecurityDescriptor@12 RtlSetInformationAcl@16 RtlSetOwnerSecurityDescriptor@12 -;RtlSetProperties -;RtlSetPropertyNames -;RtlSetPropertySetClassId RtlSetSaclSecurityDescriptor@16 ;RtlSetSecurityObject RtlSetTimeZoneInformation@4 diff --git a/reactos/lib/rtl/sd.c b/reactos/lib/rtl/sd.c index 09ffac238db..6dd61e73c07 100644 --- a/reactos/lib/rtl/sd.c +++ b/reactos/lib/rtl/sd.c @@ -40,6 +40,7 @@ RtlCreateSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor, return STATUS_SUCCESS; } + /* * @implemented */ @@ -278,9 +279,10 @@ RtlSetOwnerSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor, SecurityDescriptor->Control = SecurityDescriptor->Control | SE_OWNER_DEFAULTED; } - return(STATUS_SUCCESS); + return STATUS_SUCCESS; } + /* * @implemented */ @@ -319,6 +321,7 @@ RtlGetOwnerSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor, return STATUS_SUCCESS; } + /* * @implemented */ @@ -347,6 +350,7 @@ RtlSetGroupSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor, return STATUS_SUCCESS; } + /* * @implemented */ @@ -578,8 +582,7 @@ RtlMakeSelfRelativeSD(PSECURITY_DESCRIPTOR AbsSD, NTSTATUS STDCALL RtlAbsoluteToSelfRelativeSD(PSECURITY_DESCRIPTOR AbsSD, PSECURITY_DESCRIPTOR RelSD, - PULONG BufferLength - ) + PULONG BufferLength) { if (AbsSD->Control & SE_SELF_RELATIVE) { @@ -611,6 +614,29 @@ RtlGetControlSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor, } +/* + * @implemented + */ +NTSTATUS STDCALL +RtlSetControlSecurityDescriptor(IN PSECURITY_DESCRIPTOR SecurityDescriptor, + IN SECURITY_DESCRIPTOR_CONTROL ControlBitsOfInterest, + IN SECURITY_DESCRIPTOR_CONTROL ControlBitsToSet) +{ + if (SecurityDescriptor->Revision != SECURITY_DESCRIPTOR_REVISION1) + { + return STATUS_UNKNOWN_REVISION; + } + + /* Zero the 'bits of interest' */ + SecurityDescriptor->Control &= ~ControlBitsOfInterest; + + /* Set the 'bits to set' */ + SecurityDescriptor->Control |= (ControlBitsToSet & ControlBitsOfInterest); + + return STATUS_SUCCESS; +} + + /* * @implemented */ @@ -657,6 +683,7 @@ RtlGetSaclSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor, return STATUS_SUCCESS; } + /* * @implemented */ @@ -694,6 +721,7 @@ RtlSetSaclSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor, return STATUS_SUCCESS; } + /* * @implemented */ @@ -759,6 +787,7 @@ RtlSelfRelativeToAbsoluteSD(PSECURITY_DESCRIPTOR RelSD, return STATUS_SUCCESS; } + /* * @unimplemented */ @@ -770,9 +799,10 @@ RtlSelfRelativeToAbsoluteSD2(PSECURITY_DESCRIPTOR SelfRelativeSecurityDescriptor return STATUS_NOT_IMPLEMENTED; } + /* -* @implemented -*/ + * @implemented + */ BOOLEAN STDCALL RtlValidRelativeSecurityDescriptor(IN PSECURITY_DESCRIPTOR SecurityDescriptorInput, IN ULONG SecurityDescriptorLength,