4 * Copyright 1996 Marcus Meissner
21 /**************************************************************************
22 * RtlLengthRequiredSid [NTDLL]
24 DWORD WINAPI RtlLengthRequiredSid(DWORD nrofsubauths)
26 return sizeof(DWORD)*nrofsubauths+sizeof(SID);
29 /**************************************************************************
30 * RtlLengthSid [NTDLL]
32 DWORD WINAPI RtlLengthSid(LPSID sid)
34 return sizeof(DWORD)*sid->SubAuthorityCount+sizeof(SID);
37 /**************************************************************************
38 * RtlCreateAcl [NTDLL]
41 * This should return NTSTATUS
43 DWORD WINAPI RtlCreateAcl(LPACL acl,DWORD size,DWORD rev)
45 if (rev!=ACL_REVISION)
46 return STATUS_INVALID_PARAMETER;
48 return STATUS_BUFFER_TOO_SMALL;
50 return STATUS_INVALID_PARAMETER;
52 memset(acl,'\0',sizeof(ACL));
53 acl->AclRevision = rev;
59 /**************************************************************************
60 * RtlFirstFreeAce [NTDLL]
61 * looks for the AceCount+1 ACE, and if it is still within the alloced
62 * ACL, return a pointer to it
64 BOOL32 WINAPI RtlFirstFreeAce(LPACL acl,LPACE_HEADER *x)
70 ace = (LPACE_HEADER)(acl+1);
71 for (i=0;i<acl->AceCount;i++) {
72 if ((DWORD)ace>=(((DWORD)acl)+acl->AclSize))
74 ace = (LPACE_HEADER)(((BYTE*)ace)+ace->AceSize);
76 if ((DWORD)ace>=(((DWORD)acl)+acl->AclSize))
82 /**************************************************************************
85 DWORD /* NTSTATUS */ WINAPI RtlAddAce(LPACL acl,DWORD rev,DWORD xnrofaces,
86 LPACE_HEADER acestart,DWORD acelen)
88 LPACE_HEADER ace,targetace;
91 if (acl->AclRevision != ACL_REVISION)
92 return STATUS_INVALID_PARAMETER;
93 if (!RtlFirstFreeAce(acl,&targetace))
94 return STATUS_INVALID_PARAMETER;
95 nrofaces=0;ace=acestart;
96 while (((DWORD)ace-(DWORD)acestart)<acelen) {
98 ace = (LPACE_HEADER)(((BYTE*)ace)+ace->AceSize);
100 if ((DWORD)targetace+acelen>(DWORD)acl+acl->AclSize) /* too much aces */
101 return STATUS_INVALID_PARAMETER;
102 memcpy((LPBYTE)targetace,acestart,acelen);
103 acl->AceCount+=nrofaces;
107 /**************************************************************************
108 * RtlCreateSecurityDescriptor [NTDLL]
110 DWORD /* NTSTATUS */ WINAPI RtlCreateSecurityDescriptor(LPSECURITY_DESCRIPTOR lpsd,DWORD rev)
112 if (rev!=SECURITY_DESCRIPTOR_REVISION)
113 return STATUS_UNKNOWN_REVISION;
114 memset(lpsd,'\0',sizeof(*lpsd));
115 lpsd->Revision = SECURITY_DESCRIPTOR_REVISION;
119 /**************************************************************************
120 * RtlSetDaclSecurityDescriptor [NTDLL]
122 DWORD /* NTSTATUS */ WINAPI RtlSetDaclSecurityDescriptor ( LPSECURITY_DESCRIPTOR lpsd,BOOL32 daclpresent,LPACL dacl,BOOL32 dacldefaulted )
124 if (lpsd->Revision!=SECURITY_DESCRIPTOR_REVISION)
125 return STATUS_UNKNOWN_REVISION;
126 if (lpsd->Control & SE_SELF_RELATIVE)
127 return STATUS_INVALID_SECURITY_DESCR;
129 lpsd->Control &= ~SE_DACL_PRESENT;
132 lpsd->Control |= SE_DACL_PRESENT;
135 lpsd->Control |= SE_DACL_DEFAULTED;
137 lpsd->Control &= ~SE_DACL_DEFAULTED;
141 /**************************************************************************
142 * RtlSetSaclSecurityDescriptor [NTDLL]
144 DWORD /* NTSTATUS */ WINAPI RtlSetSaclSecurityDescriptor (
145 LPSECURITY_DESCRIPTOR lpsd,BOOL32 saclpresent,LPACL sacl,BOOL32 sacldefaulted
148 if (lpsd->Revision!=SECURITY_DESCRIPTOR_REVISION)
149 return STATUS_UNKNOWN_REVISION;
150 if (lpsd->Control & SE_SELF_RELATIVE)
151 return STATUS_INVALID_SECURITY_DESCR;
153 lpsd->Control &= ~SE_SACL_PRESENT;
156 lpsd->Control |= SE_SACL_PRESENT;
159 lpsd->Control |= SE_SACL_DEFAULTED;
161 lpsd->Control &= ~SE_SACL_DEFAULTED;
165 /**************************************************************************
166 * RtlSetOwnerSecurityDescriptor [NTDLL]
168 DWORD /* NTSTATUS */ WINAPI RtlSetOwnerSecurityDescriptor (LPSECURITY_DESCRIPTOR lpsd,LPSID owner,BOOL32 ownerdefaulted)
170 if (lpsd->Revision!=SECURITY_DESCRIPTOR_REVISION)
171 return STATUS_UNKNOWN_REVISION;
172 if (lpsd->Control & SE_SELF_RELATIVE)
173 return STATUS_INVALID_SECURITY_DESCR;
177 lpsd->Control |= SE_OWNER_DEFAULTED;
179 lpsd->Control &= ~SE_OWNER_DEFAULTED;
183 /**************************************************************************
184 * RtlSetOwnerSecurityDescriptor [NTDLL]
186 DWORD /* NTSTATUS */ WINAPI RtlSetGroupSecurityDescriptor (LPSECURITY_DESCRIPTOR lpsd,LPSID group,BOOL32 groupdefaulted)
188 if (lpsd->Revision!=SECURITY_DESCRIPTOR_REVISION)
189 return STATUS_UNKNOWN_REVISION;
190 if (lpsd->Control & SE_SELF_RELATIVE)
191 return STATUS_INVALID_SECURITY_DESCR;
195 lpsd->Control |= SE_GROUP_DEFAULTED;
197 lpsd->Control &= ~SE_GROUP_DEFAULTED;
202 /**************************************************************************
203 * RtlNormalizeProcessParams [NTDLL]
205 LPVOID WINAPI RtlNormalizeProcessParams(LPVOID x)
207 FIXME(ntdll,"(%p), stub.\n",x);
211 /**************************************************************************
212 * RtlInitializeSid [NTDLL]
214 DWORD WINAPI RtlInitializeSid(LPSID lpsid,LPSID_IDENTIFIER_AUTHORITY lpsidauth,
219 if (a>=SID_MAX_SUB_AUTHORITIES)
221 lpsid->SubAuthorityCount = a;
222 lpsid->Revision = SID_REVISION;
223 memcpy(&(lpsid->IdentifierAuthority),lpsidauth,sizeof(SID_IDENTIFIER_AUTHORITY));
227 /**************************************************************************
228 * RtlSubAuthoritySid [NTDLL]
230 LPDWORD WINAPI RtlSubAuthoritySid(LPSID lpsid,DWORD nr)
232 return &(lpsid->SubAuthority[nr]);
235 /**************************************************************************
236 * RtlSubAuthorityCountSid [NTDLL]
238 LPBYTE WINAPI RtlSubAuthorityCountSid(LPSID lpsid)
240 return ((LPBYTE)lpsid)+1;
243 /**************************************************************************
246 DWORD WINAPI RtlCopySid(DWORD len,LPSID to,LPSID from)
248 if (len<(from->SubAuthorityCount*4+8))
249 return STATUS_BUFFER_TOO_SMALL;
250 memmove(to,from,from->SubAuthorityCount*4+8);
251 return STATUS_SUCCESS;
254 /**************************************************************************
255 * RtlAnsiStringToUnicodeString [NTDLL]
257 DWORD /* NTSTATUS */ WINAPI RtlAnsiStringToUnicodeString(LPUNICODE_STRING uni,LPANSI_STRING ansi,BOOL32 doalloc)
259 DWORD unilen = (ansi->Length+1)*sizeof(WCHAR);
262 return STATUS_INVALID_PARAMETER_2;
263 uni->Length = unilen;
265 uni->MaximumLength = unilen;
266 uni->Buffer = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,unilen);
268 return STATUS_NO_MEMORY;
270 if (unilen>uni->MaximumLength)
271 return STATUS_BUFFER_OVERFLOW;
272 lstrcpynAtoW(uni->Buffer,ansi->Buffer,unilen/2);
273 return STATUS_SUCCESS;
276 /**************************************************************************
277 * RtlOemStringToUnicodeString [NTDLL]
279 DWORD /* NTSTATUS */ WINAPI RtlOemStringToUnicodeString(LPUNICODE_STRING uni,LPSTRING ansi,BOOL32 doalloc)
281 DWORD unilen = (ansi->Length+1)*sizeof(WCHAR);
284 return STATUS_INVALID_PARAMETER_2;
285 uni->Length = unilen;
287 uni->MaximumLength = unilen;
288 uni->Buffer = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,unilen);
290 return STATUS_NO_MEMORY;
292 if (unilen>uni->MaximumLength)
293 return STATUS_BUFFER_OVERFLOW;
294 lstrcpynAtoW(uni->Buffer,ansi->Buffer,unilen/2);
295 return STATUS_SUCCESS;
297 /**************************************************************************
298 * RtlMultiByteToUnicodeN [NTDLL]
299 * FIXME: multibyte support
301 DWORD /* NTSTATUS */ WINAPI RtlMultiByteToUnicodeN(LPWSTR unistr,DWORD unilen,LPDWORD reslen,LPSTR oemstr,DWORD oemlen)
309 x=(LPWSTR)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(len+1)*sizeof(WCHAR));
310 lstrcpynAtoW(x,oemstr,len+1);
311 memcpy(unistr,x,len*2);
312 if (reslen) *reslen = len*2;
316 /**************************************************************************
317 * RtlOemToUnicodeN [NTDLL]
319 DWORD /* NTSTATUS */ WINAPI RtlOemToUnicodeN(LPWSTR unistr,DWORD unilen,LPDWORD reslen,LPSTR oemstr,DWORD oemlen)
327 x=(LPWSTR)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(len+1)*sizeof(WCHAR));
328 lstrcpynAtoW(x,oemstr,len+1);
329 memcpy(unistr,x,len*2);
330 if (reslen) *reslen = len*2;
334 /**************************************************************************
335 * RtlInitString [NTDLL]
337 VOID WINAPI RtlInitAnsiString(LPANSI_STRING target,LPCSTR source)
339 target->Length = target->MaximumLength = 0;
340 target->Buffer = (LPSTR)source;
343 target->Length = lstrlen32A(target->Buffer);
344 target->MaximumLength = target->Length+1;
346 /**************************************************************************
347 * RtlInitString [NTDLL]
349 VOID WINAPI RtlInitString(LPSTRING target,LPCSTR source)
351 target->Length = target->MaximumLength = 0;
352 target->Buffer = (LPSTR)source;
355 target->Length = lstrlen32A(target->Buffer);
356 target->MaximumLength = target->Length+1;
359 /**************************************************************************
360 * RtlInitUnicodeString [NTDLL]
362 VOID WINAPI RtlInitUnicodeString(LPUNICODE_STRING target,LPCWSTR source)
364 target->Length = target->MaximumLength = 0;
365 target->Buffer = (LPWSTR)source;
368 target->Length = lstrlen32W(target->Buffer)*2;
369 target->MaximumLength = target->Length+2;
372 /**************************************************************************
373 * RtlFreeUnicodeString [NTDLL]
375 VOID WINAPI RtlFreeUnicodeString(LPUNICODE_STRING str)
378 HeapFree(GetProcessHeap(),0,str->Buffer);
381 /**************************************************************************
382 * RtlUnicodeToOemN [NTDLL]
384 DWORD /* NTSTATUS */ WINAPI RtlUnicodeToOemN(LPSTR oemstr,DWORD oemlen,LPDWORD reslen,LPWSTR unistr,DWORD unilen)
392 x=(LPSTR)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,len+1);
393 lstrcpynWtoA(x,unistr,len+1);
394 memcpy(oemstr,x,len);
395 if (reslen) *reslen = len;
399 /**************************************************************************
400 * RtlUnicodeStringToOemString [NTDLL]
402 DWORD /* NTSTATUS */ WINAPI RtlUnicodeStringToOemString(LPANSI_STRING oem,LPUNICODE_STRING uni,BOOL32 alloc)
405 oem->Buffer = (LPSTR)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,uni->Length/2)+1;
406 oem->MaximumLength = uni->Length/2+1;
408 oem->Length = uni->Length/2;
409 lstrcpynWtoA(oem->Buffer,uni->Buffer,uni->Length/2+1);
413 /**************************************************************************
414 * RtlUnicodeStringToAnsiString [NTDLL]
416 DWORD /* NTSTATUS */ WINAPI RtlUnicodeStringToAnsiString(LPUNICODE_STRING uni,LPANSI_STRING oem,BOOL32 alloc)
419 oem->Buffer = (LPSTR)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,uni->Length/2)+1;
420 oem->MaximumLength = uni->Length/2+1;
422 oem->Length = uni->Length/2;
423 lstrcpynWtoA(oem->Buffer,uni->Buffer,uni->Length/2+1);
427 /**************************************************************************
428 * RtlNtStatusToDosErro [NTDLL]
430 DWORD WINAPI RtlNtStatusToDosError(DWORD error)
432 /* FIXME: map STATUS_ to ERROR_ */
436 /**************************************************************************
437 * RtlGetNtProductType [NTDLL]
439 DWORD WINAPI RtlGetNtProductType(LPVOID x)
441 /* FIXME : find documentation for this one */
445 /**************************************************************************
446 * RtlUpcaseUnicodeString [NTDLL]
448 DWORD WINAPI RtlUpcaseUnicodeString(LPUNICODE_STRING dest,LPUNICODE_STRING src,BOOL32 doalloc)
455 dest->MaximumLength = len;
456 dest->Buffer = (LPWSTR)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,len);
458 return STATUS_NO_MEMORY;
461 if (dest->MaximumLength < len)
462 return STATUS_BUFFER_OVERFLOW;
463 s=dest->Buffer;t=src->Buffer;
464 /* len is in bytes */
465 for (i=0;i<len/2;i++)
467 return STATUS_SUCCESS;
470 /**************************************************************************
471 * RtlxOemStringToUnicodeSize [NTDLL]
473 UINT32 WINAPI RtlxOemStringToUnicodeSize(LPSTRING str)
475 return str->Length*2+2;
478 /**************************************************************************
479 * RtlxAnsiStringToUnicodeSize [NTDLL]
481 UINT32 WINAPI RtlxAnsiStringToUnicodeSize(LPANSI_STRING str)
483 return str->Length*2+2;
486 /**************************************************************************
487 * RtlDosPathNameToNtPathName_U [NTDLL]
489 * FIXME: convert to UNC or whatever is expected here
491 BOOL32 WINAPI RtlDosPathNameToNtPathName_U(
492 LPWSTR from,LPUNICODE_STRING us,DWORD x2,DWORD x3)
494 LPSTR fromA = HEAP_strdupWtoA(GetProcessHeap(),0,from);
496 FIXME(ntdll,"(%s,%p,%08lx,%08lx)\n",fromA,us,x2,x3);
498 RtlInitUnicodeString(us,HEAP_strdupW(GetProcessHeap(),0,from));
502 /**************************************************************************
505 DWORD WINAPI NtOpenFile(DWORD x1,DWORD flags,DWORD x3,DWORD x4,DWORD alignment,DWORD x6)
507 FIXME(ntdll,"(%08lx,%08lx,%08lx,%08lx,%08lx,%08lx)\n",
508 x1,flags,x3,x4,alignment,x6);
509 /* returns file io completion status */
514 /**************************************************************************
515 * NTDLL_chkstk (NTDLL.862)
517 void NTDLL_chkstk(void)
519 /* FIXME: should subtract %eax bytes from stack pointer */