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);
49 /* FIXME: This function is somehow buggy, at least it uses '0xfc' mask
50 * instead of '0xFFFFFFFC' mask as sometimes there are PAGE_SIZE sized structures.
53 RtlLengthSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor)
61 Length = sizeof(SECURITY_DESCRIPTOR);
63 if (SecurityDescriptor->Owner != NULL)
65 Owner = SecurityDescriptor->Owner;
66 if (SecurityDescriptor->Control & SE_SELF_RELATIVE)
68 Owner = (PSID)((ULONG)Owner +
69 (ULONG)SecurityDescriptor);
71 Length = Length + ((sizeof(SID) + (Owner->SubAuthorityCount - 1) *
72 sizeof(ULONG) + 3) & 0xfc);
74 if (SecurityDescriptor->Group != NULL)
76 Group = SecurityDescriptor->Group;
77 if (SecurityDescriptor->Control & SE_SELF_RELATIVE)
79 Group = (PSID)((ULONG)Group + (ULONG)SecurityDescriptor);
81 Length = Length + ((sizeof(SID) + (Group->SubAuthorityCount - 1) *
82 sizeof(ULONG) + 3) & 0xfc);
84 if (SecurityDescriptor->Control & SE_DACL_PRESENT &&
85 SecurityDescriptor->Dacl != NULL)
87 Dacl = SecurityDescriptor->Dacl;
88 if (SecurityDescriptor->Control & SE_SELF_RELATIVE)
90 Dacl = (PACL)((ULONG)Dacl + (PVOID)SecurityDescriptor);
92 Length = Length + ((Dacl->AclSize + 3) & 0xfc);
94 if (SecurityDescriptor->Control & SE_SACL_PRESENT &&
95 SecurityDescriptor->Sacl != NULL)
97 Sacl = SecurityDescriptor->Sacl;
98 if (SecurityDescriptor->Control & SE_SELF_RELATIVE)
100 Sacl = (PACL)((ULONG)Sacl + (PVOID)SecurityDescriptor);
102 Length = Length + ((Sacl->AclSize + 3) & 0xfc);
109 RtlGetDaclSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor,
110 PBOOLEAN DaclPresent,
112 PBOOLEAN DaclDefaulted)
114 if (SecurityDescriptor->Revision != 1)
116 return(STATUS_UNSUCCESSFUL);
118 if (!(SecurityDescriptor->Control & SE_DACL_PRESENT))
121 return(STATUS_SUCCESS);
124 if (SecurityDescriptor->Dacl == NULL)
130 if (SecurityDescriptor->Control & SE_SELF_RELATIVE)
132 *Dacl = (PACL)((ULONG)SecurityDescriptor->Dacl +
133 (PVOID)SecurityDescriptor);
137 *Dacl = SecurityDescriptor->Dacl;
140 if (SecurityDescriptor->Control & SE_DACL_DEFAULTED)
148 return(STATUS_SUCCESS);
151 #endif /* LIBCAPTIVE */
154 RtlSetDaclSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor,
157 BOOLEAN DaclDefaulted)
159 if (SecurityDescriptor->Revision != 1)
161 return(STATUS_UNSUCCESSFUL);
163 if (SecurityDescriptor->Control & SE_SELF_RELATIVE)
165 return(STATUS_UNSUCCESSFUL);
169 SecurityDescriptor->Control = SecurityDescriptor->Control & ~(SE_DACL_PRESENT);
170 return(STATUS_SUCCESS);
172 SecurityDescriptor->Control = SecurityDescriptor->Control | SE_DACL_PRESENT;
173 SecurityDescriptor->Dacl = Dacl;
174 SecurityDescriptor->Control = SecurityDescriptor->Control & ~(SE_DACL_DEFAULTED);
177 SecurityDescriptor->Control = SecurityDescriptor->Control | SE_DACL_DEFAULTED;
179 return(STATUS_SUCCESS);
185 RtlValidSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor)
192 RtlSetOwnerSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor,
194 BOOLEAN OwnerDefaulted)
196 if (SecurityDescriptor->Revision != 1)
198 return(STATUS_UNSUCCESSFUL);
200 if (SecurityDescriptor->Control & SE_SELF_RELATIVE)
202 return(STATUS_UNSUCCESSFUL);
204 SecurityDescriptor->Owner = Owner;
205 SecurityDescriptor->Control = SecurityDescriptor->Control & ~(SE_OWNER_DEFAULTED);
208 SecurityDescriptor->Control = SecurityDescriptor->Control | SE_OWNER_DEFAULTED;
210 return(STATUS_SUCCESS);
215 RtlGetOwnerSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor,
217 PBOOLEAN OwnerDefaulted)
219 if (SecurityDescriptor->Revision != 1)
221 return(STATUS_UNSUCCESSFUL);
223 if (SecurityDescriptor->Owner != NULL)
225 if (SecurityDescriptor->Control & SE_SELF_RELATIVE)
227 *Owner = (PSID)((ULONG)SecurityDescriptor->Owner +
228 (PVOID)SecurityDescriptor);
232 *Owner = SecurityDescriptor->Owner;
239 if (SecurityDescriptor->Control & SE_OWNER_DEFAULTED)
247 return(STATUS_SUCCESS);
252 RtlSetGroupSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor,
254 BOOLEAN GroupDefaulted)
256 if (SecurityDescriptor->Revision != 1)
258 return(STATUS_UNSUCCESSFUL);
260 if (SecurityDescriptor->Control & SE_SELF_RELATIVE)
262 return(STATUS_UNSUCCESSFUL);
264 SecurityDescriptor->Group = Group;
265 SecurityDescriptor->Control = SecurityDescriptor->Control & ~(SE_GROUP_DEFAULTED);
268 SecurityDescriptor->Control = SecurityDescriptor->Control | SE_GROUP_DEFAULTED;
270 return(STATUS_SUCCESS);
275 RtlGetGroupSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor,
277 PBOOLEAN GroupDefaulted)
279 if (SecurityDescriptor->Revision != 1)
281 return(STATUS_UNSUCCESSFUL);
283 if (SecurityDescriptor->Group != NULL)
285 if (SecurityDescriptor->Control & SE_SELF_RELATIVE)
287 *Group = (PSID)((ULONG)SecurityDescriptor->Group +
288 (PVOID)SecurityDescriptor);
292 *Group = SecurityDescriptor->Group;
299 if (SecurityDescriptor->Control & SE_GROUP_DEFAULTED)
307 return(STATUS_SUCCESS);
312 RtlGetSaclSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor,
313 PBOOLEAN SaclPresent,
315 PBOOLEAN SaclDefaulted)
317 if (SecurityDescriptor->Revision != 1)
319 return(STATUS_UNSUCCESSFUL);
321 if (!(SecurityDescriptor->Control & SE_SACL_PRESENT))
324 return(STATUS_SUCCESS);
327 if (SecurityDescriptor->Sacl == NULL)
333 if (SecurityDescriptor->Control & SE_SELF_RELATIVE)
335 *Sacl = (PACL)((ULONG)SecurityDescriptor->Sacl +
336 (PVOID)SecurityDescriptor);
340 *Sacl = SecurityDescriptor->Sacl;
343 if (SecurityDescriptor->Control & SE_SACL_DEFAULTED)
351 return(STATUS_SUCCESS);
356 RtlSetSaclSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor,
359 BOOLEAN SaclDefaulted)
361 if (SecurityDescriptor->Revision != 1)
363 return(STATUS_UNSUCCESSFUL);
365 if (SecurityDescriptor->Control & SE_SELF_RELATIVE)
367 return(STATUS_UNSUCCESSFUL);
371 SecurityDescriptor->Control = SecurityDescriptor->Control & ~(SE_SACL_PRESENT);
372 return(STATUS_SUCCESS);
374 SecurityDescriptor->Control = SecurityDescriptor->Control | SE_SACL_PRESENT;
375 SecurityDescriptor->Sacl = Sacl;
376 SecurityDescriptor->Control = SecurityDescriptor->Control & ~(SE_SACL_DEFAULTED);
379 SecurityDescriptor->Control = SecurityDescriptor->Control | SE_SACL_DEFAULTED;
381 return(STATUS_SUCCESS);
386 RtlAbsoluteToSelfRelativeSD(PSECURITY_DESCRIPTOR AbsSD,
387 PSECURITY_DESCRIPTOR RelSD,
390 if (AbsSD->Control & SE_SELF_RELATIVE)
391 return(STATUS_BAD_DESCRIPTOR_FORMAT);
393 // return(RtlPMakeSelfRelativeSD (AbsSD, RelSD, BufferLength));
396 return(STATUS_NOT_IMPLEMENTED);
399 #endif /* LIBCAPTIVE */