3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * PURPOSE: Security manager
6 * FILE: lib/ntdll/rtl/sid.c
7 * PROGRAMER: David Welch <welch@cwcom.net>
9 * 26/07/98: Added stubs for security functions
12 /* INCLUDES *****************************************************************/
14 #include <ddk/ntddk.h>
17 //#include <internal/debug.h>
19 /* FUNCTIONS ***************************************************************/
22 RtlValidSid(IN PSID Sid)
24 if ((Sid->Revision & 0xf) != 1)
28 if (Sid->SubAuthorityCount > 15)
37 RtlLengthRequiredSid(IN UCHAR SubAuthorityCount)
39 return(sizeof(SID) + (SubAuthorityCount - 1) * sizeof(ULONG));
44 RtlInitializeSid(IN PSID Sid,
45 IN PSID_IDENTIFIER_AUTHORITY IdentifierAuthority,
46 IN UCHAR SubAuthorityCount)
49 Sid->SubAuthorityCount = SubAuthorityCount;
50 memcpy(&Sid->IdentifierAuthority,
52 sizeof(SID_IDENTIFIER_AUTHORITY));
53 return(STATUS_SUCCESS);
58 RtlSubAuthoritySid(IN PSID Sid,
59 IN ULONG SubAuthority)
61 return(&Sid->SubAuthority[SubAuthority]);
66 RtlSubAuthorityCountSid(IN PSID Sid)
68 return(&Sid->SubAuthorityCount);
73 RtlEqualSid(IN PSID Sid1,
76 if (Sid1->Revision != Sid2->Revision)
80 if ((*RtlSubAuthorityCountSid(Sid1)) != (*RtlSubAuthorityCountSid(Sid2)))
84 if (memcmp(Sid1, Sid2, RtlLengthSid(Sid1)) != 0)
93 RtlLengthSid(IN PSID Sid)
95 return(sizeof(SID) + (Sid->SubAuthorityCount-1)*4);
100 RtlCopySid(ULONG BufferLength,
104 if (BufferLength < RtlLengthSid(Src))
106 return(STATUS_UNSUCCESSFUL);
111 return(STATUS_SUCCESS);
116 RtlCopySidAndAttributesArray(ULONG Count,
117 PSID_AND_ATTRIBUTES Src,
119 PSID_AND_ATTRIBUTES Dest,
121 PVOID* RemainingSidArea,
122 PULONG RemainingSidAreaSize)
128 Length = SidAreaSize;
130 for (i=0; i<Count; i++)
132 if (RtlLengthSid(Src[i].Sid) > Length)
134 return(STATUS_BUFFER_TOO_SMALL);
136 SidLength = RtlLengthSid(Src[i].Sid);
137 Length = Length - SidLength;
138 Dest[i].Sid = SidArea;
139 Dest[i].Attributes = Src[i].Attributes;
140 RtlCopySid(SidLength,
143 SidArea = SidArea + SidLength;
145 *RemainingSidArea = SidArea;
146 *RemainingSidAreaSize = Length;
147 return(STATUS_SUCCESS);
151 PSID_IDENTIFIER_AUTHORITY STDCALL
152 RtlIdentifierAuthoritySid(IN PSID Sid)
154 return(&Sid->IdentifierAuthority);
160 RtlAllocateAndInitializeSid (
161 PSID_IDENTIFIER_AUTHORITY IdentifierAuthority,
162 UCHAR SubAuthorityCount,
176 if (SubAuthorityCount > 8)
177 return STATUS_INVALID_SID;
180 return STATUS_INVALID_PARAMETER;
182 pSid = (PSID)RtlAllocateHeap (RtlGetProcessHeap (),
184 SubAuthorityCount * sizeof(DWORD) + 8);
186 return STATUS_NO_MEMORY;
189 pSid->SubAuthorityCount = SubAuthorityCount;
190 memcpy (&pSid->IdentifierAuthority,
192 sizeof(SID_IDENTIFIER_AUTHORITY));
194 switch (SubAuthorityCount)
197 pSid->SubAuthority[7] = SubAuthority7;
199 pSid->SubAuthority[6] = SubAuthority6;
201 pSid->SubAuthority[5] = SubAuthority5;
203 pSid->SubAuthority[4] = SubAuthority4;
205 pSid->SubAuthority[3] = SubAuthority3;
207 pSid->SubAuthority[2] = SubAuthority2;
209 pSid->SubAuthority[1] = SubAuthority1;
211 pSid->SubAuthority[0] = SubAuthority0;
217 return STATUS_SUCCESS;
222 RtlFreeSid(IN PSID Sid)
224 RtlFreeHeap(RtlGetProcessHeap(),
232 RtlEqualPrefixSid(IN PSID Sid1,
235 return(Sid1->SubAuthorityCount == Sid2->SubAuthorityCount &&
237 (Sid1->SubAuthorityCount - 1) * sizeof(DWORD) + 8));
242 RtlConvertSidToUnicodeString(PUNICODE_STRING String,
244 BOOLEAN AllocateBuffer)
251 if (RtlValidSid (Sid) == FALSE)
252 return STATUS_INVALID_SID;
255 wcs += swprintf (wcs, L"S-%u-", Sid->Revision);
256 if (!Sid->IdentifierAuthority.Value[0] &&
257 !Sid->IdentifierAuthority.Value[1])
259 wcs += swprintf (wcs,
261 (DWORD)Sid->IdentifierAuthority.Value[2] << 24 |
262 (DWORD)Sid->IdentifierAuthority.Value[3] << 16 |
263 (DWORD)Sid->IdentifierAuthority.Value[4] << 8 |
264 (DWORD)Sid->IdentifierAuthority.Value[5]);
268 wcs += swprintf (wcs,
269 L"0x%02hx%02hx%02hx%02hx%02hx%02hx",
270 Sid->IdentifierAuthority.Value[0],
271 Sid->IdentifierAuthority.Value[1],
272 Sid->IdentifierAuthority.Value[2],
273 Sid->IdentifierAuthority.Value[3],
274 Sid->IdentifierAuthority.Value[4],
275 Sid->IdentifierAuthority.Value[5]);
278 for (i = 0; i < Sid->SubAuthorityCount; i++)
280 wcs += swprintf (wcs,
282 Sid->SubAuthority[0]);
285 Length = (wcs - Buffer) * sizeof(WCHAR);
288 String->Buffer = RtlAllocateHeap (RtlGetProcessHeap (),
290 Length + sizeof(WCHAR));
291 if (String->Buffer == NULL)
292 return STATUS_NO_MEMORY;
293 String->MaximumLength = Length + sizeof(WCHAR);
297 if (Length > String->MaximumLength)
298 return STATUS_BUFFER_TOO_SMALL;
301 String->Length = Length;
302 memmove (String->Buffer,
305 if (Length < String->MaximumLength)
306 String->Buffer[Length] = 0;
308 return STATUS_SUCCESS;