66295fbaec4c1996f8e24132c0103eff1f72550f
[reactos.git] / reactos / include / ndk / rtlfuncs.h
1 /*++ NDK Version: 0095
2
3 Copyright (c) Alex Ionescu. All rights reserved.
4
5 Header Name:
6
7 rtlfuncs.h
8
9 Abstract:
10
11 Function definitions for the Run-Time Library
12
13 Author:
14
15 Alex Ionescu (alex.ionescu@reactos.com) 06-Oct-2004
16
17 --*/
18
19 #ifndef _RTLFUNCS_H
20 #define _RTLFUNCS_H
21
22 //
23 // Dependencies
24 //
25 #include <umtypes.h>
26 #include <ntnls.h>
27 #include <extypes.h>
28 #include <rtltypes.h>
29
30 #ifdef NTOS_MODE_USER
31
32 //
33 // List Functions
34 //
35 FORCEINLINE
36 VOID
37 InitializeListHead(
38 IN PLIST_ENTRY ListHead
39 )
40 {
41 ListHead->Flink = ListHead->Blink = ListHead;
42 }
43
44 FORCEINLINE
45 VOID
46 InsertHeadList(
47 IN PLIST_ENTRY ListHead,
48 IN PLIST_ENTRY Entry
49 )
50 {
51 PLIST_ENTRY OldFlink;
52 OldFlink = ListHead->Flink;
53 Entry->Flink = OldFlink;
54 Entry->Blink = ListHead;
55 OldFlink->Blink = Entry;
56 ListHead->Flink = Entry;
57 }
58
59 FORCEINLINE
60 VOID
61 InsertTailList(
62 IN PLIST_ENTRY ListHead,
63 IN PLIST_ENTRY Entry
64 )
65 {
66 PLIST_ENTRY OldBlink;
67 OldBlink = ListHead->Blink;
68 Entry->Flink = ListHead;
69 Entry->Blink = OldBlink;
70 OldBlink->Flink = Entry;
71 ListHead->Blink = Entry;
72 }
73
74 BOOLEAN
75 FORCEINLINE
76 IsListEmpty(
77 IN const LIST_ENTRY * ListHead
78 )
79 {
80 return (BOOLEAN)(ListHead->Flink == ListHead);
81 }
82
83 FORCEINLINE
84 PSINGLE_LIST_ENTRY
85 PopEntryList(
86 PSINGLE_LIST_ENTRY ListHead
87 )
88 {
89 PSINGLE_LIST_ENTRY FirstEntry;
90 FirstEntry = ListHead->Next;
91 if (FirstEntry != NULL) {
92 ListHead->Next = FirstEntry->Next;
93 }
94
95 return FirstEntry;
96 }
97
98 FORCEINLINE
99 VOID
100 PushEntryList(
101 PSINGLE_LIST_ENTRY ListHead,
102 PSINGLE_LIST_ENTRY Entry
103 )
104 {
105 Entry->Next = ListHead->Next;
106 ListHead->Next = Entry;
107 }
108
109 FORCEINLINE
110 BOOLEAN
111 RemoveEntryList(
112 IN PLIST_ENTRY Entry)
113 {
114 PLIST_ENTRY OldFlink;
115 PLIST_ENTRY OldBlink;
116
117 OldFlink = Entry->Flink;
118 OldBlink = Entry->Blink;
119 OldFlink->Blink = OldBlink;
120 OldBlink->Flink = OldFlink;
121 return (BOOLEAN)(OldFlink == OldBlink);
122 }
123
124 FORCEINLINE
125 PLIST_ENTRY
126 RemoveHeadList(
127 IN PLIST_ENTRY ListHead)
128 {
129 PLIST_ENTRY Flink;
130 PLIST_ENTRY Entry;
131
132 Entry = ListHead->Flink;
133 Flink = Entry->Flink;
134 ListHead->Flink = Flink;
135 Flink->Blink = ListHead;
136 return Entry;
137 }
138
139 FORCEINLINE
140 PLIST_ENTRY
141 RemoveTailList(
142 IN PLIST_ENTRY ListHead)
143 {
144 PLIST_ENTRY Blink;
145 PLIST_ENTRY Entry;
146
147 Entry = ListHead->Blink;
148 Blink = Entry->Blink;
149 ListHead->Blink = Blink;
150 Blink->Flink = ListHead;
151 return Entry;
152 }
153
154 //
155 // LUID Macros
156 //
157 #define RtlEqualLuid(L1, L2) (((L1)->HighPart == (L2)->HighPart) && \
158 ((L1)->LowPart == (L2)->LowPart))
159
160 #endif
161
162 //
163 // RTL Splay Tree Functions
164 //
165 NTSYSAPI
166 PRTL_SPLAY_LINKS
167 NTAPI
168 RtlSplay(PRTL_SPLAY_LINKS Links);
169
170 NTSYSAPI
171 PRTL_SPLAY_LINKS
172 NTAPI
173 RtlDelete(PRTL_SPLAY_LINKS Links);
174
175 NTSYSAPI
176 VOID
177 NTAPI
178 RtlDeleteNoSplay(
179 PRTL_SPLAY_LINKS Links,
180 PRTL_SPLAY_LINKS *Root
181 );
182
183 NTSYSAPI
184 PRTL_SPLAY_LINKS
185 NTAPI
186 RtlSubtreeSuccessor(PRTL_SPLAY_LINKS Links);
187
188 NTSYSAPI
189 PRTL_SPLAY_LINKS
190 NTAPI
191 RtlSubtreePredecessor(PRTL_SPLAY_LINKS Links);
192
193 NTSYSAPI
194 PRTL_SPLAY_LINKS
195 NTAPI
196 RtlRealSuccessor(PRTL_SPLAY_LINKS Links);
197
198 NTSYSAPI
199 PRTL_SPLAY_LINKS
200 NTAPI
201 RtlRealPredecessor(PRTL_SPLAY_LINKS Links);
202
203 #define RtlIsLeftChild(Links) \
204 (RtlLeftChild(RtlParent(Links)) == (PRTL_SPLAY_LINKS)(Links))
205
206 #define RtlIsRightChild(Links) \
207 (RtlRightChild(RtlParent(Links)) == (PRTL_SPLAY_LINKS)(Links))
208
209 #define RtlRightChild(Links) \
210 ((PRTL_SPLAY_LINKS)(Links))->RightChild
211
212 #define RtlIsRoot(Links) \
213 (RtlParent(Links) == (PRTL_SPLAY_LINKS)(Links))
214
215 #define RtlLeftChild(Links) \
216 ((PRTL_SPLAY_LINKS)(Links))->LeftChild
217
218 #define RtlParent(Links) \
219 ((PRTL_SPLAY_LINKS)(Links))->Parent
220
221 #define RtlInitializeSplayLinks(Links) \
222 { \
223 PRTL_SPLAY_LINKS _SplayLinks; \
224 _SplayLinks = (PRTL_SPLAY_LINKS)(Links); \
225 _SplayLinks->Parent = _SplayLinks; \
226 _SplayLinks->LeftChild = NULL; \
227 _SplayLinks->RightChild = NULL; \
228 }
229
230 #define RtlInsertAsLeftChild(ParentLinks,ChildLinks) \
231 { \
232 PRTL_SPLAY_LINKS _SplayParent; \
233 PRTL_SPLAY_LINKS _SplayChild; \
234 _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks); \
235 _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks); \
236 _SplayParent->LeftChild = _SplayChild; \
237 _SplayChild->Parent = _SplayParent; \
238 }
239
240 #define RtlInsertAsRightChild(ParentLinks,ChildLinks) \
241 { \
242 PRTL_SPLAY_LINKS _SplayParent; \
243 PRTL_SPLAY_LINKS _SplayChild; \
244 _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks); \
245 _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks); \
246 _SplayParent->RightChild = _SplayChild; \
247 _SplayChild->Parent = _SplayParent; \
248 }
249
250 //
251 // Error and Exception Functions
252 //
253 NTSYSAPI
254 PVOID
255 NTAPI
256 RtlAddVectoredExceptionHandler(
257 IN ULONG FirstHandler,
258 IN PVECTORED_EXCEPTION_HANDLER VectoredHandler
259 );
260
261 NTSYSAPI
262 VOID
263 NTAPI
264 RtlAssert(
265 PVOID FailedAssertion,
266 PVOID FileName,
267 ULONG LineNumber,
268 PCHAR Message
269 );
270
271 NTSYSAPI
272 VOID
273 NTAPI
274 RtlCaptureContext(OUT PCONTEXT ContextRecord);
275
276 NTSYSAPI
277 PVOID
278 NTAPI
279 RtlEncodePointer(IN PVOID Pointer);
280
281 NTSYSAPI
282 PVOID
283 NTAPI
284 RtlDecodePointer(IN PVOID Pointer);
285
286 NTSYSAPI
287 BOOLEAN
288 NTAPI
289 RtlDispatchException(
290 IN PEXCEPTION_RECORD ExceptionRecord,
291 IN PCONTEXT Context
292 );
293
294 NTSYSAPI
295 ULONG
296 NTAPI
297 RtlNtStatusToDosError(IN NTSTATUS Status);
298
299 NTSYSAPI
300 VOID
301 NTAPI
302 RtlRaiseException(IN PEXCEPTION_RECORD ExceptionRecord);
303
304 NTSYSAPI
305 VOID
306 NTAPI
307 RtlRaiseStatus(NTSTATUS Status);
308
309 NTSYSAPI
310 LONG
311 NTAPI
312 RtlUnhandledExceptionFilter(struct _EXCEPTION_POINTERS* ExceptionInfo);
313
314 NTSYSAPI
315 VOID
316 NTAPI
317 RtlUnwind(
318 IN PVOID TargetFrame OPTIONAL,
319 IN PVOID TargetIp OPTIONAL,
320 IN PEXCEPTION_RECORD ExceptionRecord OPTIONAL,
321 IN PVOID ReturnValue
322 );
323
324 //
325 // Heap Functions
326 //
327 NTSYSAPI
328 PVOID
329 NTAPI
330 RtlAllocateHeap(
331 IN HANDLE HeapHandle,
332 IN ULONG Flags,
333 IN ULONG Size
334 );
335
336 NTSYSAPI
337 PVOID
338 NTAPI
339 RtlCreateHeap(
340 IN ULONG Flags,
341 IN PVOID BaseAddress OPTIONAL,
342 IN SIZE_T SizeToReserve OPTIONAL,
343 IN SIZE_T SizeToCommit OPTIONAL,
344 IN PVOID Lock OPTIONAL,
345 IN PRTL_HEAP_PARAMETERS Parameters OPTIONAL
346 );
347
348 ULONG
349 NTAPI
350 RtlCompactHeap(
351 HANDLE heap,
352 ULONG flags
353 );
354
355 NTSYSAPI
356 HANDLE
357 NTAPI
358 RtlDestroyHeap(HANDLE hheap);
359
360 NTSYSAPI
361 BOOLEAN
362 NTAPI
363 RtlFreeHeap(
364 IN HANDLE HeapHandle,
365 IN ULONG Flags,
366 IN PVOID P
367 );
368
369 ULONG
370 NTAPI
371 RtlGetProcessHeaps(
372 ULONG HeapCount,
373 HANDLE *HeapArray
374 );
375
376 PVOID
377 NTAPI
378 RtlReAllocateHeap(
379 HANDLE Heap,
380 ULONG Flags,
381 PVOID Ptr,
382 ULONG Size
383 );
384
385 BOOLEAN
386 NTAPI
387 RtlLockHeap(IN HANDLE Heap);
388
389 BOOLEAN
390 NTAPI
391 RtlUnlockHeap(IN HANDLE Heap);
392
393 ULONG
394 NTAPI
395 RtlSizeHeap(
396 IN PVOID HeapHandle,
397 IN ULONG Flags,
398 IN PVOID MemoryPointer
399 );
400
401 BOOLEAN
402 NTAPI
403 RtlValidateHeap(
404 HANDLE Heap,
405 ULONG Flags,
406 PVOID pmem
407 );
408
409 #define RtlGetProcessHeap() (NtCurrentPeb()->ProcessHeap)
410
411 //
412 // Security Functions
413 //
414 NTSYSAPI
415 NTSTATUS
416 NTAPI
417 RtlAbsoluteToSelfRelativeSD(
418 IN PSECURITY_DESCRIPTOR AbsoluteSecurityDescriptor,
419 IN OUT PSECURITY_DESCRIPTOR SelfRelativeSecurityDescriptor,
420 IN PULONG BufferLength
421 );
422
423 NTSYSAPI
424 NTSTATUS
425 NTAPI
426 RtlAddAccessAllowedAce(
427 PACL Acl,
428 ULONG Revision,
429 ACCESS_MASK AccessMask,
430 PSID Sid
431 );
432
433 NTSTATUS
434 NTAPI
435 RtlAddAccessAllowedAceEx(
436 IN OUT PACL pAcl,
437 IN ULONG dwAceRevision,
438 IN ULONG AceFlags,
439 IN ULONG AccessMask,
440 IN PSID pSid
441 );
442
443 NTSTATUS
444 NTAPI
445 RtlAddAccessDeniedAce(
446 PACL Acl,
447 ULONG Revision,
448 ACCESS_MASK AccessMask,
449 PSID Sid
450 );
451
452 NTSTATUS
453 NTAPI
454 RtlAddAccessDeniedAceEx(
455 IN OUT PACL Acl,
456 IN ULONG Revision,
457 IN ULONG Flags,
458 IN ACCESS_MASK AccessMask,
459 IN PSID Sid
460 );
461
462 NTSTATUS
463 NTAPI
464 RtlAddAuditAccessAceEx(
465 IN OUT PACL Acl,
466 IN ULONG Revision,
467 IN ULONG Flags,
468 IN ACCESS_MASK AccessMask,
469 IN PSID Sid,
470 IN BOOLEAN Success,
471 IN BOOLEAN Failure
472 );
473
474 NTSYSAPI
475 NTSTATUS
476 NTAPI
477 RtlAddAce(
478 PACL Acl,
479 ULONG AceRevision,
480 ULONG StartingAceIndex,
481 PVOID AceList,
482 ULONG AceListLength
483 );
484
485 NTSTATUS
486 NTAPI
487 RtlAddAuditAccessAce(
488 PACL Acl,
489 ULONG Revision,
490 ACCESS_MASK AccessMask,
491 PSID Sid,
492 BOOLEAN Success,
493 BOOLEAN Failure
494 );
495
496 NTSTATUS
497 NTAPI
498 RtlAdjustPrivilege(
499 IN ULONG Privilege,
500 IN BOOLEAN NewValue,
501 IN BOOLEAN ForThread,
502 OUT PBOOLEAN OldValue
503 );
504
505 NTSYSAPI
506 NTSTATUS
507 NTAPI
508 RtlAllocateAndInitializeSid(
509 IN PSID_IDENTIFIER_AUTHORITY IdentifierAuthority,
510 IN UCHAR SubAuthorityCount,
511 IN ULONG SubAuthority0,
512 IN ULONG SubAuthority1,
513 IN ULONG SubAuthority2,
514 IN ULONG SubAuthority3,
515 IN ULONG SubAuthority4,
516 IN ULONG SubAuthority5,
517 IN ULONG SubAuthority6,
518 IN ULONG SubAuthority7,
519 OUT PSID *Sid
520 );
521
522 BOOLEAN
523 NTAPI
524 RtlAreAllAccessesGranted(
525 ACCESS_MASK GrantedAccess,
526 ACCESS_MASK DesiredAccess
527 );
528
529 BOOLEAN
530 NTAPI
531 RtlAreAnyAccessesGranted(
532 ACCESS_MASK GrantedAccess,
533 ACCESS_MASK DesiredAccess
534 );
535
536 NTSYSAPI
537 VOID
538 NTAPI
539 RtlCopyLuid(
540 IN PLUID LuidDest,
541 IN PLUID LuidSrc
542 );
543
544 VOID
545 NTAPI
546 RtlCopyLuidAndAttributesArray(
547 ULONG Count,
548 PLUID_AND_ATTRIBUTES Src,
549 PLUID_AND_ATTRIBUTES Dest
550 );
551
552 NTSTATUS
553 NTAPI
554 RtlCopySidAndAttributesArray(
555 ULONG Count,
556 PSID_AND_ATTRIBUTES Src,
557 ULONG SidAreaSize,
558 PSID_AND_ATTRIBUTES Dest,
559 PVOID SidArea,
560 PVOID* RemainingSidArea,
561 PULONG RemainingSidAreaSize
562 );
563
564 NTSTATUS
565 NTAPI
566 RtlConvertSidToUnicodeString(
567 OUT PUNICODE_STRING DestinationString,
568 IN PSID Sid,
569 IN BOOLEAN AllocateDestinationString
570 );
571
572 NTSYSAPI
573 NTSTATUS
574 NTAPI
575 RtlCopySid(
576 IN ULONG Length,
577 IN PSID Destination,
578 IN PSID Source
579 );
580
581 NTSYSAPI
582 NTSTATUS
583 NTAPI
584 RtlCreateAcl(
585 PACL Acl,
586 ULONG AclSize,
587 ULONG AclRevision
588 );
589
590 NTSYSAPI
591 NTSTATUS
592 NTAPI
593 RtlCreateSecurityDescriptor(
594 PSECURITY_DESCRIPTOR SecurityDescriptor,
595 ULONG Revision
596 );
597
598 NTSYSAPI
599 NTSTATUS
600 NTAPI
601 RtlCreateSecurityDescriptorRelative(
602 PISECURITY_DESCRIPTOR_RELATIVE SecurityDescriptor,
603 ULONG Revision
604 );
605
606 NTSYSAPI
607 NTSTATUS
608 NTAPI
609 RtlDeleteAce(
610 PACL Acl,
611 ULONG AceIndex
612 );
613
614 NTSYSAPI
615 BOOLEAN
616 NTAPI
617 RtlEqualPrefixSid(
618 PSID Sid1,
619 PSID Sid2
620 );
621
622 NTSYSAPI
623 BOOLEAN
624 NTAPI
625 RtlEqualSid (
626 IN PSID Sid1,
627 IN PSID Sid2
628 );
629
630 BOOLEAN
631 NTAPI
632 RtlFirstFreeAce(
633 PACL Acl,
634 PACE* Ace
635 );
636
637 NTSYSAPI
638 PVOID
639 NTAPI
640 RtlFreeSid (
641 IN PSID Sid
642 );
643
644 NTSYSAPI
645 NTSTATUS
646 NTAPI
647 RtlGetAce(
648 PACL Acl,
649 ULONG AceIndex,
650 PVOID *Ace
651 );
652
653 NTSTATUS
654 NTAPI
655 RtlGetControlSecurityDescriptor(
656 PSECURITY_DESCRIPTOR SecurityDescriptor,
657 PSECURITY_DESCRIPTOR_CONTROL Control,
658 PULONG Revision
659 );
660
661 NTSYSAPI
662 NTSTATUS
663 NTAPI
664 RtlGetDaclSecurityDescriptor(
665 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
666 OUT PBOOLEAN DaclPresent,
667 OUT PACL *Dacl,
668 OUT PBOOLEAN DaclDefaulted
669 );
670
671 NTSYSAPI
672 NTSTATUS
673 NTAPI
674 RtlGetSaclSecurityDescriptor(
675 PSECURITY_DESCRIPTOR SecurityDescriptor,
676 PBOOLEAN SaclPresent,
677 PACL* Sacl,
678 PBOOLEAN SaclDefaulted
679 );
680
681 NTSYSAPI
682 NTSTATUS
683 NTAPI
684 RtlGetGroupSecurityDescriptor(
685 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
686 OUT PSID *Group,
687 OUT PBOOLEAN GroupDefaulted
688 );
689
690 NTSYSAPI
691 NTSTATUS
692 NTAPI
693 RtlGetOwnerSecurityDescriptor(
694 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
695 OUT PSID *Owner,
696 OUT PBOOLEAN OwnerDefaulted
697 );
698
699 NTSYSAPI
700 BOOLEAN
701 NTAPI
702 RtlGetSecurityDescriptorRMControl(
703 PSECURITY_DESCRIPTOR SecurityDescriptor,
704 PUCHAR RMControl
705 );
706
707 NTSYSAPI
708 PSID_IDENTIFIER_AUTHORITY
709 NTAPI
710 RtlIdentifierAuthoritySid(PSID Sid);
711
712 NTSYSAPI
713 NTSTATUS
714 NTAPI
715 RtlImpersonateSelf(IN SECURITY_IMPERSONATION_LEVEL ImpersonationLevel);
716
717 NTSYSAPI
718 NTSTATUS
719 NTAPI
720 RtlInitializeSid(
721 IN OUT PSID Sid,
722 IN PSID_IDENTIFIER_AUTHORITY IdentifierAuthority,
723 IN UCHAR SubAuthorityCount
724 );
725
726 NTSYSAPI
727 ULONG
728 NTAPI
729 RtlLengthRequiredSid(IN ULONG SubAuthorityCount);
730
731 NTSYSAPI
732 ULONG
733 NTAPI
734 RtlLengthSid(IN PSID Sid);
735
736 NTSYSAPI
737 NTSTATUS
738 NTAPI
739 RtlMakeSelfRelativeSD(
740 IN PSECURITY_DESCRIPTOR AbsoluteSD,
741 OUT PSECURITY_DESCRIPTOR SelfRelativeSD,
742 IN OUT PULONG BufferLength);
743
744 NTSYSAPI
745 VOID
746 NTAPI
747 RtlMapGenericMask(
748 PACCESS_MASK AccessMask,
749 PGENERIC_MAPPING GenericMapping
750 );
751
752 NTSYSAPI
753 NTSTATUS
754 NTAPI
755 RtlQueryInformationAcl(
756 PACL Acl,
757 PVOID Information,
758 ULONG InformationLength,
759 ACL_INFORMATION_CLASS InformationClass
760 );
761
762 NTSYSAPI
763 NTSTATUS
764 NTAPI
765 RtlSelfRelativeToAbsoluteSD(
766 IN PSECURITY_DESCRIPTOR SelfRelativeSD,
767 OUT PSECURITY_DESCRIPTOR AbsoluteSD,
768 IN PULONG AbsoluteSDSize,
769 IN PACL Dacl,
770 IN PULONG DaclSize,
771 IN PACL Sacl,
772 IN PULONG SaclSize,
773 IN PSID Owner,
774 IN PULONG OwnerSize,
775 IN PSID PrimaryGroup,
776 IN PULONG PrimaryGroupSize
777 );
778
779 NTSYSAPI
780 NTSTATUS
781 NTAPI
782 RtlSelfRelativeToAbsoluteSD2(
783 IN OUT PSECURITY_DESCRIPTOR SelfRelativeSD,
784 OUT PULONG BufferSize
785 );
786
787 NTSYSAPI
788 NTSTATUS
789 NTAPI
790 RtlSetControlSecurityDescriptor(
791 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
792 IN SECURITY_DESCRIPTOR_CONTROL ControlBitsOfInterest,
793 IN SECURITY_DESCRIPTOR_CONTROL ControlBitsToSet
794 );
795
796 NTSYSAPI
797 NTSTATUS
798 NTAPI
799 RtlSetDaclSecurityDescriptor (
800 PSECURITY_DESCRIPTOR SecurityDescriptor,
801 BOOLEAN DaclPresent,
802 PACL Dacl,
803 BOOLEAN DaclDefaulted
804 );
805
806 NTSYSAPI
807 NTSTATUS
808 NTAPI
809 RtlSetGroupSecurityDescriptor(
810 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
811 IN PSID Group,
812 IN BOOLEAN GroupDefaulted
813 );
814
815 NTSYSAPI
816 NTSTATUS
817 NTAPI
818 RtlSetInformationAcl(
819 PACL Acl,
820 PVOID Information,
821 ULONG InformationLength,
822 ACL_INFORMATION_CLASS InformationClass
823 );
824
825 NTSYSAPI
826 NTSTATUS
827 NTAPI
828 RtlSetOwnerSecurityDescriptor(
829 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
830 IN PSID Owner,
831 IN BOOLEAN OwnerDefaulted
832 );
833
834 NTSYSAPI
835 NTSTATUS
836 NTAPI
837 RtlSetSaclSecurityDescriptor(
838 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
839 IN BOOLEAN SaclPresent,
840 IN PACL Sacl,
841 IN BOOLEAN SaclDefaulted
842 );
843
844 NTSYSAPI
845 VOID
846 NTAPI
847 RtlSetSecurityDescriptorRMControl(
848 PSECURITY_DESCRIPTOR SecurityDescriptor,
849 PUCHAR RMControl
850 );
851
852 NTSYSAPI
853 PUCHAR
854 NTAPI
855 RtlSubAuthorityCountSid(
856 IN PSID Sid
857 );
858
859 NTSYSAPI
860 PULONG
861 NTAPI
862 RtlSubAuthoritySid(
863 IN PSID Sid,
864 IN ULONG SubAuthority
865 );
866
867 NTSYSAPI
868 BOOLEAN
869 NTAPI
870 RtlValidRelativeSecurityDescriptor(
871 IN PSECURITY_DESCRIPTOR SecurityDescriptorInput,
872 IN ULONG SecurityDescriptorLength,
873 IN SECURITY_INFORMATION RequiredInformation
874 );
875
876 NTSYSAPI
877 BOOLEAN
878 NTAPI
879 RtlValidSecurityDescriptor(IN PSECURITY_DESCRIPTOR SecurityDescriptor);
880
881 NTSYSAPI
882 BOOLEAN
883 NTAPI
884 RtlValidSid(IN PSID Sid);
885
886 NTSYSAPI
887 BOOLEAN
888 NTAPI
889 RtlValidAcl(PACL Acl);
890
891 NTSYSAPI
892 NTSTATUS
893 NTAPI
894 RtlDeleteSecurityObject(
895 IN PSECURITY_DESCRIPTOR *ObjectDescriptor
896 );
897
898 NTSYSAPI
899 NTSTATUS
900 NTAPI
901 RtlNewSecurityObject(
902 IN PSECURITY_DESCRIPTOR ParentDescriptor,
903 IN PSECURITY_DESCRIPTOR CreatorDescriptor,
904 OUT PSECURITY_DESCRIPTOR *NewDescriptor,
905 IN BOOLEAN IsDirectoryObject,
906 IN HANDLE Token,
907 IN PGENERIC_MAPPING GenericMapping
908 );
909
910 NTSYSAPI
911 NTSTATUS
912 NTAPI
913 RtlQuerySecurityObject(
914 IN PSECURITY_DESCRIPTOR ObjectDescriptor,
915 IN SECURITY_INFORMATION SecurityInformation,
916 OUT PSECURITY_DESCRIPTOR ResultantDescriptor,
917 IN ULONG DescriptorLength,
918 OUT PULONG ReturnLength
919 );
920
921 NTSYSAPI
922 NTSTATUS
923 NTAPI
924 RtlSetSecurityObject(
925 IN SECURITY_INFORMATION SecurityInformation,
926 IN PSECURITY_DESCRIPTOR ModificationDescriptor,
927 OUT PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor,
928 IN PGENERIC_MAPPING GenericMapping,
929 IN HANDLE Token
930 );
931
932 //
933 // Single-Character Functions
934 //
935 NTSYSAPI
936 NTSTATUS
937 NTAPI
938 RtlLargeIntegerToChar(
939 IN PLARGE_INTEGER Value,
940 IN ULONG Base,
941 IN ULONG Length,
942 IN OUT PCHAR String
943 );
944
945 NTSYSAPI
946 CHAR
947 NTAPI
948 RtlUpperChar(CHAR Source);
949
950 NTSYSAPI
951 WCHAR
952 NTAPI
953 RtlUpcaseUnicodeChar(WCHAR Source);
954
955 NTSYSAPI
956 WCHAR
957 NTAPI
958 RtlDowncaseUnicodeChar(IN WCHAR Source);
959
960 NTSYSAPI
961 NTSTATUS
962 NTAPI
963 RtlIntegerToChar(
964 IN ULONG Value,
965 IN ULONG Base,
966 IN ULONG Length,
967 IN OUT PCHAR String
968 );
969
970 NTSYSAPI
971 NTSTATUS
972 NTAPI
973 RtlIntegerToUnicode(
974 IN ULONG Value,
975 IN ULONG Base OPTIONAL,
976 IN ULONG Length OPTIONAL,
977 IN OUT LPWSTR String
978 );
979
980 NTSYSAPI
981 NTSTATUS
982 NTAPI
983 RtlIntegerToUnicodeString(
984 IN ULONG Value,
985 IN ULONG Base,
986 IN OUT PUNICODE_STRING String
987 );
988
989 NTSYSAPI
990 NTSTATUS
991 NTAPI
992 RtlCharToInteger(
993 PCSZ String,
994 ULONG Base,
995 PULONG Value
996 );
997
998 //
999 // Byte Swap Functions
1000 //
1001 #if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037)) || \
1002 ((defined(_M_AMD64) || \
1003 defined(_M_IA64)) && (_MSC_FULL_VER > 13009175))
1004
1005 unsigned short __cdecl _byteswap_ushort(unsigned short);
1006 unsigned long __cdecl _byteswap_ulong (unsigned long);
1007 unsigned __int64 __cdecl _byteswap_uint64(unsigned __int64);
1008 #pragma intrinsic(_byteswap_ushort)
1009 #pragma intrinsic(_byteswap_ulong)
1010 #pragma intrinsic(_byteswap_uint64)
1011 #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
1012 #define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
1013 #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
1014
1015 #else
1016
1017 USHORT
1018 FASTCALL
1019 RtlUshortByteSwap(IN USHORT Source);
1020
1021 ULONG
1022 FASTCALL
1023 RtlUlongByteSwap(IN ULONG Source);
1024
1025 ULONGLONG
1026 FASTCALL
1027 RtlUlonglongByteSwap(IN ULONGLONG Source);
1028
1029 #endif
1030
1031 //
1032 // Unicode->Ansi String Functions
1033 //
1034 NTSYSAPI
1035 ULONG
1036 NTAPI
1037 RtlxUnicodeStringToAnsiSize(IN PCUNICODE_STRING UnicodeString);
1038
1039 #ifdef NTOS_MODE_USER
1040
1041 #define RtlUnicodeStringToAnsiSize(STRING) ( \
1042 NLS_MB_CODE_PAGE_TAG ? \
1043 RtlxUnicodeStringToAnsiSize(STRING) : \
1044 ((STRING)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
1045 )
1046
1047 #endif
1048
1049 NTSYSAPI
1050 NTSTATUS
1051 NTAPI
1052 RtlUnicodeStringToAnsiString(
1053 PANSI_STRING DestinationString,
1054 PCUNICODE_STRING SourceString,
1055 BOOLEAN AllocateDestinationString
1056 );
1057
1058 //
1059 // Unicode->OEM String Functions
1060 //
1061 NTSYSAPI
1062 NTSTATUS
1063 NTAPI
1064 RtlUpcaseUnicodeStringToOemString(
1065 POEM_STRING DestinationString,
1066 PCUNICODE_STRING SourceString,
1067 BOOLEAN AllocateDestinationString
1068 );
1069
1070 NTSYSAPI
1071 NTSTATUS
1072 NTAPI
1073 RtlUpcaseUnicodeStringToCountedOemString(
1074 IN OUT POEM_STRING DestinationString,
1075 IN PCUNICODE_STRING SourceString,
1076 IN BOOLEAN AllocateDestinationString
1077 );
1078
1079 NTSYSAPI
1080 NTSTATUS
1081 NTAPI
1082 RtlUnicodeStringToOemString(
1083 POEM_STRING DestinationString,
1084 PCUNICODE_STRING SourceString,
1085 BOOLEAN AllocateDestinationString
1086 );
1087
1088 NTSYSAPI
1089 NTSTATUS
1090 NTAPI
1091 RtlUpcaseUnicodeToOemN(
1092 PCHAR OemString,
1093 ULONG OemSize,
1094 PULONG ResultSize,
1095 PWCHAR UnicodeString,
1096 ULONG UnicodeSize
1097 );
1098
1099 NTSYSAPI
1100 ULONG
1101 NTAPI
1102 RtlxUnicodeStringToOemSize(IN PCUNICODE_STRING UnicodeString);
1103
1104 #ifdef NTOS_MODE_USER
1105
1106 #define RtlUnicodeStringToOemSize(STRING) ( \
1107 NLS_MB_OEM_CODE_PAGE_TAG ? \
1108 RtlxUnicodeStringToOemSize(STRING) : \
1109 ((STRING)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
1110 )
1111
1112 #define RtlUnicodeStringToCountedOemSize(STRING) ( \
1113 (ULONG)(RtlUnicodeStringToOemSize(STRING) - sizeof(ANSI_NULL)) \
1114 )
1115
1116 #endif
1117
1118 NTSYSAPI
1119 NTSTATUS
1120 NTAPI
1121 RtlUnicodeToOemN(
1122 PCHAR OemString,
1123 ULONG OemSize,
1124 PULONG ResultSize,
1125 PWCHAR UnicodeString,
1126 ULONG UnicodeSize
1127 );
1128
1129 //
1130 // Unicode->MultiByte String Functions
1131 //
1132 NTSYSAPI
1133 NTSTATUS
1134 NTAPI
1135 RtlUnicodeToMultiByteN(
1136 PCHAR MbString,
1137 ULONG MbSize,
1138 PULONG ResultSize,
1139 PWCHAR UnicodeString,
1140 ULONG UnicodeSize
1141 );
1142
1143 NTSYSAPI
1144 NTSTATUS
1145 NTAPI
1146 RtlUpcaseUnicodeToMultiByteN(
1147 PCHAR MbString,
1148 ULONG MbSize,
1149 PULONG ResultSize,
1150 PWCHAR UnicodeString,
1151 ULONG UnicodeSize
1152 );
1153
1154 NTSYSAPI
1155 NTSTATUS
1156 NTAPI
1157 RtlUnicodeToMultiByteSize(
1158 PULONG MbSize,
1159 PWCHAR UnicodeString,
1160 ULONG UnicodeSize
1161 );
1162
1163 NTSYSAPI
1164 ULONG
1165 NTAPI
1166 RtlxOemStringToUnicodeSize(IN PCOEM_STRING OemString);
1167
1168 //
1169 // OEM to Unicode Functions
1170 //
1171 NTSYSAPI
1172 NTSTATUS
1173 NTAPI
1174 RtlOemStringToUnicodeString(
1175 PUNICODE_STRING DestinationString,
1176 PCOEM_STRING SourceString,
1177 BOOLEAN AllocateDestinationString
1178 );
1179
1180 NTSYSAPI
1181 NTSTATUS
1182 NTAPI
1183 RtlOemToUnicodeN(
1184 PWSTR UnicodeString,
1185 ULONG MaxBytesInUnicodeString,
1186 PULONG BytesInUnicodeString,
1187 IN PCHAR OemString,
1188 ULONG BytesInOemString
1189 );
1190
1191 #ifdef NTOS_MODE_USER
1192
1193 #define RtlOemStringToUnicodeSize(STRING) ( \
1194 NLS_MB_OEM_CODE_PAGE_TAG ? \
1195 RtlxOemStringToUnicodeSize(STRING) : \
1196 ((STRING)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
1197 )
1198
1199 #define RtlOemStringToCountedUnicodeSize(STRING) ( \
1200 (ULONG)(RtlOemStringToUnicodeSize(STRING) - sizeof(UNICODE_NULL)) \
1201 )
1202
1203 #endif
1204
1205 //
1206 // Ansi->Unicode String Functions
1207 //
1208 NTSYSAPI
1209 ULONG
1210 NTAPI
1211 RtlxAnsiStringToUnicodeSize(
1212 PCANSI_STRING AnsiString
1213 );
1214
1215 NTSYSAPI
1216 NTSTATUS
1217 NTAPI
1218 RtlAnsiStringToUnicodeString(
1219 PUNICODE_STRING DestinationString,
1220 PCANSI_STRING SourceString,
1221 BOOLEAN AllocateDestinationString
1222 );
1223
1224 #ifdef NTOS_MODE_USER
1225
1226 #define RtlAnsiStringToUnicodeSize(STRING) ( \
1227 NLS_MB_CODE_PAGE_TAG ? \
1228 RtlxAnsiStringToUnicodeSize(STRING) : \
1229 ((STRING)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
1230 )
1231
1232 #endif
1233
1234 NTSYSAPI
1235 BOOLEAN
1236 NTAPI
1237 RtlCreateUnicodeStringFromAsciiz(
1238 OUT PUNICODE_STRING Destination,
1239 IN PCSZ Source
1240 );
1241
1242 //
1243 // Unicode String Functions
1244 //
1245 NTSYSAPI
1246 NTSTATUS
1247 NTAPI
1248 RtlAppendUnicodeToString(
1249 PUNICODE_STRING Destination,
1250 PCWSTR Source
1251 );
1252
1253 NTSYSAPI
1254 NTSTATUS
1255 NTAPI
1256 RtlAppendUnicodeStringToString(
1257 PUNICODE_STRING Destination,
1258 PCUNICODE_STRING Source
1259 );
1260
1261 NTSYSAPI
1262 LONG
1263 NTAPI
1264 RtlCompareUnicodeString(
1265 PCUNICODE_STRING String1,
1266 PCUNICODE_STRING String2,
1267 BOOLEAN CaseInsensitive
1268 );
1269
1270 NTSYSAPI
1271 VOID
1272 NTAPI
1273 RtlCopyUnicodeString(
1274 PUNICODE_STRING DestinationString,
1275 PCUNICODE_STRING SourceString
1276 );
1277
1278 NTSYSAPI
1279 BOOLEAN
1280 NTAPI
1281 RtlCreateUnicodeString(
1282 PUNICODE_STRING DestinationString,
1283 PCWSTR SourceString
1284 );
1285
1286 #ifdef NTOS_MODE_USER
1287
1288 NTSYSAPI
1289 NTSTATUS
1290 NTAPI
1291 RtlDowncaseUnicodeString(
1292 IN OUT PUNICODE_STRING UniDest,
1293 IN PCUNICODE_STRING UniSource,
1294 IN BOOLEAN AllocateDestinationString
1295 );
1296
1297 #endif
1298
1299 NTSYSAPI
1300 NTSTATUS
1301 NTAPI
1302 RtlDuplicateUnicodeString(
1303 IN ULONG Flags,
1304 IN PCUNICODE_STRING SourceString,
1305 OUT PUNICODE_STRING DestinationString
1306 );
1307
1308 NTSYSAPI
1309 BOOLEAN
1310 NTAPI
1311 RtlEqualUnicodeString(
1312 PCUNICODE_STRING String1,
1313 PCUNICODE_STRING String2,
1314 BOOLEAN CaseInsensitive
1315 );
1316
1317 NTSYSAPI
1318 VOID
1319 NTAPI
1320 RtlFreeUnicodeString(IN PUNICODE_STRING UnicodeString);
1321
1322 NTSYSAPI
1323 NTSTATUS
1324 NTAPI
1325 RtlHashUnicodeString(
1326 IN CONST UNICODE_STRING *String,
1327 IN BOOLEAN CaseInSensitive,
1328 IN ULONG HashAlgorithm,
1329 OUT PULONG HashValue
1330 );
1331
1332 NTSYSAPI
1333 VOID
1334 NTAPI
1335 RtlInitUnicodeString(
1336 IN OUT PUNICODE_STRING DestinationString,
1337 IN PCWSTR SourceString);
1338
1339 NTSYSAPI
1340 ULONG
1341 NTAPI
1342 RtlIsTextUnicode(
1343 PVOID Buffer,
1344 ULONG Length,
1345 ULONG *Flags
1346 );
1347
1348 NTSYSAPI
1349 BOOLEAN
1350 NTAPI
1351 RtlPrefixString(
1352 PCANSI_STRING String1,
1353 PCANSI_STRING String2,
1354 BOOLEAN CaseInsensitive
1355 );
1356
1357 NTSYSAPI
1358 BOOLEAN
1359 NTAPI
1360 RtlPrefixUnicodeString(
1361 PCUNICODE_STRING String1,
1362 PCUNICODE_STRING String2,
1363 BOOLEAN CaseInsensitive
1364 );
1365
1366 NTSYSAPI
1367 NTSTATUS
1368 NTAPI
1369 RtlUpcaseUnicodeString(
1370 PUNICODE_STRING DestinationString,
1371 PCUNICODE_STRING SourceString,
1372 BOOLEAN AllocateDestinationString
1373 );
1374
1375 NTSYSAPI
1376 NTSTATUS
1377 NTAPI
1378 RtlUnicodeStringToInteger(
1379 PCUNICODE_STRING String,
1380 ULONG Base,
1381 PULONG Value
1382 );
1383
1384 //
1385 // Ansi String Functions
1386 //
1387 NTSYSAPI
1388 VOID
1389 NTAPI
1390 RtlFreeAnsiString(IN PANSI_STRING AnsiString);
1391
1392 NTSYSAPI
1393 VOID
1394 NTAPI
1395 RtlInitAnsiString(
1396 PANSI_STRING DestinationString,
1397 PCSZ SourceString
1398 );
1399
1400 //
1401 // OEM String Functions
1402 //
1403 NTSYSAPI
1404 VOID
1405 NTAPI
1406 RtlFreeOemString(IN POEM_STRING OemString);
1407
1408 //
1409 // MultiByte->Unicode String Functions
1410 //
1411 NTSYSAPI
1412 NTSTATUS
1413 NTAPI
1414 RtlMultiByteToUnicodeN(
1415 PWCHAR UnicodeString,
1416 ULONG UnicodeSize,
1417 PULONG ResultSize,
1418 PCSTR MbString,
1419 ULONG MbSize
1420 );
1421
1422 NTSYSAPI
1423 NTSTATUS
1424 NTAPI
1425 RtlMultiByteToUnicodeSize(
1426 PULONG UnicodeSize,
1427 PCSTR MbString,
1428 ULONG MbSize
1429 );
1430
1431 //
1432 // Atom Functions
1433 //
1434 NTSYSAPI
1435 NTSTATUS
1436 NTAPI
1437 RtlAddAtomToAtomTable(
1438 IN PRTL_ATOM_TABLE AtomTable,
1439 IN PWSTR AtomName,
1440 OUT PRTL_ATOM Atom
1441 );
1442
1443 NTSYSAPI
1444 NTSTATUS
1445 NTAPI
1446 RtlCreateAtomTable(
1447 IN ULONG TableSize,
1448 IN OUT PRTL_ATOM_TABLE *AtomTable
1449 );
1450
1451 NTSYSAPI
1452 NTSTATUS
1453 NTAPI
1454 RtlDeleteAtomFromAtomTable(
1455 IN PRTL_ATOM_TABLE AtomTable,
1456 IN RTL_ATOM Atom
1457 );
1458
1459 NTSYSAPI
1460 NTSTATUS
1461 NTAPI
1462 RtlDestroyAtomTable(IN PRTL_ATOM_TABLE AtomTable);
1463
1464 NTSYSAPI
1465 NTSTATUS
1466 NTAPI
1467 RtlQueryAtomInAtomTable(
1468 IN PRTL_ATOM_TABLE AtomTable,
1469 IN RTL_ATOM Atom,
1470 IN OUT PULONG RefCount OPTIONAL,
1471 IN OUT PULONG PinCount OPTIONAL,
1472 IN OUT PWSTR AtomName OPTIONAL,
1473 IN OUT PULONG NameLength OPTIONAL
1474 );
1475
1476 NTSYSAPI
1477 NTSTATUS
1478 NTAPI
1479 RtlPinAtomInAtomTable(
1480 IN PRTL_ATOM_TABLE AtomTable,
1481 IN RTL_ATOM Atom
1482 );
1483
1484 NTSYSAPI
1485 NTSTATUS
1486 NTAPI
1487 RtlLookupAtomInAtomTable(
1488 IN PRTL_ATOM_TABLE AtomTable,
1489 IN PWSTR AtomName,
1490 OUT PRTL_ATOM Atom
1491 );
1492
1493 //
1494 // Memory Functions
1495 //
1496 NTSYSAPI
1497 VOID
1498 NTAPI
1499 RtlFillMemoryUlong(
1500 IN PVOID Destination,
1501 IN ULONG Length,
1502 IN ULONG Fill
1503 );
1504
1505 //
1506 // Process Management Functions
1507 //
1508 NTSYSAPI
1509 VOID
1510 NTAPI
1511 RtlAcquirePebLock(VOID);
1512
1513 NTSYSAPI
1514 NTSTATUS
1515 NTAPI
1516 RtlCreateProcessParameters (
1517 OUT PRTL_USER_PROCESS_PARAMETERS *ProcessParameters,
1518 IN PUNICODE_STRING ImagePathName OPTIONAL,
1519 IN PUNICODE_STRING DllPath OPTIONAL,
1520 IN PUNICODE_STRING CurrentDirectory OPTIONAL,
1521 IN PUNICODE_STRING CommandLine OPTIONAL,
1522 IN PWSTR Environment OPTIONAL,
1523 IN PUNICODE_STRING WindowTitle OPTIONAL,
1524 IN PUNICODE_STRING DesktopInfo OPTIONAL,
1525 IN PUNICODE_STRING ShellInfo OPTIONAL,
1526 IN PUNICODE_STRING RuntimeInfo OPTIONAL
1527 );
1528
1529 NTSYSAPI
1530 NTSTATUS
1531 NTAPI
1532 RtlCreateUserProcess(
1533 IN PUNICODE_STRING ImageFileName,
1534 IN ULONG Attributes,
1535 IN PRTL_USER_PROCESS_PARAMETERS ProcessParameters,
1536 IN PSECURITY_DESCRIPTOR ProcessSecutityDescriptor OPTIONAL,
1537 IN PSECURITY_DESCRIPTOR ThreadSecurityDescriptor OPTIONAL,
1538 IN HANDLE ParentProcess OPTIONAL,
1539 IN BOOLEAN CurrentDirectory,
1540 IN HANDLE DebugPort OPTIONAL,
1541 IN HANDLE ExceptionPort OPTIONAL,
1542 OUT PRTL_USER_PROCESS_INFORMATION ProcessInfo
1543 );
1544
1545 NTSYSAPI
1546 NTSTATUS
1547 NTAPI
1548 RtlCreateUserThread(
1549 IN HANDLE ProcessHandle,
1550 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
1551 IN BOOLEAN CreateSuspended,
1552 IN LONG StackZeroBits,
1553 IN ULONG StackReserve,
1554 IN ULONG StackCommit,
1555 IN PTHREAD_START_ROUTINE StartAddress,
1556 IN PVOID Parameter,
1557 IN OUT PHANDLE ThreadHandle,
1558 IN OUT PCLIENT_ID ClientId
1559 );
1560
1561 NTSYSAPI
1562 PRTL_USER_PROCESS_PARAMETERS
1563 NTAPI
1564 RtlDeNormalizeProcessParams(IN PRTL_USER_PROCESS_PARAMETERS ProcessParameters);
1565
1566 NTSYSAPI
1567 NTSTATUS
1568 NTAPI
1569 RtlDestroyProcessParameters(IN PRTL_USER_PROCESS_PARAMETERS ProcessParameters);
1570
1571 NTSYSAPI
1572 VOID
1573 NTAPI
1574 RtlExitUserThread(NTSTATUS Status);
1575
1576 NTSYSAPI
1577 VOID
1578 NTAPI
1579 RtlInitializeContext(
1580 IN HANDLE ProcessHandle,
1581 OUT PCONTEXT ThreadContext,
1582 IN PVOID ThreadStartParam OPTIONAL,
1583 IN PTHREAD_START_ROUTINE ThreadStartAddress,
1584 IN PINITIAL_TEB InitialTeb
1585 );
1586
1587 NTSYSAPI
1588 PRTL_USER_PROCESS_PARAMETERS
1589 NTAPI
1590 RtlNormalizeProcessParams(IN PRTL_USER_PROCESS_PARAMETERS ProcessParameters);
1591
1592 NTSYSAPI
1593 VOID
1594 NTAPI
1595 RtlReleasePebLock(VOID);
1596
1597 NTSYSAPI
1598 VOID
1599 NTAPI
1600 RtlSetProcessIsCritical(
1601 IN BOOLEAN NewValue,
1602 OUT PBOOLEAN OldValue OPTIONAL,
1603 IN BOOLEAN IsWinlogon
1604 );
1605
1606 #define NtCurrentPeb() (NtCurrentTeb()->ProcessEnvironmentBlock)
1607
1608 //
1609 // Environment/Path Functions
1610 //
1611 NTSYSAPI
1612 NTSTATUS
1613 NTAPI
1614 RtlCreateEnvironment(
1615 BOOLEAN Inherit,
1616 PWSTR *Environment
1617 );
1618
1619 NTSYSAPI
1620 VOID
1621 NTAPI
1622 RtlDestroyEnvironment(PWSTR Environment);
1623
1624 NTSYSAPI
1625 BOOLEAN
1626 NTAPI
1627 RtlDoesFileExists_U(PWSTR FileName);
1628
1629 NTSYSAPI
1630 ULONG
1631 NTAPI
1632 RtlDetermineDosPathNameType_U(PCWSTR Path);
1633
1634 NTSYSAPI
1635 ULONG
1636 NTAPI
1637 RtlDosSearchPath_U(
1638 WCHAR *sp,
1639 WCHAR *name,
1640 WCHAR *ext,
1641 ULONG buf_sz,
1642 WCHAR *buffer,
1643 WCHAR **shortname
1644 );
1645
1646 NTSYSAPI
1647 BOOLEAN
1648 NTAPI
1649 RtlDosPathNameToNtPathName_U(
1650 IN PCWSTR DosPathName,
1651 OUT PUNICODE_STRING NtPathName,
1652 OUT PCWSTR *NtFileNamePart,
1653 OUT CURDIR *DirectoryInfo
1654 );
1655
1656 NTSYSAPI
1657 NTSTATUS
1658 NTAPI
1659 RtlExpandEnvironmentStrings_U(
1660 PWSTR Environment,
1661 PUNICODE_STRING Source,
1662 PUNICODE_STRING Destination,
1663 PULONG Length
1664 );
1665
1666 NTSYSAPI
1667 ULONG
1668 NTAPI
1669 RtlGetCurrentDirectory_U(
1670 ULONG MaximumLength,
1671 PWSTR Buffer
1672 );
1673
1674 NTSYSAPI
1675 ULONG
1676 NTAPI
1677 RtlGetFullPathName_U(
1678 const WCHAR *dosname,
1679 ULONG size,
1680 WCHAR *buf,
1681 WCHAR **shortname
1682 );
1683
1684 NTSYSAPI
1685 BOOLEAN
1686 NTAPI
1687 RtlIsNameLegalDOS8Dot3(
1688 IN PUNICODE_STRING UnicodeName,
1689 IN PANSI_STRING AnsiName,
1690 PBOOLEAN Unknown
1691 );
1692
1693 NTSYSAPI
1694 NTSTATUS
1695 NTAPI
1696 RtlQueryEnvironmentVariable_U(
1697 PWSTR Environment,
1698 PUNICODE_STRING Name,
1699 PUNICODE_STRING Value
1700 );
1701
1702 NTSYSAPI
1703 NTSTATUS
1704 NTAPI
1705 RtlSetCurrentDirectory_U(PUNICODE_STRING name);
1706
1707 NTSYSAPI
1708 NTSTATUS
1709 NTAPI
1710 RtlSetEnvironmentVariable(
1711 PWSTR *Environment,
1712 PUNICODE_STRING Name,
1713 PUNICODE_STRING Value
1714 );
1715
1716 //
1717 // Critical Section/Resource Functions
1718 //
1719 NTSYSAPI
1720 NTSTATUS
1721 NTAPI
1722 RtlDeleteCriticalSection (
1723 IN PRTL_CRITICAL_SECTION CriticalSection
1724 );
1725
1726 NTSYSAPI
1727 NTSTATUS
1728 NTAPI
1729 RtlEnterCriticalSection(
1730 IN PRTL_CRITICAL_SECTION CriticalSection
1731 );
1732
1733 NTSYSAPI
1734 NTSTATUS
1735 NTAPI
1736 RtlInitializeCriticalSection(
1737 IN PRTL_CRITICAL_SECTION CriticalSection
1738 );
1739
1740 NTSYSAPI
1741 NTSTATUS
1742 NTAPI
1743 RtlInitializeCriticalSectionAndSpinCount(
1744 IN PRTL_CRITICAL_SECTION CriticalSection,
1745 IN ULONG SpinCount
1746 );
1747
1748 NTSYSAPI
1749 NTSTATUS
1750 NTAPI
1751 RtlLeaveCriticalSection(
1752 IN PRTL_CRITICAL_SECTION CriticalSection
1753 );
1754
1755 NTSYSAPI
1756 VOID
1757 NTAPI
1758 RtlpUnWaitCriticalSection(
1759 IN PRTL_CRITICAL_SECTION CriticalSection
1760 );
1761
1762 NTSYSAPI
1763 NTSTATUS
1764 NTAPI
1765 RtlpWaitForCriticalSection(
1766 IN PRTL_CRITICAL_SECTION CriticalSection
1767 );
1768
1769 NTSYSAPI
1770 BOOLEAN
1771 NTAPI
1772 RtlAcquireResourceExclusive(
1773 IN PRTL_RESOURCE Resource,
1774 IN BOOLEAN Wait
1775 );
1776
1777 NTSYSAPI
1778 BOOLEAN
1779 NTAPI
1780 RtlAcquireResourceShared(
1781 IN PRTL_RESOURCE Resource,
1782 IN BOOLEAN Wait
1783 );
1784
1785 NTSYSAPI
1786 VOID
1787 NTAPI
1788 RtlConvertExclusiveToShared(
1789 IN PRTL_RESOURCE Resource
1790 );
1791
1792 NTSYSAPI
1793 VOID
1794 NTAPI
1795 RtlConvertSharedToExclusive(
1796 IN PRTL_RESOURCE Resource
1797 );
1798
1799 NTSYSAPI
1800 VOID
1801 NTAPI
1802 RtlDeleteResource(
1803 IN PRTL_RESOURCE Resource
1804 );
1805
1806 NTSYSAPI
1807 VOID
1808 NTAPI
1809 RtlDumpResource(
1810 IN PRTL_RESOURCE Resource
1811 );
1812
1813 NTSYSAPI
1814 VOID
1815 NTAPI
1816 RtlInitializeResource(
1817 IN PRTL_RESOURCE Resource
1818 );
1819
1820 NTSYSAPI
1821 VOID
1822 NTAPI
1823 RtlReleaseResource(
1824 IN PRTL_RESOURCE Resource
1825 );
1826
1827 //
1828 // Compression Functions
1829 //
1830 NTSYSAPI
1831 NTSTATUS
1832 NTAPI
1833 RtlCompressBuffer(
1834 IN USHORT CompressionFormatAndEngine,
1835 IN PUCHAR UncompressedBuffer,
1836 IN ULONG UncompressedBufferSize,
1837 OUT PUCHAR CompressedBuffer,
1838 IN ULONG CompressedBufferSize,
1839 IN ULONG UncompressedChunkSize,
1840 OUT PULONG FinalCompressedSize,
1841 IN PVOID WorkSpace
1842 );
1843
1844 NTSYSAPI
1845 NTSTATUS
1846 NTAPI
1847 RtlDecompressBuffer(
1848 IN USHORT CompressionFormat,
1849 OUT PUCHAR UncompressedBuffer,
1850 IN ULONG UncompressedBufferSize,
1851 IN PUCHAR CompressedBuffer,
1852 IN ULONG CompressedBufferSize,
1853 OUT PULONG FinalUncompressedSize
1854 );
1855
1856 NTSYSAPI
1857 NTSTATUS
1858 NTAPI
1859 RtlGetCompressionWorkSpaceSize(
1860 IN USHORT CompressionFormatAndEngine,
1861 OUT PULONG CompressBufferWorkSpaceSize,
1862 OUT PULONG CompressFragmentWorkSpaceSize
1863 );
1864
1865 //
1866 // Debug Info Functions
1867 //
1868 NTSYSAPI
1869 PRTL_DEBUG_BUFFER
1870 NTAPI
1871 RtlCreateQueryDebugBuffer(
1872 IN ULONG Size,
1873 IN BOOLEAN EventPair
1874 );
1875
1876 NTSYSAPI
1877 NTSTATUS
1878 NTAPI
1879 RtlDestroyQueryDebugBuffer(IN PRTL_DEBUG_BUFFER DebugBuffer);
1880
1881 NTSYSAPI
1882 NTSTATUS
1883 NTAPI
1884 RtlQueryProcessDebugInformation(
1885 IN ULONG ProcessId,
1886 IN ULONG DebugInfoClassMask,
1887 IN OUT PRTL_DEBUG_BUFFER DebugBuffer
1888 );
1889
1890 //
1891 // Bitmap Functions
1892 //
1893 NTSYSAPI
1894 BOOLEAN
1895 NTAPI
1896 RtlAreBitsClear(
1897 IN PRTL_BITMAP BitMapHeader,
1898 IN ULONG StartingIndex,
1899 IN ULONG Length
1900 );
1901
1902 NTSYSAPI
1903 BOOLEAN
1904 NTAPI
1905 RtlAreBitsSet(
1906 IN PRTL_BITMAP BitMapHeader,
1907 IN ULONG StartingIndex,
1908 IN ULONG Length
1909 );
1910
1911 NTSYSAPI
1912 VOID
1913 NTAPI
1914 RtlClearBits(
1915 IN PRTL_BITMAP BitMapHeader,
1916 IN ULONG StartingIndex,
1917 IN ULONG NumberToClear
1918 );
1919
1920 NTSYSAPI
1921 ULONG
1922 NTAPI
1923 RtlFindClearBits(
1924 IN PRTL_BITMAP BitMapHeader,
1925 IN ULONG NumberToFind,
1926 IN ULONG HintIndex
1927 );
1928
1929 NTSYSAPI
1930 ULONG
1931 NTAPI
1932 RtlFindClearBitsAndSet(
1933 IN PRTL_BITMAP BitMapHeader,
1934 IN ULONG NumberToFind,
1935 IN ULONG HintIndex
1936 );
1937
1938 NTSYSAPI
1939 VOID
1940 NTAPI
1941 RtlInitializeBitMap(
1942 IN PRTL_BITMAP BitMapHeader,
1943 IN PULONG BitMapBuffer,
1944 IN ULONG SizeOfBitMap
1945 );
1946
1947 NTSYSAPI
1948 VOID
1949 NTAPI
1950 RtlSetBits (
1951 IN PRTL_BITMAP BitMapHeader,
1952 IN ULONG StartingIndex,
1953 IN ULONG NumberToSet
1954 );
1955
1956 //
1957 // Timer Functions
1958 //
1959 NTSYSAPI
1960 NTSTATUS
1961 NTAPI
1962 RtlCreateTimer(
1963 HANDLE TimerQueue,
1964 PHANDLE phNewTimer,
1965 WAITORTIMERCALLBACKFUNC Callback,
1966 PVOID Parameter,
1967 ULONG DueTime,
1968 ULONG Period,
1969 ULONG Flags
1970 );
1971
1972 NTSYSAPI
1973 NTSTATUS
1974 NTAPI
1975 RtlCreateTimerQueue(PHANDLE TimerQueue);
1976
1977 NTSYSAPI
1978 NTSTATUS
1979 NTAPI
1980 RtlDeleteTimer(
1981 HANDLE TimerQueue,
1982 HANDLE Timer,
1983 HANDLE CompletionEvent
1984 );
1985
1986 NTSYSAPI
1987 NTSTATUS
1988 NTAPI
1989 RtlUpdateTimer(
1990 HANDLE TimerQueue,
1991 HANDLE Timer,
1992 ULONG DueTime,
1993 ULONG Period
1994 );
1995
1996 NTSYSAPI
1997 NTSTATUS
1998 NTAPI
1999 RtlDeleteTimerQueueEx(
2000 HANDLE TimerQueue,
2001 HANDLE CompletionEvent
2002 );
2003
2004 NTSYSAPI
2005 NTSTATUS
2006 NTAPI
2007 RtlDeleteTimerQueue(HANDLE TimerQueue);
2008
2009 //
2010 // Debug Functions
2011 //
2012 ULONG
2013 __cdecl
2014 DbgPrint(
2015 IN PCH Format,
2016 IN ...
2017 );
2018
2019 VOID
2020 NTAPI
2021 DbgBreakPoint(VOID);
2022
2023 //
2024 // Handle Table Functions
2025 //
2026 NTSYSAPI
2027 PRTL_HANDLE_TABLE_ENTRY
2028 NTAPI
2029 RtlAllocateHandle(
2030 IN PRTL_HANDLE_TABLE HandleTable,
2031 IN OUT PULONG Index
2032 );
2033
2034 NTSYSAPI
2035 VOID
2036 NTAPI
2037 RtlDestroyHandleTable(IN PRTL_HANDLE_TABLE HandleTable);
2038
2039 NTSYSAPI
2040 BOOLEAN
2041 NTAPI
2042 RtlFreeHandle(
2043 IN PRTL_HANDLE_TABLE HandleTable,
2044 IN PRTL_HANDLE_TABLE_ENTRY Handle
2045 );
2046
2047 NTSYSAPI
2048 VOID
2049 NTAPI
2050 RtlInitializeHandleTable(
2051 IN ULONG TableSize,
2052 IN ULONG HandleSize,
2053 IN PRTL_HANDLE_TABLE HandleTable
2054 );
2055
2056 NTSYSAPI
2057 BOOLEAN
2058 NTAPI
2059 RtlIsValidHandle(
2060 IN PRTL_HANDLE_TABLE HandleTable,
2061 IN PRTL_HANDLE_TABLE_ENTRY Handle
2062 );
2063
2064 NTSYSAPI
2065 BOOLEAN
2066 NTAPI
2067 RtlIsValidIndexHandle(
2068 IN PRTL_HANDLE_TABLE HandleTable,
2069 IN ULONG Index,
2070 OUT PRTL_HANDLE_TABLE_ENTRY *Handle
2071 );
2072
2073 //
2074 // PE Functions
2075 //
2076 NTSYSAPI
2077 NTSTATUS
2078 NTAPI
2079 RtlFindMessage(
2080 IN PVOID BaseAddress,
2081 IN ULONG Type,
2082 IN ULONG Language,
2083 IN ULONG MessageId,
2084 OUT PRTL_MESSAGE_RESOURCE_ENTRY *MessageResourceEntry
2085 );
2086
2087 NTSYSAPI
2088 ULONG
2089 NTAPI
2090 RtlGetNtGlobalFlags(VOID);
2091
2092 NTSYSAPI
2093 PVOID
2094 NTAPI
2095 RtlImageDirectoryEntryToData(
2096 PVOID BaseAddress,
2097 BOOLEAN bFlag,
2098 ULONG Directory,
2099 PULONG Size
2100 );
2101
2102 NTSYSAPI
2103 PVOID
2104 NTAPI
2105 RtlImageRvaToVa(
2106 PIMAGE_NT_HEADERS NtHeader,
2107 PVOID BaseAddress,
2108 ULONG Rva,
2109 PIMAGE_SECTION_HEADER *SectionHeader
2110 );
2111
2112 NTSYSAPI
2113 PIMAGE_NT_HEADERS
2114 NTAPI
2115 RtlImageNtHeader(IN PVOID BaseAddress);
2116
2117 NTSYSAPI
2118 PIMAGE_SECTION_HEADER
2119 NTAPI
2120 RtlImageRvaToSection(
2121 PIMAGE_NT_HEADERS NtHeader,
2122 PVOID BaseAddress,
2123 ULONG Rva
2124 );
2125
2126 //
2127 // Registry Functions
2128 //
2129 NTSYSAPI
2130 NTSTATUS
2131 NTAPI
2132 RtlCheckRegistryKey(
2133 ULONG RelativeTo,
2134 PWSTR Path
2135 );
2136
2137 NTSYSAPI
2138 NTSTATUS
2139 NTAPI
2140 RtlFormatCurrentUserKeyPath(IN OUT PUNICODE_STRING KeyPath);
2141
2142 NTSYSAPI
2143 NTSTATUS
2144 NTAPI
2145 RtlpNtOpenKey(
2146 OUT HANDLE KeyHandle,
2147 IN ACCESS_MASK DesiredAccess,
2148 IN POBJECT_ATTRIBUTES ObjectAttributes,
2149 IN ULONG Unused
2150 );
2151
2152 NTSYSAPI
2153 NTSTATUS
2154 NTAPI
2155 RtlOpenCurrentUser(
2156 IN ACCESS_MASK DesiredAccess,
2157 OUT PHANDLE KeyHandle
2158 );
2159
2160 NTSYSAPI
2161 NTSTATUS
2162 NTAPI
2163 RtlQueryRegistryValues(
2164 IN ULONG RelativeTo,
2165 IN PCWSTR Path,
2166 IN PRTL_QUERY_REGISTRY_TABLE QueryTable,
2167 IN PVOID Context,
2168 IN PVOID Environment
2169 );
2170
2171 NTSYSAPI
2172 NTSTATUS
2173 NTAPI
2174 RtlWriteRegistryValue(
2175 ULONG RelativeTo,
2176 PCWSTR Path,
2177 PCWSTR ValueName,
2178 ULONG ValueType,
2179 PVOID ValueData,
2180 ULONG ValueLength
2181 );
2182
2183 //
2184 // NLS Functions
2185 //
2186 NTSYSAPI
2187 VOID
2188 NTAPI
2189 RtlInitNlsTables(
2190 IN PUSHORT AnsiTableBase,
2191 IN PUSHORT OemTableBase,
2192 IN PUSHORT CaseTableBase,
2193 OUT PNLSTABLEINFO NlsTable
2194 );
2195
2196 NTSYSAPI
2197 VOID
2198 NTAPI
2199 RtlInitCodePageTable(
2200 IN PUSHORT TableBase,
2201 OUT PCPTABLEINFO CodePageTable
2202 );
2203
2204 NTSYSAPI
2205 VOID
2206 NTAPI
2207 RtlResetRtlTranslations(IN PNLSTABLEINFO NlsTable);
2208
2209 #if defined(NTOS_MODE_USER) && !defined(NO_RTL_INLINES)
2210
2211 //
2212 // Misc conversion functions
2213 //
2214 static __inline
2215 LARGE_INTEGER
2216 NTAPI_INLINE
2217 RtlConvertLongToLargeInteger(
2218 LONG SignedInteger
2219 )
2220 {
2221 LARGE_INTEGER Result;
2222
2223 Result.QuadPart = SignedInteger;
2224 return Result;
2225 }
2226
2227 static __inline
2228 LARGE_INTEGER
2229 NTAPI_INLINE
2230 RtlEnlargedIntegerMultiply(
2231 LONG Multiplicand,
2232 LONG Multiplier
2233 )
2234 {
2235 LARGE_INTEGER Product;
2236
2237 Product.QuadPart = (LONGLONG)Multiplicand * (ULONGLONG)Multiplier;
2238 return Product;
2239 }
2240
2241 static __inline
2242 ULONG
2243 NTAPI_INLINE
2244 RtlEnlargedUnsignedDivide(
2245 IN ULARGE_INTEGER Dividend,
2246 IN ULONG Divisor,
2247 IN PULONG Remainder OPTIONAL
2248 )
2249 {
2250 ULONG Quotient;
2251
2252 Quotient = (ULONG)(Dividend.QuadPart / Divisor);
2253 if (Remainder) {
2254 *Remainder = (ULONG)(Dividend.QuadPart % Divisor);
2255 }
2256
2257 return Quotient;
2258 }
2259
2260 static __inline
2261 LARGE_INTEGER
2262 NTAPI_INLINE
2263 RtlEnlargedUnsignedMultiply(
2264 ULONG Multiplicand,
2265 ULONG Multiplier
2266 )
2267 {
2268 LARGE_INTEGER Product;
2269
2270 Product.QuadPart = (ULONGLONG)Multiplicand * (ULONGLONG)Multiplier;
2271 return Product;
2272 }
2273 #endif
2274
2275 NTSYSAPI
2276 ULONG
2277 NTAPI
2278 RtlUniform(PULONG Seed);
2279
2280 //
2281 // Network Functions
2282 //
2283 NTSYSAPI
2284 NTSTATUS
2285 NTAPI
2286 RtlIpv4StringToAddressW(
2287 IN LPWSTR IpString,
2288 IN ULONG Base,
2289 OUT PULONG PtrToIpAddr,
2290 OUT PULONG IpAddr
2291 );
2292
2293 NTSYSAPI
2294 NTSTATUS
2295 NTAPI
2296 RtlIpv6StringToAddressA(
2297 IN LPSTR Name,
2298 OUT PULONG Unknown,
2299 OUT PVOID IpAddr
2300 );
2301
2302 NTSYSAPI
2303 NTSTATUS
2304 NTAPI
2305 RtlIpv6StringToAddressW(
2306 IN LPWSTR Name,
2307 OUT PULONG Unknown,
2308 OUT PVOID IpAddr
2309 );
2310
2311 NTSYSAPI
2312 NTSTATUS
2313 NTAPI
2314 RtlIpv6StringToAddressExA(
2315 IN LPSTR AddressName,
2316 IN PVOID Address,
2317 IN PULONG ScopeId,
2318 IN PUSHORT Port
2319 );
2320
2321 NTSYSAPI
2322 NTSTATUS
2323 NTAPI
2324 RtlIpv6StringToAddressExW(
2325 IN LPWSTR AddressName,
2326 IN PVOID Address,
2327 IN PULONG ScopeId,
2328 IN PUSHORT Port
2329 );
2330
2331
2332 //
2333 // Time Functions
2334 //
2335 NTSYSAPI
2336 NTSTATUS
2337 NTAPI
2338 RtlQueryTimeZoneInformation(LPTIME_ZONE_INFORMATION TimeZoneInformation);
2339
2340 NTSYSAPI
2341 VOID
2342 NTAPI
2343 RtlSecondsSince1970ToTime(
2344 IN ULONG SecondsSince1970,
2345 OUT PLARGE_INTEGER Time
2346 );
2347
2348 NTSYSAPI
2349 NTSTATUS
2350 NTAPI
2351 RtlSetTimeZoneInformation(LPTIME_ZONE_INFORMATION TimeZoneInformation);
2352
2353 NTSYSAPI
2354 BOOLEAN
2355 NTAPI
2356 RtlTimeFieldsToTime(
2357 PTIME_FIELDS TimeFields,
2358 PLARGE_INTEGER Time
2359 );
2360
2361 NTSYSAPI
2362 VOID
2363 NTAPI
2364 RtlTimeToTimeFields(
2365 PLARGE_INTEGER Time,
2366 PTIME_FIELDS TimeFields
2367 );
2368
2369 //
2370 // Version Functions
2371 //
2372 NTSYSAPI
2373 NTSTATUS
2374 NTAPI
2375 RtlVerifyVersionInfo(
2376 IN PRTL_OSVERSIONINFOEXW VersionInfo,
2377 IN ULONG TypeMask,
2378 IN ULONGLONG ConditionMask
2379 );
2380
2381 NTSYSAPI
2382 NTSTATUS
2383 NTAPI
2384 RtlGetVersion(IN OUT PRTL_OSVERSIONINFOW lpVersionInformation);
2385
2386 NTSYSAPI
2387 BOOLEAN
2388 NTAPI
2389 RtlGetNtProductType(OUT PNT_PRODUCT_TYPE ProductType);
2390
2391 #endif