3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * PURPOSE: Security manager
7 * PROGRAMER: David Welch <welch@cwcom.net>
9 * 26/07/98: Added stubs for security functions
12 /* INCLUDES *****************************************************************/
14 #include <ddk/ntddk.h>
15 #include <internal/se.h>
17 #include <internal/debug.h>
20 /* FUNCTIONS ***************************************************************/
30 RtlCreateSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor,
34 return(STATUS_UNSUCCESSFUL);
36 SecurityDescriptor->Revision = 1;
37 SecurityDescriptor->Sbz1 = 0;
38 SecurityDescriptor->Control = 0;
39 SecurityDescriptor->Owner = NULL;
40 SecurityDescriptor->Group = NULL;
41 SecurityDescriptor->Sacl = NULL;
42 SecurityDescriptor->Dacl = NULL;
44 return(STATUS_SUCCESS);
48 RtlLengthSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor)
56 Length = sizeof(SECURITY_DESCRIPTOR);
58 if (SecurityDescriptor->Owner != NULL)
60 Owner = SecurityDescriptor->Owner;
61 if (SecurityDescriptor->Control & SE_SELF_RELATIVE)
63 Owner = (PSID)((ULONG)Owner +
64 (ULONG)SecurityDescriptor);
66 Length = Length + ((sizeof(SID) + (Owner->SubAuthorityCount - 1) *
67 sizeof(ULONG) + 3) & 0xfc);
69 if (SecurityDescriptor->Group != NULL)
71 Group = SecurityDescriptor->Group;
72 if (SecurityDescriptor->Control & SE_SELF_RELATIVE)
74 Group = (PSID)((ULONG)Group + (ULONG)SecurityDescriptor);
76 Length = Length + ((sizeof(SID) + (Group->SubAuthorityCount - 1) *
77 sizeof(ULONG) + 3) & 0xfc);
79 if (SecurityDescriptor->Control & SE_DACL_PRESENT &&
80 SecurityDescriptor->Dacl != NULL)
82 Dacl = SecurityDescriptor->Dacl;
83 if (SecurityDescriptor->Control & SE_SELF_RELATIVE)
85 Dacl = (PACL)((ULONG)Dacl + (PVOID)SecurityDescriptor);
87 Length = Length + ((Dacl->AclSize + 3) & 0xfc);
89 if (SecurityDescriptor->Control & SE_SACL_PRESENT &&
90 SecurityDescriptor->Sacl != NULL)
92 Sacl = SecurityDescriptor->Sacl;
93 if (SecurityDescriptor->Control & SE_SELF_RELATIVE)
95 Sacl = (PACL)((ULONG)Sacl + (PVOID)SecurityDescriptor);
97 Length = Length + ((Sacl->AclSize + 3) & 0xfc);
104 RtlGetDaclSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor,
105 PBOOLEAN DaclPresent,
107 PBOOLEAN DaclDefaulted)
109 if (SecurityDescriptor->Revision != 1)
111 return(STATUS_UNSUCCESSFUL);
113 if (!(SecurityDescriptor->Control & SE_DACL_PRESENT))
116 return(STATUS_SUCCESS);
119 if (SecurityDescriptor->Dacl == NULL)
125 if (SecurityDescriptor->Control & SE_SELF_RELATIVE)
127 *Dacl = (PACL)((ULONG)SecurityDescriptor->Dacl +
128 (PVOID)SecurityDescriptor);
132 *Dacl = SecurityDescriptor->Dacl;
135 if (SecurityDescriptor->Control & SE_DACL_DEFAULTED)
143 return(STATUS_SUCCESS);
148 RtlSetDaclSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor,
151 BOOLEAN DaclDefaulted)
153 if (SecurityDescriptor->Revision != 1)
155 return(STATUS_UNSUCCESSFUL);
157 if (SecurityDescriptor->Control & SE_SELF_RELATIVE)
159 return(STATUS_UNSUCCESSFUL);
163 SecurityDescriptor->Control = SecurityDescriptor->Control & ~(SE_DACL_PRESENT);
164 return(STATUS_SUCCESS);
166 SecurityDescriptor->Control = SecurityDescriptor->Control | SE_DACL_PRESENT;
167 SecurityDescriptor->Dacl = Dacl;
168 SecurityDescriptor->Control = SecurityDescriptor->Control & ~(SE_DACL_DEFAULTED);
171 SecurityDescriptor->Control = SecurityDescriptor->Control | SE_DACL_DEFAULTED;
173 return(STATUS_SUCCESS);
178 RtlValidSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor)
185 RtlSetOwnerSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor,
187 BOOLEAN OwnerDefaulted)
189 if (SecurityDescriptor->Revision != 1)
191 return(STATUS_UNSUCCESSFUL);
193 if (SecurityDescriptor->Control & SE_SELF_RELATIVE)
195 return(STATUS_UNSUCCESSFUL);
197 SecurityDescriptor->Owner = Owner;
198 SecurityDescriptor->Control = SecurityDescriptor->Control & ~(SE_OWNER_DEFAULTED);
201 SecurityDescriptor->Control = SecurityDescriptor->Control | SE_OWNER_DEFAULTED;
203 return(STATUS_SUCCESS);
208 RtlGetOwnerSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor,
210 PBOOLEAN OwnerDefaulted)
212 if (SecurityDescriptor->Revision != 1)
214 return(STATUS_UNSUCCESSFUL);
216 if (SecurityDescriptor->Owner != NULL)
218 if (SecurityDescriptor->Control & SE_SELF_RELATIVE)
220 *Owner = (PSID)((ULONG)SecurityDescriptor->Owner +
221 (PVOID)SecurityDescriptor);
225 *Owner = SecurityDescriptor->Owner;
232 if (SecurityDescriptor->Control & SE_OWNER_DEFAULTED)
240 return(STATUS_SUCCESS);
245 RtlSetGroupSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor,
247 BOOLEAN GroupDefaulted)
249 if (SecurityDescriptor->Revision != 1)
251 return(STATUS_UNSUCCESSFUL);
253 if (SecurityDescriptor->Control & SE_SELF_RELATIVE)
255 return(STATUS_UNSUCCESSFUL);
257 SecurityDescriptor->Group = Group;
258 SecurityDescriptor->Control = SecurityDescriptor->Control & ~(SE_GROUP_DEFAULTED);
261 SecurityDescriptor->Control = SecurityDescriptor->Control | SE_GROUP_DEFAULTED;
263 return(STATUS_SUCCESS);
268 RtlGetGroupSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor,
270 PBOOLEAN GroupDefaulted)
272 if (SecurityDescriptor->Revision != 1)
274 return(STATUS_UNSUCCESSFUL);
276 if (SecurityDescriptor->Group != NULL)
278 if (SecurityDescriptor->Control & SE_SELF_RELATIVE)
280 *Group = (PSID)((ULONG)SecurityDescriptor->Group +
281 (PVOID)SecurityDescriptor);
285 *Group = SecurityDescriptor->Group;
292 if (SecurityDescriptor->Control & SE_GROUP_DEFAULTED)
300 return(STATUS_SUCCESS);
305 RtlGetSaclSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor,
306 PBOOLEAN SaclPresent,
308 PBOOLEAN SaclDefaulted)
310 if (SecurityDescriptor->Revision != 1)
312 return(STATUS_UNSUCCESSFUL);
314 if (!(SecurityDescriptor->Control & SE_SACL_PRESENT))
317 return(STATUS_SUCCESS);
320 if (SecurityDescriptor->Sacl == NULL)
326 if (SecurityDescriptor->Control & SE_SELF_RELATIVE)
328 *Sacl = (PACL)((ULONG)SecurityDescriptor->Sacl +
329 (PVOID)SecurityDescriptor);
333 *Sacl = SecurityDescriptor->Sacl;
336 if (SecurityDescriptor->Control & SE_SACL_DEFAULTED)
344 return(STATUS_SUCCESS);
349 RtlSetSaclSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor,
352 BOOLEAN SaclDefaulted)
354 if (SecurityDescriptor->Revision != 1)
356 return(STATUS_UNSUCCESSFUL);
358 if (SecurityDescriptor->Control & SE_SELF_RELATIVE)
360 return(STATUS_UNSUCCESSFUL);
364 SecurityDescriptor->Control = SecurityDescriptor->Control & ~(SE_SACL_PRESENT);
365 return(STATUS_SUCCESS);
367 SecurityDescriptor->Control = SecurityDescriptor->Control | SE_SACL_PRESENT;
368 SecurityDescriptor->Sacl = Sacl;
369 SecurityDescriptor->Control = SecurityDescriptor->Control & ~(SE_SACL_DEFAULTED);
372 SecurityDescriptor->Control = SecurityDescriptor->Control | SE_SACL_DEFAULTED;
374 return(STATUS_SUCCESS);
379 RtlAbsoluteToSelfRelativeSD(PSECURITY_DESCRIPTOR AbsSD,
380 PSECURITY_DESCRIPTOR RelSD,
383 if (AbsSD->Control & SE_SELF_RELATIVE)
384 return(STATUS_BAD_DESCRIPTOR_FORMAT);
386 // return(RtlPMakeSelfRelativeSD (AbsSD, RelSD, BufferLength));
389 return(STATUS_NOT_IMPLEMENTED);