Implement RtlGetSecurityDescriptorRMControl, RtlSetSecurityDescriptorRMControl, SetSecurityDescriptorControl, GetSecurityDescriptorRMControl and SetSecurityDescriptorRMControl.
Modified: trunk/reactos/include/ddk/setypes.h
Modified: trunk/reactos/include/ntos/rtl.h
Modified: trunk/reactos/include/ntos/security.h
Modified: trunk/reactos/lib/advapi32/advapi32.def
Modified: trunk/reactos/lib/advapi32/sec/sec.c
Modified: trunk/reactos/lib/ntdll/def/ntdll.def
Modified: trunk/reactos/lib/rtl/sd.c
Modified: trunk/reactos/w32api/include/winbase.h

Modified: trunk/reactos/include/ddk/setypes.h
--- trunk/reactos/include/ddk/setypes.h	2005-02-11 12:06:29 UTC (rev 13492)
+++ trunk/reactos/include/ddk/setypes.h	2005-02-11 15:52:38 UTC (rev 13493)
@@ -50,22 +50,23 @@
 #define FAILED_ACCESS_ACE_FLAG       (0x80)
 
 /* SECURITY_DESCRIPTOR_CONTROL */
-#define SECURITY_DESCRIPTOR_REVISION	(1)
-#define SECURITY_DESCRIPTOR_REVISION1	(1)
-#define SECURITY_DESCRIPTOR_MIN_LENGTH	(20)
-#define SE_OWNER_DEFAULTED	(1)
-#define SE_GROUP_DEFAULTED	(2)
-#define SE_DACL_PRESENT	(4)
-#define SE_DACL_DEFAULTED	(8)
-#define SE_SACL_PRESENT	(16)
-#define SE_SACL_DEFAULTED	(32)
-#define SE_SELF_RELATIVE	(32768)
+#define SECURITY_DESCRIPTOR_REVISION    (1)
+#define SECURITY_DESCRIPTOR_REVISION1   (1)
+#define SECURITY_DESCRIPTOR_MIN_LENGTH  (20)
+#define SE_OWNER_DEFAULTED              (0x0001)
+#define SE_GROUP_DEFAULTED              (0x0002)
+#define SE_DACL_PRESENT                 (0x0004)
+#define SE_DACL_DEFAULTED               (0x0008)
+#define SE_SACL_PRESENT                 (0x0010)
+#define SE_SACL_DEFAULTED               (0x0020)
+#define SE_RM_CONTROL_VALID             (0x4000)
+#define SE_SELF_RELATIVE                (0x8000)
 
 /* PRIVILEGE_SET */
-#define SE_PRIVILEGE_ENABLED_BY_DEFAULT	(0x1L)
-#define SE_PRIVILEGE_ENABLED	(0x2L)
-#define SE_PRIVILEGE_USED_FOR_ACCESS	(0x80000000L)
-#define PRIVILEGE_SET_ALL_NECESSARY	(0x1)
+#define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x1L)
+#define SE_PRIVILEGE_ENABLED            (0x2L)
+#define SE_PRIVILEGE_USED_FOR_ACCESS    (0x80000000L)
+#define PRIVILEGE_SET_ALL_NECESSARY     (0x1)
 
 /* SID */
 #define SID_REVISION		(1)

Modified: trunk/reactos/include/ntos/rtl.h
--- trunk/reactos/include/ntos/rtl.h	2005-02-11 12:06:29 UTC (rev 13492)
+++ trunk/reactos/include/ntos/rtl.h	2005-02-11 15:52:38 UTC (rev 13493)
@@ -1337,6 +1337,10 @@
 			      PACL* Sacl,
 			      PBOOLEAN SaclDefaulted);
 
+BOOLEAN STDCALL
+RtlGetSecurityDescriptorRMControl(PSECURITY_DESCRIPTOR SecurityDescriptor,
+				  PUCHAR RMControl);
+
 NTSTATUS
 STDCALL
 RtlGetSetBootStatusData(
@@ -2321,6 +2325,10 @@
 			      PACL Sacl,
 			      BOOLEAN SaclDefaulted);
 
+VOID STDCALL
+RtlSetSecurityDescriptorRMControl(PSECURITY_DESCRIPTOR SecurityDescriptor,
+				  PUCHAR RMControl);
+
 NTSTATUS STDCALL
 RtlSetInformationAcl (PACL Acl,
 		      PVOID Information,

Modified: trunk/reactos/include/ntos/security.h
--- trunk/reactos/include/ntos/security.h	2005-02-11 12:06:29 UTC (rev 13492)
+++ trunk/reactos/include/ntos/security.h	2005-02-11 15:52:38 UTC (rev 13493)
@@ -36,13 +36,14 @@
 /* Security descriptor control. */
 #define SECURITY_DESCRIPTOR_REVISION	(1)
 #define SECURITY_DESCRIPTOR_MIN_LENGTH	(20)
-#define SE_OWNER_DEFAULTED	(1)
-#define SE_GROUP_DEFAULTED	(2)
-#define SE_DACL_PRESENT	(4)
-#define SE_DACL_DEFAULTED	(8)
-#define SE_SACL_PRESENT	(16)
-#define SE_SACL_DEFAULTED	(32)
-#define SE_SELF_RELATIVE	(32768)
+#define SE_OWNER_DEFAULTED	(0x0001)
+#define SE_GROUP_DEFAULTED	(0x0002)
+#define SE_DACL_PRESENT		(0x0004)
+#define SE_DACL_DEFAULTED	(0x0008)
+#define SE_SACL_PRESENT		(0x0010)
+#define SE_SACL_DEFAULTED	(0x0020)
+#define SE_RM_CONTROL_VALID	(0x4000)
+#define SE_SELF_RELATIVE	(0x8000)
 #endif
 
 /* This is defined in the Win 32 API headers as something else: */

Modified: trunk/reactos/lib/advapi32/advapi32.def
--- trunk/reactos/lib/advapi32/advapi32.def	2005-02-11 12:06:29 UTC (rev 13492)
+++ trunk/reactos/lib/advapi32/advapi32.def	2005-02-11 15:52:38 UTC (rev 13493)
@@ -54,7 +54,7 @@
 ConvertSidToStringSidA@8
 ConvertSidToStringSidW@8
 CopySid@12
-;CreatePrivateObjectSecurity@24
+CreatePrivateObjectSecurity@24
 CreateProcessAsUserA@44
 CreateProcessAsUserW@44
 CreateServiceA@52
@@ -93,7 +93,7 @@
 ;DenyAccessRightsA
 ;DenyAccessRightsW
 DeregisterEventSource@4
-;DestroyPrivateObjectSecurity@4
+DestroyPrivateObjectSecurity@4
 DuplicateToken@12
 DuplicateTokenEx@24
 ;ElfBackupEventLogFileA@8
@@ -157,7 +157,7 @@
 GetNamedSecurityInfoW@32
 GetNumberOfEventLogRecords@8
 GetOldestEventLogRecord@8
-;GetPrivateObjectSecurity@20
+GetPrivateObjectSecurity@20
 GetSecurityDescriptorControl@12
 GetSecurityDescriptorDacl@16
 GetSecurityDescriptorGroup@12
@@ -379,7 +379,8 @@
 SetKernelObjectSecurity@12
 SetNamedSecurityInfoA@28
 SetNamedSecurityInfoW@28
-;SetPrivateObjectSecurity@20
+SetPrivateObjectSecurity@20
+SetSecurityDescriptorControl@12
 SetSecurityDescriptorDacl@16
 SetSecurityDescriptorGroup@12
 SetSecurityDescriptorOwner@12

Modified: trunk/reactos/lib/advapi32/sec/sec.c
--- trunk/reactos/lib/advapi32/sec/sec.c	2005-02-11 12:06:29 UTC (rev 13492)
+++ trunk/reactos/lib/advapi32/sec/sec.c	2005-02-11 15:52:38 UTC (rev 13493)
@@ -124,7 +124,7 @@
 	PSECURITY_DESCRIPTOR	pSecurityDescriptor,
 	PSID			*pOwner,
 	LPBOOL			lpbOwnerDefaulted
-)
+	)
 {
 	BOOLEAN OwnerDefaulted;
 	NTSTATUS Status;
@@ -147,6 +147,23 @@
 /*
  * @implemented
  */
+DWORD
+STDCALL
+GetSecurityDescriptorRMControl (
+	PSECURITY_DESCRIPTOR	SecurityDescriptor,
+	PUCHAR			RMControl)
+{
+  if (!RtlGetSecurityDescriptorRMControl(SecurityDescriptor,
+					 RMControl))
+    return ERROR_INVALID_DATA;
+
+  return ERROR_SUCCESS;
+}
+
+
+/*
+ * @implemented
+ */
 BOOL
 STDCALL
 GetSecurityDescriptorSacl (
@@ -293,6 +310,31 @@
  */
 BOOL
 STDCALL
+SetSecurityDescriptorControl (
+	PSECURITY_DESCRIPTOR		pSecurityDescriptor,
+	SECURITY_DESCRIPTOR_CONTROL	ControlBitsOfInterest,
+	SECURITY_DESCRIPTOR_CONTROL	ControlBitsToSet)
+{
+	NTSTATUS Status;
+
+	Status = RtlSetControlSecurityDescriptor(pSecurityDescriptor,
+	                                         ControlBitsOfInterest,
+	                                         ControlBitsToSet);
+	if (!NT_SUCCESS(Status))
+	{
+		SetLastError (RtlNtStatusToDosError (Status));
+		return FALSE;
+	}
+
+	return TRUE;
+}
+
+
+/*
+ * @implemented
+ */
+BOOL
+STDCALL
 SetSecurityDescriptorDacl (
 	PSECURITY_DESCRIPTOR	pSecurityDescriptor,
 	BOOL			bDaclPresent,
@@ -371,6 +413,22 @@
 /*
  * @implemented
  */
+DWORD
+STDCALL
+SetSecurityDescriptorRMControl (
+	PSECURITY_DESCRIPTOR	SecurityDescriptor,
+	PUCHAR			RMControl)
+{
+  RtlSetSecurityDescriptorRMControl(SecurityDescriptor,
+				    RMControl);
+
+  return ERROR_SUCCESS;
+}
+
+
+/*
+ * @implemented
+ */
 BOOL
 STDCALL
 SetSecurityDescriptorSacl (

Modified: trunk/reactos/lib/ntdll/def/ntdll.def
--- trunk/reactos/lib/ntdll/def/ntdll.def	2005-02-11 12:06:29 UTC (rev 13492)
+++ trunk/reactos/lib/ntdll/def/ntdll.def	2005-02-11 15:52:38 UTC (rev 13493)
@@ -369,8 +369,6 @@
 RtlDeleteAce@8
 RtlDeleteAtomFromAtomTable@8
 RtlDeleteCriticalSection@4
-RtlDuplicateUnicodeString@12
-RtlSetCriticalSectionSpinCount@8
 ;RtlDeleteElementGenericTable
 ;RtlDeleteNoSplay
 RtlDeleteOwnersRanges@8
@@ -394,6 +392,7 @@
 RtlDowncaseUnicodeChar@4
 RtlDowncaseUnicodeString@12
 RtlDumpResource@4
+RtlDuplicateUnicodeString@12
 RtlEmptyAtomTable@8
 RtlEnlargedIntegerMultiply@8
 RtlEnlargedUnsignedDivide@16
@@ -462,6 +461,7 @@
 RtlGetOwnerSecurityDescriptor@12
 RtlGetProcessHeaps@8
 RtlGetSaclSecurityDescriptor@16
+RtlGetSecurityDescriptorRMControl@8
 ;RtlGetUserInfoHeap
 RtlGetVersion@4
 RtlIdentifierAuthoritySid@4
@@ -586,6 +586,7 @@
 ;RtlSetAttributesSecurityDescriptor
 RtlSetBits@12
 RtlSetControlSecurityDescriptor@12
+RtlSetCriticalSectionSpinCount@8
 RtlSetCurrentDirectory_U@4
 RtlSetCurrentEnvironment@8
 RtlSetDaclSecurityDescriptor@16
@@ -594,6 +595,7 @@
 RtlSetInformationAcl@16
 RtlSetOwnerSecurityDescriptor@12
 RtlSetSaclSecurityDescriptor@16
+RtlSetSecurityDescriptorRMControl@8
 ;RtlSetSecurityObject
 RtlSetTimeZoneInformation@4
 ;RtlSetUnicodeCallouts

Modified: trunk/reactos/lib/rtl/sd.c
--- trunk/reactos/lib/rtl/sd.c	2005-02-11 12:06:29 UTC (rev 13492)
+++ trunk/reactos/lib/rtl/sd.c	2005-02-11 15:52:38 UTC (rev 13493)
@@ -789,8 +789,8 @@
 
 
 /*
-* @unimplemented
-*/
+ * @unimplemented
+ */
 NTSTATUS STDCALL
 RtlSelfRelativeToAbsoluteSD2(PSECURITY_DESCRIPTOR SelfRelativeSecurityDescriptor,
                              PULONG BufferSize)
@@ -870,4 +870,43 @@
    return TRUE;
 }
 
+
+/*
+ * @implemented
+ */
+BOOLEAN STDCALL
+RtlGetSecurityDescriptorRMControl(PSECURITY_DESCRIPTOR SecurityDescriptor,
+                                  PUCHAR RMControl)
+{
+  if (!(SecurityDescriptor->Control & SE_RM_CONTROL_VALID))
+  {
+    *RMControl = 0;
+    return FALSE;
+  }
+
+  *RMControl = SecurityDescriptor->Sbz1;
+
+  return TRUE;
+}
+
+
+/*
+ * @implemented
+ */
+VOID STDCALL
+RtlSetSecurityDescriptorRMControl(PSECURITY_DESCRIPTOR SecurityDescriptor,
+                                  PUCHAR RMControl)
+{
+  if (RMControl == NULL)
+  {
+    SecurityDescriptor->Control &= ~SE_RM_CONTROL_VALID;
+    SecurityDescriptor->Sbz1 = 0;
+  }
+  else
+  {
+    SecurityDescriptor->Control |= SE_RM_CONTROL_VALID;
+    SecurityDescriptor->Sbz1 = *RMControl;
+  }
+}
+
 /* EOF */

Modified: trunk/reactos/w32api/include/winbase.h
--- trunk/reactos/w32api/include/winbase.h	2005-02-11 12:06:29 UTC (rev 13492)
+++ trunk/reactos/w32api/include/winbase.h	2005-02-11 15:52:38 UTC (rev 13493)
@@ -1457,6 +1457,7 @@
 BOOL WINAPI GetSecurityDescriptorGroup(PSECURITY_DESCRIPTOR,PSID*,LPBOOL);
 DWORD WINAPI GetSecurityDescriptorLength(PSECURITY_DESCRIPTOR);
 BOOL WINAPI GetSecurityDescriptorOwner(PSECURITY_DESCRIPTOR,PSID*,LPBOOL);
+DWORD WINAPI GetSecurityDescriptorRMControl(PSECURITY_DESCRIPTOR,PUCHAR);
 BOOL WINAPI GetSecurityDescriptorSacl(PSECURITY_DESCRIPTOR,LPBOOL,PACL*,LPBOOL);
 DWORD WINAPI GetShortPathNameA(LPCSTR,LPSTR,DWORD);
 DWORD WINAPI GetShortPathNameW(LPCWSTR,LPWSTR,DWORD);
@@ -1835,6 +1836,7 @@
 BOOL WINAPI SetSecurityDescriptorDacl(PSECURITY_DESCRIPTOR,BOOL,PACL,BOOL);
 BOOL WINAPI SetSecurityDescriptorGroup(PSECURITY_DESCRIPTOR,PSID,BOOL);
 BOOL WINAPI SetSecurityDescriptorOwner(PSECURITY_DESCRIPTOR,PSID,BOOL);
+DWORD WINAPI SetSecurityDescriptorRMControl(PSECURITY_DESCRIPTOR,PUCHAR);
 BOOL WINAPI SetSecurityDescriptorSacl(PSECURITY_DESCRIPTOR,BOOL,PACL,BOOL);
 BOOL WINAPI SetStdHandle(DWORD,HANDLE);
 #define SetSwapAreaSize(w) (w)