- Get rid of DDK's dependency on windef.h and winnt.h
[reactos.git] / reactos / include / ndk / rtlfuncs.h
1 /*++ NDK Version: 0098
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 (alexi@tinykrnl.org) - Updated - 27-Feb-2006
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 <rtltypes.h>
28 #include <extypes.h>
29 #include "in6addr.h"
30 #include "inaddr.h"
31
32 #ifdef __cplusplus
33 extern "C" {
34 #endif
35
36 #ifdef NTOS_MODE_USER
37
38 //
39 // List Functions
40 //
41 FORCEINLINE
42 VOID
43 InitializeListHead(
44 IN PLIST_ENTRY ListHead
45 )
46 {
47 ListHead->Flink = ListHead->Blink = ListHead;
48 }
49
50 FORCEINLINE
51 VOID
52 InsertHeadList(
53 IN PLIST_ENTRY ListHead,
54 IN PLIST_ENTRY Entry
55 )
56 {
57 PLIST_ENTRY OldFlink;
58 OldFlink = ListHead->Flink;
59 Entry->Flink = OldFlink;
60 Entry->Blink = ListHead;
61 OldFlink->Blink = Entry;
62 ListHead->Flink = Entry;
63 }
64
65 FORCEINLINE
66 VOID
67 InsertTailList(
68 IN PLIST_ENTRY ListHead,
69 IN PLIST_ENTRY Entry
70 )
71 {
72 PLIST_ENTRY OldBlink;
73 OldBlink = ListHead->Blink;
74 Entry->Flink = ListHead;
75 Entry->Blink = OldBlink;
76 OldBlink->Flink = Entry;
77 ListHead->Blink = Entry;
78 }
79
80 BOOLEAN
81 FORCEINLINE
82 IsListEmpty(
83 IN const LIST_ENTRY * ListHead
84 )
85 {
86 return (BOOLEAN)(ListHead->Flink == ListHead);
87 }
88
89 FORCEINLINE
90 PSINGLE_LIST_ENTRY
91 PopEntryList(
92 PSINGLE_LIST_ENTRY ListHead
93 )
94 {
95 PSINGLE_LIST_ENTRY FirstEntry;
96 FirstEntry = ListHead->Next;
97 if (FirstEntry != NULL) {
98 ListHead->Next = FirstEntry->Next;
99 }
100
101 return FirstEntry;
102 }
103
104 FORCEINLINE
105 VOID
106 PushEntryList(
107 PSINGLE_LIST_ENTRY ListHead,
108 PSINGLE_LIST_ENTRY Entry
109 )
110 {
111 Entry->Next = ListHead->Next;
112 ListHead->Next = Entry;
113 }
114
115 FORCEINLINE
116 BOOLEAN
117 RemoveEntryList(
118 IN PLIST_ENTRY Entry)
119 {
120 PLIST_ENTRY OldFlink;
121 PLIST_ENTRY OldBlink;
122
123 OldFlink = Entry->Flink;
124 OldBlink = Entry->Blink;
125 OldFlink->Blink = OldBlink;
126 OldBlink->Flink = OldFlink;
127 return (BOOLEAN)(OldFlink == OldBlink);
128 }
129
130 FORCEINLINE
131 PLIST_ENTRY
132 RemoveHeadList(
133 IN PLIST_ENTRY ListHead)
134 {
135 PLIST_ENTRY Flink;
136 PLIST_ENTRY Entry;
137
138 Entry = ListHead->Flink;
139 Flink = Entry->Flink;
140 ListHead->Flink = Flink;
141 Flink->Blink = ListHead;
142 return Entry;
143 }
144
145 FORCEINLINE
146 PLIST_ENTRY
147 RemoveTailList(
148 IN PLIST_ENTRY ListHead)
149 {
150 PLIST_ENTRY Blink;
151 PLIST_ENTRY Entry;
152
153 Entry = ListHead->Blink;
154 Blink = Entry->Blink;
155 ListHead->Blink = Blink;
156 Blink->Flink = ListHead;
157 return Entry;
158 }
159
160 //
161 // Unicode string macros
162 //
163 FORCEINLINE
164 VOID
165 RtlInitEmptyUnicodeString(OUT PUNICODE_STRING UnicodeString,
166 IN PWSTR Buffer,
167 IN USHORT BufferSize)
168 {
169 UnicodeString->Length = 0;
170 UnicodeString->MaximumLength = BufferSize;
171 UnicodeString->Buffer = Buffer;
172 }
173
174 //
175 // LUID Macros
176 //
177 #define RtlEqualLuid(L1, L2) (((L1)->HighPart == (L2)->HighPart) && \
178 ((L1)->LowPart == (L2)->LowPart))
179 FORCEINLINE
180 LUID
181 NTAPI_INLINE
182 RtlConvertUlongToLuid(ULONG Ulong)
183 {
184 LUID TempLuid;
185
186 TempLuid.LowPart = Ulong;
187 TempLuid.HighPart = 0;
188 return TempLuid;
189 }
190
191 //
192 // ASSERT Macros
193 //
194 #ifndef ASSERT
195 #if DBG
196
197 #define ASSERT( exp ) \
198 ((void)((!(exp)) ? \
199 (RtlAssert( #exp, __FILE__, __LINE__, NULL ),FALSE) : \
200 TRUE))
201
202 #define ASSERTMSG( msg, exp ) \
203 ((void)((!(exp)) ? \
204 (RtlAssert( #exp, __FILE__, __LINE__, msg ),FALSE) : \
205 TRUE))
206
207 #else
208
209 #define ASSERT( exp ) ((void) 0)
210 #define ASSERTMSG( msg, exp ) ((void) 0)
211
212 #endif
213 #endif
214
215 #ifdef NTOS_KERNEL_RUNTIME
216
217 //
218 // Executing RTL functions at DISPATCH_LEVEL or higher will result in a
219 // bugcheck.
220 //
221 #define RTL_PAGED_CODE PAGED_CODE
222
223 #else
224
225 //
226 // This macro does nothing in user mode
227 //
228 #define RTL_PAGED_CODE NOP_FUNCTION
229
230 #endif
231
232 //
233 // RTL Splay Tree Functions
234 //
235 NTSYSAPI
236 PRTL_SPLAY_LINKS
237 NTAPI
238 RtlSplay(
239 IN PRTL_SPLAY_LINKS Links
240 );
241
242 NTSYSAPI
243 PRTL_SPLAY_LINKS
244 NTAPI
245 RtlDelete(IN PRTL_SPLAY_LINKS Links
246 );
247
248 NTSYSAPI
249 VOID
250 NTAPI
251 RtlDeleteNoSplay(
252 IN PRTL_SPLAY_LINKS Links,
253 OUT PRTL_SPLAY_LINKS *Root
254 );
255
256 NTSYSAPI
257 PRTL_SPLAY_LINKS
258 NTAPI
259 RtlSubtreeSuccessor(
260 IN PRTL_SPLAY_LINKS Links
261 );
262
263 NTSYSAPI
264 PRTL_SPLAY_LINKS
265 NTAPI
266 RtlSubtreePredecessor(
267 IN PRTL_SPLAY_LINKS Links
268 );
269
270 NTSYSAPI
271 PRTL_SPLAY_LINKS
272 NTAPI
273 RtlRealSuccessor(
274 IN PRTL_SPLAY_LINKS Links
275 );
276
277 NTSYSAPI
278 PRTL_SPLAY_LINKS
279 NTAPI
280 RtlRealPredecessor(
281 IN PRTL_SPLAY_LINKS Links
282 );
283
284 #define RtlIsLeftChild(Links) \
285 (RtlLeftChild(RtlParent(Links)) == (PRTL_SPLAY_LINKS)(Links))
286
287 #define RtlIsRightChild(Links) \
288 (RtlRightChild(RtlParent(Links)) == (PRTL_SPLAY_LINKS)(Links))
289
290 #define RtlRightChild(Links) \
291 ((PRTL_SPLAY_LINKS)(Links))->RightChild
292
293 #define RtlIsRoot(Links) \
294 (RtlParent(Links) == (PRTL_SPLAY_LINKS)(Links))
295
296 #define RtlLeftChild(Links) \
297 ((PRTL_SPLAY_LINKS)(Links))->LeftChild
298
299 #define RtlParent(Links) \
300 ((PRTL_SPLAY_LINKS)(Links))->Parent
301
302 #define RtlInitializeSplayLinks(Links) \
303 { \
304 PRTL_SPLAY_LINKS _SplayLinks; \
305 _SplayLinks = (PRTL_SPLAY_LINKS)(Links); \
306 _SplayLinks->Parent = _SplayLinks; \
307 _SplayLinks->LeftChild = NULL; \
308 _SplayLinks->RightChild = NULL; \
309 }
310
311 #define RtlInsertAsLeftChild(ParentLinks,ChildLinks) \
312 { \
313 PRTL_SPLAY_LINKS _SplayParent; \
314 PRTL_SPLAY_LINKS _SplayChild; \
315 _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks); \
316 _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks); \
317 _SplayParent->LeftChild = _SplayChild; \
318 _SplayChild->Parent = _SplayParent; \
319 }
320
321 #define RtlInsertAsRightChild(ParentLinks,ChildLinks) \
322 { \
323 PRTL_SPLAY_LINKS _SplayParent; \
324 PRTL_SPLAY_LINKS _SplayChild; \
325 _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks); \
326 _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks); \
327 _SplayParent->RightChild = _SplayChild; \
328 _SplayChild->Parent = _SplayParent; \
329 }
330 #endif
331
332 //
333 // Error and Exception Functions
334 //
335 NTSYSAPI
336 PVOID
337 NTAPI
338 RtlAddVectoredExceptionHandler(
339 IN ULONG FirstHandler,
340 IN PVECTORED_EXCEPTION_HANDLER VectoredHandler
341 );
342
343 NTSYSAPI
344 VOID
345 NTAPI
346 RtlAssert(
347 IN PVOID FailedAssertion,
348 IN PVOID FileName,
349 IN ULONG LineNumber,
350 IN PCHAR Message
351 );
352
353 NTSYSAPI
354 PVOID
355 NTAPI
356 RtlSetUnhandledExceptionFilter(
357 IN PVOID TopLevelExceptionFilter
358 );
359
360 NTSYSAPI
361 VOID
362 NTAPI
363 RtlCaptureContext(
364 OUT PCONTEXT ContextRecord
365 );
366
367 NTSYSAPI
368 PVOID
369 NTAPI
370 RtlEncodePointer(
371 IN PVOID Pointer
372 );
373
374 NTSYSAPI
375 PVOID
376 NTAPI
377 RtlDecodePointer(
378 IN PVOID Pointer
379 );
380
381 NTSYSAPI
382 PVOID
383 NTAPI
384 RtlEncodeSystemPointer(
385 IN PVOID Pointer
386 );
387
388 NTSYSAPI
389 PVOID
390 NTAPI
391 RtlDecodeSystemPointer(
392 IN PVOID Pointer
393 );
394
395 NTSYSAPI
396 BOOLEAN
397 NTAPI
398 RtlDispatchException(
399 IN PEXCEPTION_RECORD ExceptionRecord,
400 IN PCONTEXT Context
401 );
402
403 NTSYSAPI
404 ULONG
405 NTAPI
406 RtlNtStatusToDosError(
407 IN NTSTATUS Status
408 );
409
410 NTSYSAPI
411 ULONG
412 NTAPI
413 RtlNtStatusToDosErrorNoTeb(
414 IN NTSTATUS Status
415 );
416
417 NTSYSAPI
418 VOID
419 NTAPI
420 RtlSetLastWin32ErrorAndNtStatusFromNtStatus(
421 IN NTSTATUS Status
422 );
423
424 NTSYSAPI
425 VOID
426 NTAPI
427 RtlRaiseException(
428 IN PEXCEPTION_RECORD ExceptionRecord
429 );
430
431 NTSYSAPI
432 VOID
433 NTAPI
434 __declspec(noreturn)
435 RtlRaiseStatus(
436 IN NTSTATUS Status
437 );
438
439 NTSYSAPI
440 LONG
441 NTAPI
442 RtlUnhandledExceptionFilter(
443 IN struct _EXCEPTION_POINTERS* ExceptionInfo
444 );
445
446 NTSYSAPI
447 VOID
448 NTAPI
449 RtlUnwind(
450 IN PVOID TargetFrame OPTIONAL,
451 IN PVOID TargetIp OPTIONAL,
452 IN PEXCEPTION_RECORD ExceptionRecord OPTIONAL,
453 IN PVOID ReturnValue
454 );
455
456 //
457 // Tracing Functions
458 //
459 NTSYSAPI
460 ULONG
461 NTAPI
462 RtlWalkFrameChain(
463 OUT PVOID *Callers,
464 IN ULONG Count,
465 IN ULONG Flags
466 );
467
468 NTSYSAPI
469 USHORT
470 NTAPI
471 RtlLogStackBackTrace(
472 VOID
473 );
474
475 //
476 // Heap Functions
477 //
478 NTSYSAPI
479 PVOID
480 NTAPI
481 RtlAllocateHeap(
482 IN HANDLE HeapHandle,
483 IN ULONG Flags,
484 IN ULONG Size
485 );
486
487 NTSYSAPI
488 PVOID
489 NTAPI
490 RtlCreateHeap(
491 IN ULONG Flags,
492 IN PVOID BaseAddress OPTIONAL,
493 IN SIZE_T SizeToReserve OPTIONAL,
494 IN SIZE_T SizeToCommit OPTIONAL,
495 IN PVOID Lock OPTIONAL,
496 IN PRTL_HEAP_PARAMETERS Parameters OPTIONAL
497 );
498
499 NTSYSAPI
500 ULONG
501 NTAPI
502 RtlCreateTagHeap(
503 IN HANDLE HeapHandle,
504 IN ULONG Flags,
505 IN PWSTR TagName,
506 IN PWSTR TagSubName
507 );
508
509 ULONG
510 NTAPI
511 RtlCompactHeap(
512 HANDLE Heap,
513 ULONG Flags
514 );
515
516 NTSYSAPI
517 PVOID
518 NTAPI
519 RtlDebugCreateHeap(
520 IN ULONG Flags,
521 IN PVOID BaseAddress OPTIONAL,
522 IN SIZE_T SizeToReserve OPTIONAL,
523 IN SIZE_T SizeToCommit OPTIONAL,
524 IN PVOID Lock OPTIONAL,
525 IN PRTL_HEAP_PARAMETERS Parameters OPTIONAL
526 );
527
528 NTSYSAPI
529 HANDLE
530 NTAPI
531 RtlDestroyHeap(
532 IN HANDLE Heap
533 );
534
535 NTSYSAPI
536 ULONG
537 NTAPI
538 RtlExtendHeap(
539 IN HANDLE Heap,
540 IN ULONG Flags,
541 IN PVOID P,
542 IN ULONG Size
543 );
544
545 NTSYSAPI
546 BOOLEAN
547 NTAPI
548 RtlFreeHeap(
549 IN HANDLE HeapHandle,
550 IN ULONG Flags,
551 IN PVOID P
552 );
553
554 NTSYSAPI
555 ULONG
556 NTAPI
557 RtlGetNtGlobalFlags(
558 VOID
559 );
560
561 ULONG
562 NTAPI
563 RtlGetProcessHeaps(
564 ULONG HeapCount,
565 HANDLE *HeapArray
566 );
567
568 BOOLEAN
569 NTAPI
570 RtlGetUserInfoHeap(
571 IN PVOID HeapHandle,
572 IN ULONG Flags,
573 IN PVOID BaseAddress,
574 OUT PVOID *UserValue,
575 OUT PULONG UserFlags
576 );
577
578 NTSYSAPI
579 PVOID
580 NTAPI
581 RtlProtectHeap(
582 IN PVOID HeapHandle,
583 IN BOOLEAN Protect
584 );
585
586 NTSYSAPI
587 PWSTR
588 NTAPI
589 RtlQueryTagHeap(
590 IN PVOID HeapHandle,
591 IN ULONG Flags,
592 IN USHORT TagIndex,
593 IN BOOLEAN ResetCounters,
594 OUT PRTL_HEAP_TAG_INFO HeapTagInfo
595 );
596
597 NTSYSAPI
598 PVOID
599 NTAPI
600 RtlReAllocateHeap(
601 HANDLE Heap,
602 ULONG Flags,
603 PVOID Ptr,
604 SIZE_T Size
605 );
606
607 NTSYSAPI
608 BOOLEAN
609 NTAPI
610 RtlLockHeap(
611 IN HANDLE Heap
612 );
613
614 NTSYSAPI
615 NTSTATUS
616 NTAPI
617 RtlUsageHeap(
618 IN HANDLE Heap,
619 IN ULONG Flags,
620 OUT PRTL_HEAP_USAGE Usage
621 );
622
623 NTSYSAPI
624 BOOLEAN
625 NTAPI
626 RtlUnlockHeap(
627 IN HANDLE Heap
628 );
629
630 BOOLEAN
631 NTAPI
632 RtlSetUserValueHeap(
633 IN PVOID HeapHandle,
634 IN ULONG Flags,
635 IN PVOID BaseAddress,
636 IN PVOID UserValue
637 );
638
639 BOOLEAN
640 NTAPI
641 RtlSetUserFlagsHeap(
642 IN PVOID HeapHandle,
643 IN ULONG Flags,
644 IN PVOID BaseAddress,
645 IN ULONG UserFlags
646 );
647
648 NTSYSAPI
649 ULONG
650 NTAPI
651 RtlSizeHeap(
652 IN PVOID HeapHandle,
653 IN ULONG Flags,
654 IN PVOID MemoryPointer
655 );
656
657 NTSYSAPI
658 BOOLEAN
659 NTAPI
660 RtlValidateHeap(
661 HANDLE Heap,
662 ULONG Flags,
663 PVOID P
664 );
665
666 NTSYSAPI
667 NTSTATUS
668 NTAPI
669 RtlWalkHeap(
670 IN HANDLE HeapHandle,
671 IN PVOID HeapEntry
672 );
673
674 #define RtlGetProcessHeap() (NtCurrentPeb()->ProcessHeap)
675
676 //
677 // Security Functions
678 //
679 NTSYSAPI
680 NTSTATUS
681 NTAPI
682 RtlAbsoluteToSelfRelativeSD(
683 IN PSECURITY_DESCRIPTOR AbsoluteSecurityDescriptor,
684 IN OUT PSECURITY_DESCRIPTOR SelfRelativeSecurityDescriptor,
685 IN PULONG BufferLength
686 );
687
688 NTSYSAPI
689 NTSTATUS
690 NTAPI
691 RtlAddAccessAllowedAce(
692 PACL Acl,
693 ULONG Revision,
694 ACCESS_MASK AccessMask,
695 PSID Sid
696 );
697
698 NTSYSAPI
699 NTSTATUS
700 NTAPI
701 RtlAddAccessAllowedAceEx(
702 IN OUT PACL pAcl,
703 IN ULONG dwAceRevision,
704 IN ULONG AceFlags,
705 IN ACCESS_MASK AccessMask,
706 IN PSID pSid
707 );
708
709 NTSYSAPI
710 NTSTATUS
711 NTAPI
712 RtlAddAccessAllowedObjectAce(
713 IN OUT PACL pAcl,
714 IN ULONG dwAceRevision,
715 IN ULONG AceFlags,
716 IN ACCESS_MASK AccessMask,
717 IN GUID *ObjectTypeGuid OPTIONAL,
718 IN GUID *InheritedObjectTypeGuid OPTIONAL,
719 IN PSID pSid
720 );
721
722 NTSYSAPI
723 NTSTATUS
724 NTAPI
725 RtlAddAccessDeniedAce(
726 PACL Acl,
727 ULONG Revision,
728 ACCESS_MASK AccessMask,
729 PSID Sid
730 );
731
732 NTSYSAPI
733 NTSTATUS
734 NTAPI
735 RtlAddAccessDeniedAceEx(
736 IN OUT PACL Acl,
737 IN ULONG Revision,
738 IN ULONG Flags,
739 IN ACCESS_MASK AccessMask,
740 IN PSID Sid
741 );
742
743 NTSYSAPI
744 NTSTATUS
745 NTAPI
746 RtlAddAccessDeniedObjectAce(
747 IN OUT PACL pAcl,
748 IN ULONG dwAceRevision,
749 IN ULONG AceFlags,
750 IN ACCESS_MASK AccessMask,
751 IN GUID *ObjectTypeGuid OPTIONAL,
752 IN GUID *InheritedObjectTypeGuid OPTIONAL,
753 IN PSID pSid
754 );
755
756 NTSYSAPI
757 NTSTATUS
758 NTAPI
759 RtlAddAce(
760 PACL Acl,
761 ULONG AceRevision,
762 ULONG StartingAceIndex,
763 PVOID AceList,
764 ULONG AceListLength
765 );
766
767 NTSYSAPI
768 NTSTATUS
769 NTAPI
770 RtlAddAuditAccessAce(
771 PACL Acl,
772 ULONG Revision,
773 ACCESS_MASK AccessMask,
774 PSID Sid,
775 BOOLEAN Success,
776 BOOLEAN Failure
777 );
778
779 NTSYSAPI
780 NTSTATUS
781 NTAPI
782 RtlAcquirePrivilege(
783 IN PULONG Privilege,
784 IN ULONG NumPriv,
785 IN ULONG Flags,
786 OUT PVOID *ReturnedState
787 );
788
789 NTSYSAPI
790 NTSTATUS
791 NTAPI
792 RtlAddAuditAccessAceEx(
793 IN OUT PACL Acl,
794 IN ULONG Revision,
795 IN ULONG Flags,
796 IN ACCESS_MASK AccessMask,
797 IN PSID Sid,
798 IN BOOLEAN Success,
799 IN BOOLEAN Failure
800 );
801
802 NTSYSAPI
803 NTSTATUS
804 NTAPI
805 RtlAddAuditAccessObjectAce(
806 IN OUT PACL Acl,
807 IN ULONG Revision,
808 IN ULONG Flags,
809 IN ACCESS_MASK AccessMask,
810 IN GUID *ObjectTypeGuid OPTIONAL,
811 IN GUID *InheritedObjectTypeGuid OPTIONAL,
812 IN PSID Sid,
813 IN BOOLEAN Success,
814 IN BOOLEAN Failure
815 );
816
817 NTSYSAPI
818 NTSTATUS
819 NTAPI
820 RtlAddMandatoryAce(
821 IN OUT PACL Acl,
822 IN ULONG Revision,
823 IN ULONG Flags,
824 IN ULONG MandatoryFlags,
825 IN ULONG AceType,
826 IN PSID LabelSid);
827
828 NTSYSAPI
829 NTSTATUS
830 NTAPI
831 RtlAdjustPrivilege(
832 IN ULONG Privilege,
833 IN BOOLEAN NewValue,
834 IN BOOLEAN ForThread,
835 OUT PBOOLEAN OldValue
836 );
837
838 NTSYSAPI
839 NTSTATUS
840 NTAPI
841 RtlAllocateAndInitializeSid(
842 IN PSID_IDENTIFIER_AUTHORITY IdentifierAuthority,
843 IN UCHAR SubAuthorityCount,
844 IN ULONG SubAuthority0,
845 IN ULONG SubAuthority1,
846 IN ULONG SubAuthority2,
847 IN ULONG SubAuthority3,
848 IN ULONG SubAuthority4,
849 IN ULONG SubAuthority5,
850 IN ULONG SubAuthority6,
851 IN ULONG SubAuthority7,
852 OUT PSID *Sid
853 );
854
855 NTSYSAPI
856 BOOLEAN
857 NTAPI
858 RtlAreAllAccessesGranted(
859 ACCESS_MASK GrantedAccess,
860 ACCESS_MASK DesiredAccess
861 );
862
863 NTSYSAPI
864 BOOLEAN
865 NTAPI
866 RtlAreAnyAccessesGranted(
867 ACCESS_MASK GrantedAccess,
868 ACCESS_MASK DesiredAccess
869 );
870
871 NTSYSAPI
872 VOID
873 NTAPI
874 RtlCopyLuid(
875 IN PLUID LuidDest,
876 IN PLUID LuidSrc
877 );
878
879 NTSYSAPI
880 VOID
881 NTAPI
882 RtlCopyLuidAndAttributesArray(
883 ULONG Count,
884 PLUID_AND_ATTRIBUTES Src,
885 PLUID_AND_ATTRIBUTES Dest
886 );
887
888 NTSYSAPI
889 NTSTATUS
890 NTAPI
891 RtlCopySidAndAttributesArray(
892 ULONG Count,
893 PSID_AND_ATTRIBUTES Src,
894 ULONG SidAreaSize,
895 PSID_AND_ATTRIBUTES Dest,
896 PVOID SidArea,
897 PVOID* RemainingSidArea,
898 PULONG RemainingSidAreaSize
899 );
900
901 NTSYSAPI
902 NTSTATUS
903 NTAPI
904 RtlConvertSidToUnicodeString(
905 OUT PUNICODE_STRING DestinationString,
906 IN PSID Sid,
907 IN BOOLEAN AllocateDestinationString
908 );
909
910 NTSYSAPI
911 NTSTATUS
912 NTAPI
913 RtlCopySid(
914 IN ULONG Length,
915 IN PSID Destination,
916 IN PSID Source
917 );
918
919 NTSYSAPI
920 NTSTATUS
921 NTAPI
922 RtlCreateAcl(
923 PACL Acl,
924 ULONG AclSize,
925 ULONG AclRevision
926 );
927
928 NTSYSAPI
929 NTSTATUS
930 NTAPI
931 RtlCreateSecurityDescriptor(
932 OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
933 IN ULONG Revision
934 );
935
936 NTSYSAPI
937 NTSTATUS
938 NTAPI
939 RtlCreateSecurityDescriptorRelative(
940 OUT PISECURITY_DESCRIPTOR_RELATIVE SecurityDescriptor,
941 IN ULONG Revision
942 );
943
944 NTSYSAPI
945 NTSTATUS
946 NTAPI
947 RtlCopySecurityDescriptor(
948 IN PSECURITY_DESCRIPTOR pSourceSecurityDescriptor,
949 OUT PSECURITY_DESCRIPTOR pDestinationSecurityDescriptor
950 );
951
952 NTSYSAPI
953 NTSTATUS
954 NTAPI
955 RtlDeleteAce(
956 PACL Acl,
957 ULONG AceIndex
958 );
959
960 NTSYSAPI
961 BOOLEAN
962 NTAPI
963 RtlEqualPrefixSid(
964 PSID Sid1,
965 PSID Sid2
966 );
967
968 NTSYSAPI
969 BOOLEAN
970 NTAPI
971 RtlEqualSid (
972 IN PSID Sid1,
973 IN PSID Sid2
974 );
975
976 NTSYSAPI
977 BOOLEAN
978 NTAPI
979 RtlFirstFreeAce(
980 PACL Acl,
981 PACE* Ace
982 );
983
984 NTSYSAPI
985 PVOID
986 NTAPI
987 RtlFreeSid (
988 IN PSID Sid
989 );
990
991 NTSYSAPI
992 NTSTATUS
993 NTAPI
994 RtlGetAce(
995 PACL Acl,
996 ULONG AceIndex,
997 PVOID *Ace
998 );
999
1000 NTSYSAPI
1001 NTSTATUS
1002 NTAPI
1003 RtlGetControlSecurityDescriptor(
1004 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
1005 OUT PSECURITY_DESCRIPTOR_CONTROL Control,
1006 OUT PULONG Revision
1007 );
1008
1009 NTSYSAPI
1010 NTSTATUS
1011 NTAPI
1012 RtlGetDaclSecurityDescriptor(
1013 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
1014 OUT PBOOLEAN DaclPresent,
1015 OUT PACL *Dacl,
1016 OUT PBOOLEAN DaclDefaulted
1017 );
1018
1019 NTSYSAPI
1020 NTSTATUS
1021 NTAPI
1022 RtlGetSaclSecurityDescriptor(
1023 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
1024 OUT PBOOLEAN SaclPresent,
1025 OUT PACL* Sacl,
1026 OUT PBOOLEAN SaclDefaulted
1027 );
1028
1029 NTSYSAPI
1030 NTSTATUS
1031 NTAPI
1032 RtlGetGroupSecurityDescriptor(
1033 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
1034 OUT PSID *Group,
1035 OUT PBOOLEAN GroupDefaulted
1036 );
1037
1038 NTSYSAPI
1039 NTSTATUS
1040 NTAPI
1041 RtlGetOwnerSecurityDescriptor(
1042 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
1043 OUT PSID *Owner,
1044 OUT PBOOLEAN OwnerDefaulted
1045 );
1046
1047 NTSYSAPI
1048 BOOLEAN
1049 NTAPI
1050 RtlGetSecurityDescriptorRMControl(
1051 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
1052 OUT PUCHAR RMControl
1053 );
1054
1055 NTSYSAPI
1056 PSID_IDENTIFIER_AUTHORITY
1057 NTAPI
1058 RtlIdentifierAuthoritySid(PSID Sid);
1059
1060 NTSYSAPI
1061 NTSTATUS
1062 NTAPI
1063 RtlImpersonateSelf(IN SECURITY_IMPERSONATION_LEVEL ImpersonationLevel);
1064
1065 NTSYSAPI
1066 NTSTATUS
1067 NTAPI
1068 RtlInitializeSid(
1069 IN OUT PSID Sid,
1070 IN PSID_IDENTIFIER_AUTHORITY IdentifierAuthority,
1071 IN UCHAR SubAuthorityCount
1072 );
1073
1074 NTSYSAPI
1075 ULONG
1076 NTAPI
1077 RtlLengthRequiredSid(IN ULONG SubAuthorityCount);
1078
1079 NTSYSAPI
1080 ULONG
1081 NTAPI
1082 RtlLengthSid(IN PSID Sid);
1083
1084 NTSYSAPI
1085 NTSTATUS
1086 NTAPI
1087 RtlMakeSelfRelativeSD(
1088 IN PSECURITY_DESCRIPTOR AbsoluteSD,
1089 OUT PSECURITY_DESCRIPTOR SelfRelativeSD,
1090 IN OUT PULONG BufferLength);
1091
1092 NTSYSAPI
1093 VOID
1094 NTAPI
1095 RtlMapGenericMask(
1096 PACCESS_MASK AccessMask,
1097 PGENERIC_MAPPING GenericMapping
1098 );
1099
1100 #ifdef NTOS_MODE_USER
1101
1102 NTSYSAPI
1103 NTSTATUS
1104 NTAPI
1105 RtlQueryInformationAcl(
1106 PACL Acl,
1107 PVOID Information,
1108 ULONG InformationLength,
1109 ACL_INFORMATION_CLASS InformationClass
1110 );
1111
1112 #endif
1113
1114 NTSYSAPI
1115 VOID
1116 NTAPI
1117 RtlReleasePrivilege(
1118 IN PVOID ReturnedState
1119 );
1120
1121 NTSYSAPI
1122 NTSTATUS
1123 NTAPI
1124 RtlSelfRelativeToAbsoluteSD(
1125 IN PSECURITY_DESCRIPTOR SelfRelativeSD,
1126 OUT PSECURITY_DESCRIPTOR AbsoluteSD,
1127 IN PULONG AbsoluteSDSize,
1128 IN PACL Dacl,
1129 IN PULONG DaclSize,
1130 IN PACL Sacl,
1131 IN PULONG SaclSize,
1132 IN PSID Owner,
1133 IN PULONG OwnerSize,
1134 IN PSID PrimaryGroup,
1135 IN PULONG PrimaryGroupSize
1136 );
1137
1138 NTSYSAPI
1139 NTSTATUS
1140 NTAPI
1141 RtlSelfRelativeToAbsoluteSD2(
1142 IN OUT PSECURITY_DESCRIPTOR SelfRelativeSD,
1143 OUT PULONG BufferSize
1144 );
1145
1146 NTSYSAPI
1147 NTSTATUS
1148 NTAPI
1149 RtlSetAttributesSecurityDescriptor(
1150 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
1151 IN SECURITY_DESCRIPTOR_CONTROL Control,
1152 OUT PULONG Revision
1153 );
1154
1155 NTSYSAPI
1156 NTSTATUS
1157 NTAPI
1158 RtlSetControlSecurityDescriptor(
1159 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
1160 IN SECURITY_DESCRIPTOR_CONTROL ControlBitsOfInterest,
1161 IN SECURITY_DESCRIPTOR_CONTROL ControlBitsToSet
1162 );
1163
1164 NTSYSAPI
1165 NTSTATUS
1166 NTAPI
1167 RtlSetDaclSecurityDescriptor (
1168 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
1169 IN BOOLEAN DaclPresent,
1170 IN PACL Dacl,
1171 IN BOOLEAN DaclDefaulted
1172 );
1173
1174 NTSYSAPI
1175 NTSTATUS
1176 NTAPI
1177 RtlSetGroupSecurityDescriptor(
1178 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
1179 IN PSID Group,
1180 IN BOOLEAN GroupDefaulted
1181 );
1182
1183 #ifdef NTOS_MODE_USER
1184
1185 NTSYSAPI
1186 NTSTATUS
1187 NTAPI
1188 RtlSetInformationAcl(
1189 PACL Acl,
1190 PVOID Information,
1191 ULONG InformationLength,
1192 ACL_INFORMATION_CLASS InformationClass
1193 );
1194
1195 #endif
1196
1197 NTSYSAPI
1198 NTSTATUS
1199 NTAPI
1200 RtlSetOwnerSecurityDescriptor(
1201 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
1202 IN PSID Owner,
1203 IN BOOLEAN OwnerDefaulted
1204 );
1205
1206 NTSYSAPI
1207 NTSTATUS
1208 NTAPI
1209 RtlSetSaclSecurityDescriptor(
1210 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
1211 IN BOOLEAN SaclPresent,
1212 IN PACL Sacl,
1213 IN BOOLEAN SaclDefaulted
1214 );
1215
1216 NTSYSAPI
1217 VOID
1218 NTAPI
1219 RtlSetSecurityDescriptorRMControl(
1220 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
1221 IN PUCHAR RMControl
1222 );
1223
1224 NTSYSAPI
1225 PUCHAR
1226 NTAPI
1227 RtlSubAuthorityCountSid(
1228 IN PSID Sid
1229 );
1230
1231 NTSYSAPI
1232 PULONG
1233 NTAPI
1234 RtlSubAuthoritySid(
1235 IN PSID Sid,
1236 IN ULONG SubAuthority
1237 );
1238
1239 NTSYSAPI
1240 BOOLEAN
1241 NTAPI
1242 RtlValidRelativeSecurityDescriptor(
1243 IN PSECURITY_DESCRIPTOR SecurityDescriptorInput,
1244 IN ULONG SecurityDescriptorLength,
1245 IN SECURITY_INFORMATION RequiredInformation
1246 );
1247
1248 NTSYSAPI
1249 BOOLEAN
1250 NTAPI
1251 RtlValidSecurityDescriptor(IN PSECURITY_DESCRIPTOR SecurityDescriptor);
1252
1253 NTSYSAPI
1254 BOOLEAN
1255 NTAPI
1256 RtlValidSid(IN PSID Sid);
1257
1258 NTSYSAPI
1259 BOOLEAN
1260 NTAPI
1261 RtlValidAcl(PACL Acl);
1262
1263 NTSYSAPI
1264 NTSTATUS
1265 NTAPI
1266 RtlDeleteSecurityObject(
1267 IN PSECURITY_DESCRIPTOR *ObjectDescriptor
1268 );
1269
1270 NTSYSAPI
1271 NTSTATUS
1272 NTAPI
1273 RtlNewSecurityObject(
1274 IN PSECURITY_DESCRIPTOR ParentDescriptor,
1275 IN PSECURITY_DESCRIPTOR CreatorDescriptor,
1276 OUT PSECURITY_DESCRIPTOR *NewDescriptor,
1277 IN BOOLEAN IsDirectoryObject,
1278 IN HANDLE Token,
1279 IN PGENERIC_MAPPING GenericMapping
1280 );
1281
1282 NTSYSAPI
1283 NTSTATUS
1284 NTAPI
1285 RtlQuerySecurityObject(
1286 IN PSECURITY_DESCRIPTOR ObjectDescriptor,
1287 IN SECURITY_INFORMATION SecurityInformation,
1288 OUT PSECURITY_DESCRIPTOR ResultantDescriptor,
1289 IN ULONG DescriptorLength,
1290 OUT PULONG ReturnLength
1291 );
1292
1293 NTSYSAPI
1294 NTSTATUS
1295 NTAPI
1296 RtlSetSecurityObject(
1297 IN SECURITY_INFORMATION SecurityInformation,
1298 IN PSECURITY_DESCRIPTOR ModificationDescriptor,
1299 OUT PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor,
1300 IN PGENERIC_MAPPING GenericMapping,
1301 IN HANDLE Token
1302 );
1303
1304 //
1305 // Single-Character Functions
1306 //
1307 NTSYSAPI
1308 NTSTATUS
1309 NTAPI
1310 RtlLargeIntegerToChar(
1311 IN PLARGE_INTEGER Value,
1312 IN ULONG Base,
1313 IN ULONG Length,
1314 IN OUT PCHAR String
1315 );
1316
1317 NTSYSAPI
1318 CHAR
1319 NTAPI
1320 RtlUpperChar(CHAR Source);
1321
1322 NTSYSAPI
1323 WCHAR
1324 NTAPI
1325 RtlUpcaseUnicodeChar(WCHAR Source);
1326
1327 NTSYSAPI
1328 WCHAR
1329 NTAPI
1330 RtlDowncaseUnicodeChar(IN WCHAR Source);
1331
1332 NTSYSAPI
1333 NTSTATUS
1334 NTAPI
1335 RtlIntegerToChar(
1336 IN ULONG Value,
1337 IN ULONG Base,
1338 IN ULONG Length,
1339 IN OUT PCHAR String
1340 );
1341
1342 NTSYSAPI
1343 NTSTATUS
1344 NTAPI
1345 RtlIntegerToUnicode(
1346 IN ULONG Value,
1347 IN ULONG Base OPTIONAL,
1348 IN ULONG Length OPTIONAL,
1349 IN OUT LPWSTR String
1350 );
1351
1352 NTSYSAPI
1353 NTSTATUS
1354 NTAPI
1355 RtlIntegerToUnicodeString(
1356 IN ULONG Value,
1357 IN ULONG Base,
1358 IN OUT PUNICODE_STRING String
1359 );
1360
1361 NTSYSAPI
1362 NTSTATUS
1363 NTAPI
1364 RtlCharToInteger(
1365 PCSZ String,
1366 ULONG Base,
1367 PULONG Value
1368 );
1369
1370 //
1371 // Byte Swap Functions
1372 //
1373 #if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037)) || \
1374 ((defined(_M_AMD64) || \
1375 defined(_M_IA64)) && (_MSC_FULL_VER > 13009175))
1376
1377 unsigned short __cdecl _byteswap_ushort(unsigned short);
1378 unsigned long __cdecl _byteswap_ulong (unsigned long);
1379 unsigned __int64 __cdecl _byteswap_uint64(unsigned __int64);
1380 #pragma intrinsic(_byteswap_ushort)
1381 #pragma intrinsic(_byteswap_ulong)
1382 #pragma intrinsic(_byteswap_uint64)
1383 #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
1384 #define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
1385 #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
1386
1387 #else
1388
1389 NTSYSAPI
1390 USHORT
1391 FASTCALL
1392 RtlUshortByteSwap(IN USHORT Source);
1393
1394 NTSYSAPI
1395 ULONG
1396 FASTCALL
1397 RtlUlongByteSwap(IN ULONG Source);
1398
1399 NTSYSAPI
1400 ULONGLONG
1401 FASTCALL
1402 RtlUlonglongByteSwap(IN ULONGLONG Source);
1403
1404 #endif
1405
1406 //
1407 // Unicode->Ansi String Functions
1408 //
1409 NTSYSAPI
1410 ULONG
1411 NTAPI
1412 RtlxUnicodeStringToAnsiSize(IN PCUNICODE_STRING UnicodeString);
1413
1414 #ifdef NTOS_MODE_USER
1415
1416 #define RtlUnicodeStringToAnsiSize(STRING) ( \
1417 NLS_MB_CODE_PAGE_TAG ? \
1418 RtlxUnicodeStringToAnsiSize(STRING) : \
1419 ((STRING)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
1420 )
1421
1422 #endif
1423
1424 NTSYSAPI
1425 NTSTATUS
1426 NTAPI
1427 RtlUnicodeStringToAnsiString(
1428 PANSI_STRING DestinationString,
1429 PCUNICODE_STRING SourceString,
1430 BOOLEAN AllocateDestinationString
1431 );
1432
1433 //
1434 // Unicode->OEM String Functions
1435 //
1436 NTSYSAPI
1437 NTSTATUS
1438 NTAPI
1439 RtlUpcaseUnicodeStringToOemString(
1440 POEM_STRING DestinationString,
1441 PCUNICODE_STRING SourceString,
1442 BOOLEAN AllocateDestinationString
1443 );
1444
1445 NTSYSAPI
1446 NTSTATUS
1447 NTAPI
1448 RtlUpcaseUnicodeStringToCountedOemString(
1449 IN OUT POEM_STRING DestinationString,
1450 IN PCUNICODE_STRING SourceString,
1451 IN BOOLEAN AllocateDestinationString
1452 );
1453
1454 NTSYSAPI
1455 NTSTATUS
1456 NTAPI
1457 RtlUnicodeStringToOemString(
1458 POEM_STRING DestinationString,
1459 PCUNICODE_STRING SourceString,
1460 BOOLEAN AllocateDestinationString
1461 );
1462
1463 NTSYSAPI
1464 NTSTATUS
1465 NTAPI
1466 RtlUpcaseUnicodeToOemN(
1467 PCHAR OemString,
1468 ULONG OemSize,
1469 PULONG ResultSize,
1470 PWCHAR UnicodeString,
1471 ULONG UnicodeSize
1472 );
1473
1474 NTSYSAPI
1475 ULONG
1476 NTAPI
1477 RtlxUnicodeStringToOemSize(IN PCUNICODE_STRING UnicodeString);
1478
1479 #ifdef NTOS_MODE_USER
1480
1481 #define RtlUnicodeStringToOemSize(STRING) ( \
1482 NLS_MB_OEM_CODE_PAGE_TAG ? \
1483 RtlxUnicodeStringToOemSize(STRING) : \
1484 ((STRING)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
1485 )
1486
1487 #define RtlUnicodeStringToCountedOemSize(STRING) ( \
1488 (ULONG)(RtlUnicodeStringToOemSize(STRING) - sizeof(ANSI_NULL)) \
1489 )
1490
1491 #endif
1492
1493 NTSYSAPI
1494 NTSTATUS
1495 NTAPI
1496 RtlUnicodeToOemN(
1497 PCHAR OemString,
1498 ULONG OemSize,
1499 PULONG ResultSize,
1500 PWCHAR UnicodeString,
1501 ULONG UnicodeSize
1502 );
1503
1504 //
1505 // Unicode->MultiByte String Functions
1506 //
1507 NTSYSAPI
1508 NTSTATUS
1509 NTAPI
1510 RtlUnicodeToMultiByteN(
1511 PCHAR MbString,
1512 ULONG MbSize,
1513 PULONG ResultSize,
1514 PWCHAR UnicodeString,
1515 ULONG UnicodeSize
1516 );
1517
1518 NTSYSAPI
1519 NTSTATUS
1520 NTAPI
1521 RtlUpcaseUnicodeToMultiByteN(
1522 PCHAR MbString,
1523 ULONG MbSize,
1524 PULONG ResultSize,
1525 PWCHAR UnicodeString,
1526 ULONG UnicodeSize
1527 );
1528
1529 NTSYSAPI
1530 NTSTATUS
1531 NTAPI
1532 RtlUnicodeToMultiByteSize(
1533 PULONG MbSize,
1534 PWCHAR UnicodeString,
1535 ULONG UnicodeSize
1536 );
1537
1538 NTSYSAPI
1539 ULONG
1540 NTAPI
1541 RtlxOemStringToUnicodeSize(IN PCOEM_STRING OemString);
1542
1543 //
1544 // OEM to Unicode Functions
1545 //
1546 NTSYSAPI
1547 NTSTATUS
1548 NTAPI
1549 RtlOemStringToUnicodeString(
1550 PUNICODE_STRING DestinationString,
1551 PCOEM_STRING SourceString,
1552 BOOLEAN AllocateDestinationString
1553 );
1554
1555 NTSYSAPI
1556 NTSTATUS
1557 NTAPI
1558 RtlOemToUnicodeN(
1559 PWSTR UnicodeString,
1560 ULONG MaxBytesInUnicodeString,
1561 PULONG BytesInUnicodeString,
1562 IN PCHAR OemString,
1563 ULONG BytesInOemString
1564 );
1565
1566 #ifdef NTOS_MODE_USER
1567
1568 #define RtlOemStringToUnicodeSize(STRING) ( \
1569 NLS_MB_OEM_CODE_PAGE_TAG ? \
1570 RtlxOemStringToUnicodeSize(STRING) : \
1571 ((STRING)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
1572 )
1573
1574 #define RtlOemStringToCountedUnicodeSize(STRING) ( \
1575 (ULONG)(RtlOemStringToUnicodeSize(STRING) - sizeof(UNICODE_NULL)) \
1576 )
1577
1578 #endif
1579
1580 //
1581 // Ansi->Unicode String Functions
1582 //
1583 NTSYSAPI
1584 ULONG
1585 NTAPI
1586 RtlxAnsiStringToUnicodeSize(
1587 PCANSI_STRING AnsiString
1588 );
1589
1590 NTSYSAPI
1591 NTSTATUS
1592 NTAPI
1593 RtlAnsiStringToUnicodeString(
1594 PUNICODE_STRING DestinationString,
1595 PCANSI_STRING SourceString,
1596 BOOLEAN AllocateDestinationString
1597 );
1598
1599 #ifdef NTOS_MODE_USER
1600
1601 #define RtlAnsiStringToUnicodeSize(STRING) ( \
1602 NLS_MB_CODE_PAGE_TAG ? \
1603 RtlxAnsiStringToUnicodeSize(STRING) : \
1604 ((STRING)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
1605 )
1606
1607 #endif
1608
1609 NTSYSAPI
1610 BOOLEAN
1611 NTAPI
1612 RtlCreateUnicodeStringFromAsciiz(
1613 OUT PUNICODE_STRING Destination,
1614 IN PCSZ Source
1615 );
1616
1617 //
1618 // Unicode String Functions
1619 //
1620 NTSYSAPI
1621 NTSTATUS
1622 NTAPI
1623 RtlAppendUnicodeToString(
1624 PUNICODE_STRING Destination,
1625 PCWSTR Source
1626 );
1627
1628 NTSYSAPI
1629 NTSTATUS
1630 NTAPI
1631 RtlAppendUnicodeStringToString(
1632 PUNICODE_STRING Destination,
1633 PCUNICODE_STRING Source
1634 );
1635
1636 NTSYSAPI
1637 LONG
1638 NTAPI
1639 RtlCompareUnicodeString(
1640 PCUNICODE_STRING String1,
1641 PCUNICODE_STRING String2,
1642 BOOLEAN CaseInsensitive
1643 );
1644
1645 NTSYSAPI
1646 VOID
1647 NTAPI
1648 RtlCopyUnicodeString(
1649 PUNICODE_STRING DestinationString,
1650 PCUNICODE_STRING SourceString
1651 );
1652
1653 NTSYSAPI
1654 BOOLEAN
1655 NTAPI
1656 RtlCreateUnicodeString(
1657 PUNICODE_STRING DestinationString,
1658 PCWSTR SourceString
1659 );
1660
1661 #ifdef NTOS_MODE_USER
1662
1663 NTSYSAPI
1664 NTSTATUS
1665 NTAPI
1666 RtlDowncaseUnicodeString(
1667 IN OUT PUNICODE_STRING UniDest,
1668 IN PCUNICODE_STRING UniSource,
1669 IN BOOLEAN AllocateDestinationString
1670 );
1671
1672 NTSYSAPI
1673 NTSTATUS
1674 NTAPI
1675 RtlDuplicateUnicodeString(
1676 IN ULONG Flags,
1677 IN PCUNICODE_STRING SourceString,
1678 OUT PUNICODE_STRING DestinationString
1679 );
1680
1681 #endif
1682
1683 NTSYSAPI
1684 BOOLEAN
1685 NTAPI
1686 RtlEqualUnicodeString(
1687 PCUNICODE_STRING String1,
1688 PCUNICODE_STRING String2,
1689 BOOLEAN CaseInsensitive
1690 );
1691
1692 NTSYSAPI
1693 NTSTATUS
1694 NTAPI
1695 RtlFindCharInUnicodeString(
1696 IN ULONG Flags,
1697 IN PUNICODE_STRING SearchString,
1698 IN PCUNICODE_STRING MatchString,
1699 OUT PUSHORT Position
1700 );
1701
1702 NTSYSAPI
1703 VOID
1704 NTAPI
1705 RtlFreeUnicodeString(IN PUNICODE_STRING UnicodeString);
1706
1707 NTSYSAPI
1708 NTSTATUS
1709 NTAPI
1710 RtlHashUnicodeString(
1711 IN CONST UNICODE_STRING *String,
1712 IN BOOLEAN CaseInSensitive,
1713 IN ULONG HashAlgorithm,
1714 OUT PULONG HashValue
1715 );
1716
1717 NTSYSAPI
1718 VOID
1719 NTAPI
1720 RtlInitUnicodeString(
1721 IN OUT PUNICODE_STRING DestinationString,
1722 IN PCWSTR SourceString
1723 );
1724
1725 NTSYSAPI
1726 NTSTATUS
1727 NTAPI
1728 RtlInitUnicodeStringEx(
1729 OUT PUNICODE_STRING DestinationString,
1730 IN PCWSTR SourceString OPTIONAL
1731 );
1732
1733 NTSYSAPI
1734 BOOLEAN
1735 NTAPI
1736 RtlIsTextUnicode(
1737 PVOID Buffer,
1738 INT Length,
1739 INT *Flags
1740 );
1741
1742 NTSYSAPI
1743 BOOLEAN
1744 NTAPI
1745 RtlPrefixString(
1746 PCANSI_STRING String1,
1747 PCANSI_STRING String2,
1748 BOOLEAN CaseInsensitive
1749 );
1750
1751 NTSYSAPI
1752 BOOLEAN
1753 NTAPI
1754 RtlPrefixUnicodeString(
1755 PCUNICODE_STRING String1,
1756 PCUNICODE_STRING String2,
1757 BOOLEAN CaseInsensitive
1758 );
1759
1760 NTSYSAPI
1761 NTSTATUS
1762 NTAPI
1763 RtlUpcaseUnicodeString(
1764 PUNICODE_STRING DestinationString,
1765 PCUNICODE_STRING SourceString,
1766 BOOLEAN AllocateDestinationString
1767 );
1768
1769 NTSYSAPI
1770 NTSTATUS
1771 NTAPI
1772 RtlUnicodeStringToInteger(
1773 PCUNICODE_STRING String,
1774 ULONG Base,
1775 PULONG Value
1776 );
1777
1778 NTSYSAPI
1779 NTSTATUS
1780 NTAPI
1781 RtlValidateUnicodeString(
1782 IN ULONG Flags,
1783 IN PCUNICODE_STRING String
1784 );
1785
1786 //
1787 // Ansi String Functions
1788 //
1789 NTSYSAPI
1790 VOID
1791 NTAPI
1792 RtlFreeAnsiString(IN PANSI_STRING AnsiString);
1793
1794 NTSYSAPI
1795 VOID
1796 NTAPI
1797 RtlInitAnsiString(
1798 PANSI_STRING DestinationString,
1799 PCSZ SourceString
1800 );
1801
1802 NTSYSAPI
1803 NTSTATUS
1804 NTAPI
1805 RtlInitAnsiStringEx(
1806 PANSI_STRING DestinationString,
1807 PCSZ SourceString
1808 );
1809
1810 //
1811 // OEM String Functions
1812 //
1813 NTSYSAPI
1814 VOID
1815 NTAPI
1816 RtlFreeOemString(IN POEM_STRING OemString);
1817
1818 //
1819 // MultiByte->Unicode String Functions
1820 //
1821 NTSYSAPI
1822 NTSTATUS
1823 NTAPI
1824 RtlMultiByteToUnicodeN(
1825 PWCHAR UnicodeString,
1826 ULONG UnicodeSize,
1827 PULONG ResultSize,
1828 PCSTR MbString,
1829 ULONG MbSize
1830 );
1831
1832 NTSYSAPI
1833 NTSTATUS
1834 NTAPI
1835 RtlMultiByteToUnicodeSize(
1836 PULONG UnicodeSize,
1837 PCSTR MbString,
1838 ULONG MbSize
1839 );
1840
1841 //
1842 // Atom Functions
1843 //
1844 NTSYSAPI
1845 NTSTATUS
1846 NTAPI
1847 RtlAddAtomToAtomTable(
1848 IN PRTL_ATOM_TABLE AtomTable,
1849 IN PWSTR AtomName,
1850 OUT PRTL_ATOM Atom
1851 );
1852
1853 NTSYSAPI
1854 NTSTATUS
1855 NTAPI
1856 RtlCreateAtomTable(
1857 IN ULONG TableSize,
1858 IN OUT PRTL_ATOM_TABLE *AtomTable
1859 );
1860
1861 NTSYSAPI
1862 NTSTATUS
1863 NTAPI
1864 RtlDeleteAtomFromAtomTable(
1865 IN PRTL_ATOM_TABLE AtomTable,
1866 IN RTL_ATOM Atom
1867 );
1868
1869 NTSYSAPI
1870 NTSTATUS
1871 NTAPI
1872 RtlDestroyAtomTable(IN PRTL_ATOM_TABLE AtomTable);
1873
1874 NTSYSAPI
1875 NTSTATUS
1876 NTAPI
1877 RtlQueryAtomInAtomTable(
1878 IN PRTL_ATOM_TABLE AtomTable,
1879 IN RTL_ATOM Atom,
1880 IN OUT PULONG RefCount OPTIONAL,
1881 IN OUT PULONG PinCount OPTIONAL,
1882 IN OUT PWSTR AtomName OPTIONAL,
1883 IN OUT PULONG NameLength OPTIONAL
1884 );
1885
1886 NTSYSAPI
1887 NTSTATUS
1888 NTAPI
1889 RtlPinAtomInAtomTable(
1890 IN PRTL_ATOM_TABLE AtomTable,
1891 IN RTL_ATOM Atom
1892 );
1893
1894 NTSYSAPI
1895 NTSTATUS
1896 NTAPI
1897 RtlLookupAtomInAtomTable(
1898 IN PRTL_ATOM_TABLE AtomTable,
1899 IN PWSTR AtomName,
1900 OUT PRTL_ATOM Atom
1901 );
1902
1903 //
1904 // Memory Functions
1905 //
1906 NTSYSAPI
1907 VOID
1908 NTAPI
1909 RtlFillMemoryUlong(
1910 IN PVOID Destination,
1911 IN ULONG Length,
1912 IN ULONG Fill
1913 );
1914
1915 //
1916 // Process Management Functions
1917 //
1918 NTSYSAPI
1919 PPEB
1920 NTAPI
1921 RtlGetCurrentPeb(
1922 VOID
1923 );
1924
1925 NTSYSAPI
1926 VOID
1927 NTAPI
1928 RtlAcquirePebLock(VOID);
1929
1930 NTSYSAPI
1931 NTSTATUS
1932 NTAPI
1933 RtlCreateProcessParameters (
1934 OUT PRTL_USER_PROCESS_PARAMETERS *ProcessParameters,
1935 IN PUNICODE_STRING ImagePathName OPTIONAL,
1936 IN PUNICODE_STRING DllPath OPTIONAL,
1937 IN PUNICODE_STRING CurrentDirectory OPTIONAL,
1938 IN PUNICODE_STRING CommandLine OPTIONAL,
1939 IN PWSTR Environment OPTIONAL,
1940 IN PUNICODE_STRING WindowTitle OPTIONAL,
1941 IN PUNICODE_STRING DesktopInfo OPTIONAL,
1942 IN PUNICODE_STRING ShellInfo OPTIONAL,
1943 IN PUNICODE_STRING RuntimeInfo OPTIONAL
1944 );
1945
1946 NTSYSAPI
1947 NTSTATUS
1948 NTAPI
1949 RtlCreateUserProcess(
1950 IN PUNICODE_STRING ImageFileName,
1951 IN ULONG Attributes,
1952 IN PRTL_USER_PROCESS_PARAMETERS ProcessParameters,
1953 IN PSECURITY_DESCRIPTOR ProcessSecutityDescriptor OPTIONAL,
1954 IN PSECURITY_DESCRIPTOR ThreadSecurityDescriptor OPTIONAL,
1955 IN HANDLE ParentProcess OPTIONAL,
1956 IN BOOLEAN CurrentDirectory,
1957 IN HANDLE DebugPort OPTIONAL,
1958 IN HANDLE ExceptionPort OPTIONAL,
1959 OUT PRTL_USER_PROCESS_INFORMATION ProcessInfo
1960 );
1961
1962 NTSYSAPI
1963 NTSTATUS
1964 NTAPI
1965 RtlCreateUserThread(
1966 IN HANDLE ProcessHandle,
1967 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
1968 IN BOOLEAN CreateSuspended,
1969 IN ULONG StackZeroBits,
1970 IN SIZE_T StackReserve,
1971 IN SIZE_T StackCommit,
1972 IN PTHREAD_START_ROUTINE StartAddress,
1973 IN PVOID Parameter,
1974 IN OUT PHANDLE ThreadHandle,
1975 IN OUT PCLIENT_ID ClientId
1976 );
1977
1978 NTSYSAPI
1979 PRTL_USER_PROCESS_PARAMETERS
1980 NTAPI
1981 RtlDeNormalizeProcessParams(IN PRTL_USER_PROCESS_PARAMETERS ProcessParameters);
1982
1983 NTSYSAPI
1984 NTSTATUS
1985 NTAPI
1986 RtlDestroyProcessParameters(IN PRTL_USER_PROCESS_PARAMETERS ProcessParameters);
1987
1988 NTSYSAPI
1989 VOID
1990 NTAPI
1991 RtlExitUserThread(NTSTATUS Status);
1992
1993 NTSYSAPI
1994 VOID
1995 NTAPI
1996 RtlInitializeContext(
1997 IN HANDLE ProcessHandle,
1998 OUT PCONTEXT ThreadContext,
1999 IN PVOID ThreadStartParam OPTIONAL,
2000 IN PTHREAD_START_ROUTINE ThreadStartAddress,
2001 IN PINITIAL_TEB InitialTeb
2002 );
2003
2004 NTSYSAPI
2005 PRTL_USER_PROCESS_PARAMETERS
2006 NTAPI
2007 RtlNormalizeProcessParams(IN PRTL_USER_PROCESS_PARAMETERS ProcessParameters);
2008
2009 NTSYSAPI
2010 VOID
2011 NTAPI
2012 RtlReleasePebLock(VOID);
2013
2014 NTSYSAPI
2015 NTSTATUS
2016 NTAPI
2017 RtlRemoteCall(
2018 IN HANDLE Process,
2019 IN HANDLE Thread,
2020 IN PVOID CallSite,
2021 IN ULONG ArgumentCount,
2022 IN PULONG Arguments,
2023 IN BOOLEAN PassContext,
2024 IN BOOLEAN AlreadySuspended
2025 );
2026
2027 NTSYSAPI
2028 VOID
2029 NTAPI
2030 RtlSetProcessIsCritical(
2031 IN BOOLEAN NewValue,
2032 OUT PBOOLEAN OldValue OPTIONAL,
2033 IN BOOLEAN IsWinlogon
2034 );
2035
2036 NTSYSAPI
2037 ULONG
2038 NTAPI
2039 RtlGetCurrentProcessorNumber(
2040 VOID
2041 );
2042
2043 #define NtCurrentPeb() (NtCurrentTeb()->ProcessEnvironmentBlock)
2044
2045 //
2046 // Thread Pool Functions
2047 //
2048 NTSYSAPI
2049 NTSTATUS
2050 NTAPI
2051 RtlDeregisterWaitEx(
2052 IN HANDLE hWaitHandle,
2053 IN HANDLE hCompletionEvent
2054 );
2055
2056 NTSYSAPI
2057 NTSTATUS
2058 NTAPI
2059 RtlDeregisterWait(
2060 IN HANDLE hWaitHandle
2061 );
2062
2063 NTSYSAPI
2064 NTSTATUS
2065 NTAPI
2066 RtlQueueWorkItem(
2067 IN WORKERCALLBACKFUNC Function,
2068 IN PVOID Context OPTIONAL,
2069 IN ULONG Flags
2070 );
2071
2072 NTSYSAPI
2073 NTSTATUS
2074 NTAPI
2075 RtlSetIoCompletionCallback(
2076 IN HANDLE FileHandle,
2077 IN PIO_APC_ROUTINE Callback,
2078 IN ULONG Flags
2079 );
2080
2081 NTSYSAPI
2082 NTSTATUS
2083 NTAPI
2084 RtlRegisterWait(
2085 IN PHANDLE phNewWaitObject,
2086 IN HANDLE hObject,
2087 IN WAITORTIMERCALLBACKFUNC Callback,
2088 IN PVOID pvContext,
2089 IN ULONG ulMilliseconds,
2090 IN ULONG ulFlags
2091 );
2092
2093 //
2094 // Environment/Path Functions
2095 //
2096 NTSYSAPI
2097 NTSTATUS
2098 NTAPI
2099 RtlCreateEnvironment(
2100 BOOLEAN Inherit,
2101 PWSTR *Environment
2102 );
2103
2104 NTSYSAPI
2105 NTSTATUS
2106 NTAPI
2107 RtlComputePrivatizedDllName_U(
2108 IN PUNICODE_STRING DllName,
2109 OUT PUNICODE_STRING RealName,
2110 OUT PUNICODE_STRING LocalName
2111 );
2112
2113 NTSYSAPI
2114 VOID
2115 NTAPI
2116 RtlDestroyEnvironment(
2117 IN PWSTR Environment
2118 );
2119
2120 NTSYSAPI
2121 BOOLEAN
2122 NTAPI
2123 RtlDoesFileExists_U(
2124 IN PCWSTR FileName
2125 );
2126
2127 NTSYSAPI
2128 BOOLEAN
2129 NTAPI
2130 RtlDoesFileExists_UstrEx(
2131 IN PCUNICODE_STRING FileName,
2132 IN BOOLEAN SucceedIfBusy
2133 );
2134
2135 NTSYSAPI
2136 ULONG
2137 NTAPI
2138 RtlDetermineDosPathNameType_U(
2139 IN PCWSTR Path
2140 );
2141
2142 NTSYSAPI
2143 ULONG
2144 NTAPI
2145 RtlDetermineDosPathNameType_Ustr(
2146 IN PCUNICODE_STRING Path
2147 );
2148
2149 NTSYSAPI
2150 ULONG
2151 NTAPI
2152 RtlDosSearchPath_U(
2153 IN PCWSTR Path,
2154 IN PCWSTR FileName,
2155 IN PCWSTR Extension,
2156 IN ULONG BufferSize,
2157 OUT PWSTR Buffer,
2158 OUT PWSTR *PartName
2159 );
2160
2161 NTSYSAPI
2162 BOOLEAN
2163 NTAPI
2164 RtlDosPathNameToNtPathName_U(
2165 IN PCWSTR DosPathName,
2166 OUT PUNICODE_STRING NtPathName,
2167 OUT PCWSTR *NtFileNamePart,
2168 OUT CURDIR *DirectoryInfo
2169 );
2170
2171 NTSYSAPI
2172 NTSTATUS
2173 NTAPI
2174 RtlExpandEnvironmentStrings_U(
2175 PWSTR Environment,
2176 PUNICODE_STRING Source,
2177 PUNICODE_STRING Destination,
2178 PULONG Length
2179 );
2180
2181 NTSYSAPI
2182 ULONG
2183 NTAPI
2184 RtlGetCurrentDirectory_U(
2185 ULONG MaximumLength,
2186 PWSTR Buffer
2187 );
2188
2189 NTSYSAPI
2190 ULONG
2191 NTAPI
2192 RtlGetFullPathName_U(
2193 IN PCWSTR FileName,
2194 IN ULONG Size,
2195 IN PWSTR Buffer,
2196 OUT PWSTR *ShortName
2197 );
2198
2199 NTSYSAPI
2200 ULONG
2201 NTAPI
2202 RtlGetFullPathName_Ustr(
2203 IN PUNICODE_STRING FileName,
2204 IN ULONG Size,
2205 IN PWSTR Buffer,
2206 OUT PWSTR *ShortName,
2207 OUT PBOOLEAN InvalidName,
2208 OUT RTL_PATH_TYPE *PathType
2209 );
2210
2211 NTSYSAPI
2212 ULONG
2213 NTAPI
2214 RtlIsDosDeviceName_U(
2215 IN PWSTR Name
2216 );
2217
2218 NTSYSAPI
2219 ULONG
2220 NTAPI
2221 RtlIsDosDeviceName_Ustr(
2222 IN PUNICODE_STRING Name
2223 );
2224
2225
2226 NTSYSAPI
2227 BOOLEAN
2228 NTAPI
2229 RtlIsNameLegalDOS8Dot3(
2230 IN PCUNICODE_STRING Name,
2231 IN OUT POEM_STRING OemName OPTIONAL,
2232 IN OUT PBOOLEAN NameContainsSpaces OPTIONAL
2233 );
2234
2235 NTSYSAPI
2236 NTSTATUS
2237 NTAPI
2238 RtlQueryEnvironmentVariable_U(
2239 PWSTR Environment,
2240 PUNICODE_STRING Name,
2241 PUNICODE_STRING Value
2242 );
2243
2244 NTSYSAPI
2245 NTSTATUS
2246 NTAPI
2247 RtlSetCurrentDirectory_U(
2248 IN PUNICODE_STRING name
2249 );
2250
2251 NTSYSAPI
2252 NTSTATUS
2253 NTAPI
2254 RtlSetEnvironmentVariable(
2255 PWSTR *Environment,
2256 PUNICODE_STRING Name,
2257 PUNICODE_STRING Value
2258 );
2259
2260 //
2261 // Critical Section/Resource Functions
2262 //
2263 NTSYSAPI
2264 NTSTATUS
2265 NTAPI
2266 RtlDeleteCriticalSection (
2267 IN PRTL_CRITICAL_SECTION CriticalSection
2268 );
2269
2270 NTSYSAPI
2271 NTSTATUS
2272 NTAPI
2273 RtlEnterCriticalSection(
2274 IN PRTL_CRITICAL_SECTION CriticalSection
2275 );
2276
2277 NTSYSAPI
2278 NTSTATUS
2279 NTAPI
2280 RtlInitializeCriticalSection(
2281 IN PRTL_CRITICAL_SECTION CriticalSection
2282 );
2283
2284 NTSYSAPI
2285 NTSTATUS
2286 NTAPI
2287 RtlInitializeCriticalSectionAndSpinCount(
2288 IN PRTL_CRITICAL_SECTION CriticalSection,
2289 IN ULONG SpinCount
2290 );
2291
2292 NTSYSAPI
2293 NTSTATUS
2294 NTAPI
2295 RtlLeaveCriticalSection(
2296 IN PRTL_CRITICAL_SECTION CriticalSection
2297 );
2298
2299 NTSYSAPI
2300 BOOLEAN
2301 NTAPI
2302 RtlTryEnterCriticalSection(
2303 IN PRTL_CRITICAL_SECTION CriticalSection
2304 );
2305
2306 NTSYSAPI
2307 VOID
2308 NTAPI
2309 RtlpUnWaitCriticalSection(
2310 IN PRTL_CRITICAL_SECTION CriticalSection
2311 );
2312
2313 NTSYSAPI
2314 NTSTATUS
2315 NTAPI
2316 RtlpWaitForCriticalSection(
2317 IN PRTL_CRITICAL_SECTION CriticalSection
2318 );
2319
2320 NTSYSAPI
2321 BOOLEAN
2322 NTAPI
2323 RtlAcquireResourceExclusive(
2324 IN PRTL_RESOURCE Resource,
2325 IN BOOLEAN Wait
2326 );
2327
2328 NTSYSAPI
2329 BOOLEAN
2330 NTAPI
2331 RtlAcquireResourceShared(
2332 IN PRTL_RESOURCE Resource,
2333 IN BOOLEAN Wait
2334 );
2335
2336 NTSYSAPI
2337 VOID
2338 NTAPI
2339 RtlConvertExclusiveToShared(
2340 IN PRTL_RESOURCE Resource
2341 );
2342
2343 NTSYSAPI
2344 VOID
2345 NTAPI
2346 RtlConvertSharedToExclusive(
2347 IN PRTL_RESOURCE Resource
2348 );
2349
2350 NTSYSAPI
2351 VOID
2352 NTAPI
2353 RtlDeleteResource(
2354 IN PRTL_RESOURCE Resource
2355 );
2356
2357 NTSYSAPI
2358 VOID
2359 NTAPI
2360 RtlDumpResource(
2361 IN PRTL_RESOURCE Resource
2362 );
2363
2364 NTSYSAPI
2365 VOID
2366 NTAPI
2367 RtlInitializeResource(
2368 IN PRTL_RESOURCE Resource
2369 );
2370
2371 NTSYSAPI
2372 VOID
2373 NTAPI
2374 RtlReleaseResource(
2375 IN PRTL_RESOURCE Resource
2376 );
2377
2378 //
2379 // Compression Functions
2380 //
2381 NTSYSAPI
2382 NTSTATUS
2383 NTAPI
2384 RtlCompressBuffer(
2385 IN USHORT CompressionFormatAndEngine,
2386 IN PUCHAR UncompressedBuffer,
2387 IN ULONG UncompressedBufferSize,
2388 OUT PUCHAR CompressedBuffer,
2389 IN ULONG CompressedBufferSize,
2390 IN ULONG UncompressedChunkSize,
2391 OUT PULONG FinalCompressedSize,
2392 IN PVOID WorkSpace
2393 );
2394
2395 NTSYSAPI
2396 NTSTATUS
2397 NTAPI
2398 RtlDecompressBuffer(
2399 IN USHORT CompressionFormat,
2400 OUT PUCHAR UncompressedBuffer,
2401 IN ULONG UncompressedBufferSize,
2402 IN PUCHAR CompressedBuffer,
2403 IN ULONG CompressedBufferSize,
2404 OUT PULONG FinalUncompressedSize
2405 );
2406
2407 NTSYSAPI
2408 NTSTATUS
2409 NTAPI
2410 RtlGetCompressionWorkSpaceSize(
2411 IN USHORT CompressionFormatAndEngine,
2412 OUT PULONG CompressBufferWorkSpaceSize,
2413 OUT PULONG CompressFragmentWorkSpaceSize
2414 );
2415
2416 //
2417 // Debug Info Functions
2418 //
2419 NTSYSAPI
2420 PRTL_DEBUG_INFORMATION
2421 NTAPI
2422 RtlCreateQueryDebugBuffer(
2423 IN ULONG Size,
2424 IN BOOLEAN EventPair
2425 );
2426
2427 NTSYSAPI
2428 NTSTATUS
2429 NTAPI
2430 RtlDestroyQueryDebugBuffer(IN PRTL_DEBUG_INFORMATION DebugBuffer);
2431
2432 NTSYSAPI
2433 NTSTATUS
2434 NTAPI
2435 RtlQueryProcessDebugInformation(
2436 IN ULONG ProcessId,
2437 IN ULONG DebugInfoClassMask,
2438 IN OUT PRTL_DEBUG_INFORMATION DebugBuffer
2439 );
2440
2441 //
2442 // Bitmap Functions
2443 //
2444 NTSYSAPI
2445 BOOLEAN
2446 NTAPI
2447 RtlAreBitsClear(
2448 IN PRTL_BITMAP BitMapHeader,
2449 IN ULONG StartingIndex,
2450 IN ULONG Length
2451 );
2452
2453 NTSYSAPI
2454 BOOLEAN
2455 NTAPI
2456 RtlAreBitsSet(
2457 IN PRTL_BITMAP BitMapHeader,
2458 IN ULONG StartingIndex,
2459 IN ULONG Length
2460 );
2461
2462 NTSYSAPI
2463 VOID
2464 NTAPI
2465 RtlClearBits(
2466 IN PRTL_BITMAP BitMapHeader,
2467 IN ULONG StartingIndex,
2468 IN ULONG NumberToClear
2469 );
2470
2471 NTSYSAPI
2472 ULONG
2473 NTAPI
2474 RtlFindClearBits(
2475 IN PRTL_BITMAP BitMapHeader,
2476 IN ULONG NumberToFind,
2477 IN ULONG HintIndex
2478 );
2479
2480 NTSYSAPI
2481 ULONG
2482 NTAPI
2483 RtlFindClearBitsAndSet(
2484 IN PRTL_BITMAP BitMapHeader,
2485 IN ULONG NumberToFind,
2486 IN ULONG HintIndex
2487 );
2488
2489 NTSYSAPI
2490 ULONG
2491 NTAPI
2492 RtlFindNextForwardRunClear(
2493 IN PRTL_BITMAP BitMapHeader,
2494 IN ULONG FromIndex,
2495 IN PULONG StartingRunIndex
2496 );
2497
2498 NTSYSAPI
2499 VOID
2500 NTAPI
2501 RtlInitializeBitMap(
2502 IN PRTL_BITMAP BitMapHeader,
2503 IN PULONG BitMapBuffer,
2504 IN ULONG SizeOfBitMap
2505 );
2506
2507 NTSYSAPI
2508 ULONG
2509 NTAPI
2510 RtlNumberOfSetBits(
2511 IN PRTL_BITMAP BitMapHeader
2512 );
2513
2514 NTSYSAPI
2515 VOID
2516 NTAPI
2517 RtlSetBit(
2518 PRTL_BITMAP BitMapHeader,
2519 ULONG BitNumber
2520 );
2521
2522 NTSYSAPI
2523 VOID
2524 NTAPI
2525 RtlSetBits(
2526 IN PRTL_BITMAP BitMapHeader,
2527 IN ULONG StartingIndex,
2528 IN ULONG NumberToSet
2529 );
2530
2531 NTSYSAPI
2532 VOID
2533 NTAPI
2534 RtlSetAllBits(
2535 PRTL_BITMAP BitMapHeader
2536 );
2537
2538 NTSYSAPI
2539 BOOLEAN
2540 NTAPI
2541 RtlTestBit(
2542 PRTL_BITMAP BitMapHeader,
2543 ULONG BitNumber
2544 );
2545
2546 //
2547 // Timer Functions
2548 //
2549 NTSYSAPI
2550 NTSTATUS
2551 NTAPI
2552 RtlCreateTimer(
2553 HANDLE TimerQueue,
2554 PHANDLE phNewTimer,
2555 WAITORTIMERCALLBACKFUNC Callback,
2556 PVOID Parameter,
2557 ULONG DueTime,
2558 ULONG Period,
2559 ULONG Flags
2560 );
2561
2562 NTSYSAPI
2563 NTSTATUS
2564 NTAPI
2565 RtlCreateTimerQueue(PHANDLE TimerQueue);
2566
2567 NTSYSAPI
2568 NTSTATUS
2569 NTAPI
2570 RtlDeleteTimer(
2571 HANDLE TimerQueue,
2572 HANDLE Timer,
2573 HANDLE CompletionEvent
2574 );
2575
2576 NTSYSAPI
2577 NTSTATUS
2578 NTAPI
2579 RtlUpdateTimer(
2580 HANDLE TimerQueue,
2581 HANDLE Timer,
2582 ULONG DueTime,
2583 ULONG Period
2584 );
2585
2586 NTSYSAPI
2587 NTSTATUS
2588 NTAPI
2589 RtlDeleteTimerQueueEx(
2590 HANDLE TimerQueue,
2591 HANDLE CompletionEvent
2592 );
2593
2594 NTSYSAPI
2595 NTSTATUS
2596 NTAPI
2597 RtlDeleteTimerQueue(HANDLE TimerQueue);
2598
2599 //
2600 // SList functions
2601 //
2602 PSLIST_ENTRY
2603 FASTCALL
2604 InterlockedPushListSList(
2605 IN PSLIST_HEADER ListHead,
2606 IN PSLIST_ENTRY List,
2607 IN PSLIST_ENTRY ListEnd,
2608 IN ULONG Count
2609 );
2610
2611 //
2612 // Range List functions
2613 //
2614 NTSYSAPI
2615 VOID
2616 NTAPI
2617 RtlFreeRangeList(IN PRTL_RANGE_LIST RangeList);
2618
2619 //
2620 // Debug Functions
2621 //
2622 ULONG
2623 __cdecl
2624 DbgPrint(
2625 IN PCCH Format,
2626 IN ...
2627 );
2628
2629 NTSYSAPI
2630 ULONG
2631 __cdecl
2632 DbgPrintEx(
2633 IN ULONG ComponentId,
2634 IN ULONG Level,
2635 IN PCCH Format,
2636 IN ...
2637 );
2638
2639 ULONG
2640 NTAPI
2641 DbgPrompt(
2642 IN PCCH Prompt,
2643 OUT PCH Response,
2644 IN ULONG MaximumResponseLength
2645 );
2646
2647 VOID
2648 NTAPI
2649 DbgBreakPoint(
2650 VOID
2651 );
2652
2653 NTSTATUS
2654 NTAPI
2655 DbgLoadImageSymbols(
2656 IN PANSI_STRING Name,
2657 IN PVOID Base,
2658 IN ULONG_PTR ProcessId
2659 );
2660
2661 VOID
2662 NTAPI
2663 DbgUnLoadImageSymbols(
2664 IN PANSI_STRING Name,
2665 IN PVOID Base,
2666 IN ULONG_PTR ProcessId
2667 );
2668
2669 //
2670 // Generic Table Functions
2671 //
2672 #if defined(NTOS_MODE_USER) || defined(_NTIFS_)
2673 NTSYSAPI
2674 PVOID
2675 NTAPI
2676 RtlInsertElementGenericTable(
2677 IN PRTL_GENERIC_TABLE Table,
2678 IN PVOID Buffer,
2679 IN ULONG BufferSize,
2680 OUT PBOOLEAN NewElement OPTIONAL
2681 );
2682
2683 NTSYSAPI
2684 PVOID
2685 NTAPI
2686 RtlInsertElementGenericTableFull(
2687 IN PRTL_GENERIC_TABLE Table,
2688 IN PVOID Buffer,
2689 IN ULONG BufferSize,
2690 OUT PBOOLEAN NewElement OPTIONAL,
2691 IN PVOID NodeOrParent,
2692 IN TABLE_SEARCH_RESULT SearchResult
2693 );
2694
2695 NTSYSAPI
2696 BOOLEAN
2697 NTAPI
2698 RtlIsGenericTableEmpty(
2699 IN PRTL_GENERIC_TABLE Table
2700 );
2701
2702 NTSYSAPI
2703 PVOID
2704 NTAPI
2705 RtlLookupElementGenericTableFull(
2706 IN PRTL_GENERIC_TABLE Table,
2707 IN PVOID Buffer,
2708 OUT PVOID *NodeOrParent,
2709 OUT TABLE_SEARCH_RESULT *SearchResult
2710 );
2711 #endif
2712
2713 //
2714 // Handle Table Functions
2715 //
2716 NTSYSAPI
2717 PRTL_HANDLE_TABLE_ENTRY
2718 NTAPI
2719 RtlAllocateHandle(
2720 IN PRTL_HANDLE_TABLE HandleTable,
2721 IN OUT PULONG Index
2722 );
2723
2724 NTSYSAPI
2725 VOID
2726 NTAPI
2727 RtlDestroyHandleTable(IN PRTL_HANDLE_TABLE HandleTable);
2728
2729 NTSYSAPI
2730 BOOLEAN
2731 NTAPI
2732 RtlFreeHandle(
2733 IN PRTL_HANDLE_TABLE HandleTable,
2734 IN PRTL_HANDLE_TABLE_ENTRY Handle
2735 );
2736
2737 NTSYSAPI
2738 VOID
2739 NTAPI
2740 RtlInitializeHandleTable(
2741 IN ULONG TableSize,
2742 IN ULONG HandleSize,
2743 IN PRTL_HANDLE_TABLE HandleTable
2744 );
2745
2746 NTSYSAPI
2747 BOOLEAN
2748 NTAPI
2749 RtlIsValidHandle(
2750 IN PRTL_HANDLE_TABLE HandleTable,
2751 IN PRTL_HANDLE_TABLE_ENTRY Handle
2752 );
2753
2754 NTSYSAPI
2755 BOOLEAN
2756 NTAPI
2757 RtlIsValidIndexHandle(
2758 IN PRTL_HANDLE_TABLE HandleTable,
2759 IN ULONG Index,
2760 OUT PRTL_HANDLE_TABLE_ENTRY *Handle
2761 );
2762
2763 //
2764 // PE Functions
2765 //
2766 NTSYSAPI
2767 NTSTATUS
2768 NTAPI
2769 RtlFindMessage(
2770 IN PVOID BaseAddress,
2771 IN ULONG Type,
2772 IN ULONG Language,
2773 IN ULONG MessageId,
2774 OUT PRTL_MESSAGE_RESOURCE_ENTRY *MessageResourceEntry
2775 );
2776
2777 NTSYSAPI
2778 ULONG
2779 NTAPI
2780 RtlGetNtGlobalFlags(VOID);
2781
2782 NTSYSAPI
2783 PVOID
2784 NTAPI
2785 RtlImageDirectoryEntryToData(
2786 PVOID BaseAddress,
2787 BOOLEAN MappedAsImage,
2788 USHORT Directory,
2789 PULONG Size
2790 );
2791
2792 NTSYSAPI
2793 PVOID
2794 NTAPI
2795 RtlImageRvaToVa(
2796 PIMAGE_NT_HEADERS NtHeader,
2797 PVOID BaseAddress,
2798 ULONG Rva,
2799 PIMAGE_SECTION_HEADER *SectionHeader
2800 );
2801
2802 NTSYSAPI
2803 PIMAGE_NT_HEADERS
2804 NTAPI
2805 RtlImageNtHeader(IN PVOID BaseAddress);
2806
2807 NTSYSAPI
2808 NTSTATUS
2809 NTAPI
2810 RtlImageNtHeaderEx(
2811 IN ULONG Flags,
2812 IN PVOID BaseAddress,
2813 IN ULONGLONG Size,
2814 IN PIMAGE_NT_HEADERS *NtHeader
2815 );
2816
2817 NTSYSAPI
2818 PIMAGE_SECTION_HEADER
2819 NTAPI
2820 RtlImageRvaToSection(
2821 PIMAGE_NT_HEADERS NtHeader,
2822 PVOID BaseAddress,
2823 ULONG Rva
2824 );
2825
2826 NTSYSAPI
2827 ULONG
2828 NTAPI
2829 LdrRelocateImageWithBias(
2830 IN PVOID NewAddress,
2831 IN LONGLONG AdditionalBias,
2832 IN PCCH LoaderName,
2833 IN ULONG Success,
2834 IN ULONG Conflict,
2835 IN ULONG Invalid
2836 );
2837
2838 //
2839 // Activation Context Functions
2840 //
2841 #ifdef NTOS_MODE_USER
2842
2843 NTSYSAPI
2844 NTSTATUS
2845 NTAPI
2846 RtlActivateActivationContext(
2847 IN ULONG Unknown,
2848 IN HANDLE Handle,
2849 OUT PULONG_PTR Cookie
2850 );
2851
2852 NTSYSAPI
2853 VOID
2854 NTAPI
2855 RtlAddRefActivationContext(
2856 PVOID Context
2857 );
2858
2859
2860 NTSYSAPI
2861 NTSTATUS
2862 NTAPI
2863 RtlActivateActivationContextUnsafeFast(
2864 IN PRTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED Frame,
2865 IN PVOID Context
2866 );
2867
2868 NTSYSAPI
2869 NTSTATUS
2870 NTAPI
2871 RtlAllocateActivationContextStack(
2872 IN PVOID *Context
2873 );
2874
2875 NTSYSAPI
2876 NTSTATUS
2877 NTAPI
2878 RtlCreateActivationContext(
2879 OUT PHANDLE Handle,
2880 IN OUT PVOID ReturnedData
2881 );
2882
2883 NTSYSAPI
2884 NTSTATUS
2885 NTAPI
2886 RtlGetActiveActivationContext(
2887 IN PVOID *Context
2888 );
2889
2890 NTSYSAPI
2891 VOID
2892 NTAPI
2893 RtlReleaseActivationContext(
2894 IN PVOID *Context
2895 );
2896
2897 NTSYSAPI
2898 NTSTATUS
2899 NTAPI
2900 RtlDeactivateActivationContext(
2901 DWORD dwFlags,
2902 ULONG_PTR ulCookie
2903 );
2904
2905 NTSYSAPI
2906 NTSTATUS
2907 NTAPI
2908 RtlDeactivateActivationContextUnsafeFast(
2909 IN PRTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED Frame
2910 );
2911
2912 NTSYSAPI
2913 NTSTATUS
2914 NTAPI
2915 RtlDosApplyFileIsolationRedirection_Ustr(
2916 IN BOOLEAN Unknown,
2917 IN PUNICODE_STRING OriginalName,
2918 IN PUNICODE_STRING Extension,
2919 IN OUT PUNICODE_STRING RedirectedName,
2920 IN OUT PUNICODE_STRING RedirectedName2,
2921 IN OUT PUNICODE_STRING *OriginalName2,
2922 IN PVOID Unknown1,
2923 IN PVOID Unknown2,
2924 IN PVOID Unknown3
2925 );
2926
2927 NTSYSAPI
2928 NTSTATUS
2929 NTAPI
2930 RtlFindActivationContextSectionString(
2931 IN ULONG dwFlags,
2932 IN const GUID *ExtensionGuid,
2933 IN ULONG SectionType,
2934 IN PUNICODE_STRING SectionName,
2935 IN OUT PVOID ReturnedData
2936 );
2937
2938 NTSYSAPI
2939 NTSTATUS
2940 NTAPI
2941 RtlQueryInformationActivationContext(
2942 DWORD dwFlags,
2943 PVOID Context,
2944 PVOID pvSubInstance,
2945 ULONG ulInfoClass,
2946 PVOID pvBuffer,
2947 SIZE_T cbBuffer OPTIONAL,
2948 SIZE_T *pcbWrittenOrRequired OPTIONAL
2949 );
2950
2951 NTSYSAPI
2952 NTSTATUS
2953 NTAPI
2954 RtlZombifyActivationContext(
2955 PVOID Context
2956 );
2957
2958
2959 #endif
2960
2961 //
2962 // Registry Functions
2963 //
2964 NTSYSAPI
2965 NTSTATUS
2966 NTAPI
2967 RtlCheckRegistryKey(
2968 ULONG RelativeTo,
2969 PWSTR Path
2970 );
2971
2972 NTSYSAPI
2973 NTSTATUS
2974 NTAPI
2975 RtlCreateRegistryKey(
2976 IN ULONG RelativeTo,
2977 IN PWSTR Path
2978 );
2979
2980 NTSYSAPI
2981 NTSTATUS
2982 NTAPI
2983 RtlFormatCurrentUserKeyPath(
2984 IN OUT PUNICODE_STRING KeyPath
2985 );
2986
2987 NTSYSAPI
2988 NTSTATUS
2989 NTAPI
2990 RtlpNtOpenKey(
2991 OUT HANDLE KeyHandle,
2992 IN ACCESS_MASK DesiredAccess,
2993 IN POBJECT_ATTRIBUTES ObjectAttributes,
2994 IN ULONG Unused
2995 );
2996
2997 NTSYSAPI
2998 NTSTATUS
2999 NTAPI
3000 RtlOpenCurrentUser(
3001 IN ACCESS_MASK DesiredAccess,
3002 OUT PHANDLE KeyHandle
3003 );
3004
3005 NTSYSAPI
3006 NTSTATUS
3007 NTAPI
3008 RtlQueryRegistryValues(
3009 IN ULONG RelativeTo,
3010 IN PCWSTR Path,
3011 IN PRTL_QUERY_REGISTRY_TABLE QueryTable,
3012 IN PVOID Context,
3013 IN PVOID Environment
3014 );
3015
3016 NTSYSAPI
3017 NTSTATUS
3018 NTAPI
3019 RtlWriteRegistryValue(
3020 ULONG RelativeTo,
3021 PCWSTR Path,
3022 PCWSTR ValueName,
3023 ULONG ValueType,
3024 PVOID ValueData,
3025 ULONG ValueLength
3026 );
3027
3028 //
3029 // NLS Functions
3030 //
3031 NTSYSAPI
3032 VOID
3033 NTAPI
3034 RtlGetDefaultCodePage(
3035 OUT PUSHORT AnsiCodePage,
3036 OUT PUSHORT OemCodePage
3037 );
3038
3039 NTSYSAPI
3040 VOID
3041 NTAPI
3042 RtlInitNlsTables(
3043 IN PUSHORT AnsiTableBase,
3044 IN PUSHORT OemTableBase,
3045 IN PUSHORT CaseTableBase,
3046 OUT PNLSTABLEINFO NlsTable
3047 );
3048
3049 NTSYSAPI
3050 VOID
3051 NTAPI
3052 RtlInitCodePageTable(
3053 IN PUSHORT TableBase,
3054 OUT PCPTABLEINFO CodePageTable
3055 );
3056
3057 NTSYSAPI
3058 VOID
3059 NTAPI
3060 RtlResetRtlTranslations(IN PNLSTABLEINFO NlsTable);
3061
3062 #if defined(NTOS_MODE_USER) && !defined(NO_RTL_INLINES)
3063
3064 //
3065 // Misc conversion functions
3066 //
3067 static __inline
3068 LARGE_INTEGER
3069 NTAPI_INLINE
3070 RtlConvertLongToLargeInteger(
3071 LONG SignedInteger
3072 )
3073 {
3074 LARGE_INTEGER Result;
3075
3076 Result.QuadPart = SignedInteger;
3077 return Result;
3078 }
3079
3080 static __inline
3081 LARGE_INTEGER
3082 NTAPI_INLINE
3083 RtlEnlargedIntegerMultiply(
3084 LONG Multiplicand,
3085 LONG Multiplier
3086 )
3087 {
3088 LARGE_INTEGER Product;
3089
3090 Product.QuadPart = (LONGLONG)Multiplicand * (ULONGLONG)Multiplier;
3091 return Product;
3092 }
3093
3094 static __inline
3095 ULONG
3096 NTAPI_INLINE
3097 RtlEnlargedUnsignedDivide(
3098 IN ULARGE_INTEGER Dividend,
3099 IN ULONG Divisor,
3100 IN PULONG Remainder OPTIONAL
3101 )
3102 {
3103 ULONG Quotient;
3104
3105 Quotient = (ULONG)(Dividend.QuadPart / Divisor);
3106 if (Remainder) {
3107 *Remainder = (ULONG)(Dividend.QuadPart % Divisor);
3108 }
3109
3110 return Quotient;
3111 }
3112
3113 static __inline
3114 LARGE_INTEGER
3115 NTAPI_INLINE
3116 RtlEnlargedUnsignedMultiply(
3117 ULONG Multiplicand,
3118 ULONG Multiplier
3119 )
3120 {
3121 LARGE_INTEGER Product;
3122
3123 Product.QuadPart = (ULONGLONG)Multiplicand * (ULONGLONG)Multiplier;
3124 return Product;
3125 }
3126 #endif
3127
3128 NTSYSAPI
3129 ULONG
3130 NTAPI
3131 RtlUniform(
3132 IN PULONG Seed
3133 );
3134
3135 NTSYSAPI
3136 ULONG
3137 NTAPI
3138 RtlRandom(
3139 IN OUT PULONG Seed
3140 );
3141
3142 NTSYSAPI
3143 ULONG
3144 NTAPI
3145 RtlComputeCrc32(
3146 IN USHORT PartialCrc,
3147 IN PUCHAR Buffer,
3148 IN ULONG Length
3149 );
3150
3151 //
3152 // Network Functions
3153 //
3154 NTSYSAPI
3155 NTSTATUS
3156 NTAPI
3157 RtlIpv4StringToAddressW(
3158 IN PWCHAR String,
3159 IN UCHAR Strict,
3160 OUT PWCHAR Terminator,
3161 OUT struct in_addr *Addr
3162 );
3163
3164 NTSYSAPI
3165 NTSTATUS
3166 NTAPI
3167 RtlIpv6StringToAddressA(
3168 IN PCHAR Name,
3169 OUT PCHAR *Terminator,
3170 OUT struct in6_addr *Addr
3171 );
3172
3173 NTSYSAPI
3174 NTSTATUS
3175 NTAPI
3176 RtlIpv6StringToAddressW(
3177 IN PWCHAR Name,
3178 OUT PCHAR *Terminator,
3179 OUT struct in6_addr *Addr
3180 );
3181
3182 NTSYSAPI
3183 NTSTATUS
3184 NTAPI
3185 RtlIpv6StringToAddressExA(
3186 IN PCHAR AddressString,
3187 IN struct in6_addr *Address,
3188 IN PULONG ScopeId,
3189 IN PUSHORT Port
3190 );
3191
3192 NTSYSAPI
3193 NTSTATUS
3194 NTAPI
3195 RtlIpv6StringToAddressExW(
3196 IN PWCHAR AddressName,
3197 IN struct in6_addr *Address,
3198 IN PULONG ScopeId,
3199 IN PUSHORT Port
3200 );
3201
3202
3203 //
3204 // Time Functions
3205 //
3206 NTSYSAPI
3207 NTSTATUS
3208 NTAPI
3209 RtlQueryTimeZoneInformation(PRTL_TIME_ZONE_INFORMATION TimeZoneInformation);
3210
3211 NTSYSAPI
3212 VOID
3213 NTAPI
3214 RtlSecondsSince1970ToTime(
3215 IN ULONG SecondsSince1970,
3216 OUT PLARGE_INTEGER Time
3217 );
3218
3219 NTSYSAPI
3220 NTSTATUS
3221 NTAPI
3222 RtlSetTimeZoneInformation(PRTL_TIME_ZONE_INFORMATION TimeZoneInformation);
3223
3224 NTSYSAPI
3225 BOOLEAN
3226 NTAPI
3227 RtlTimeFieldsToTime(
3228 PTIME_FIELDS TimeFields,
3229 PLARGE_INTEGER Time
3230 );
3231
3232 NTSYSAPI
3233 BOOLEAN
3234 NTAPI
3235 RtlTimeToSecondsSince1970(
3236 PLARGE_INTEGER Time,
3237 OUT PULONG SecondsSince1970
3238 );
3239
3240 NTSYSAPI
3241 VOID
3242 NTAPI
3243 RtlTimeToTimeFields(
3244 PLARGE_INTEGER Time,
3245 PTIME_FIELDS TimeFields
3246 );
3247
3248 NTSYSAPI
3249 NTSTATUS
3250 NTAPI
3251 RtlSystemTimeToLocalTime(
3252 IN PLARGE_INTEGER SystemTime,
3253 OUT PLARGE_INTEGER LocalTime
3254 );
3255
3256 //
3257 // Version Functions
3258 //
3259 NTSYSAPI
3260 NTSTATUS
3261 NTAPI
3262 RtlVerifyVersionInfo(
3263 IN PRTL_OSVERSIONINFOEXW VersionInfo,
3264 IN ULONG TypeMask,
3265 IN ULONGLONG ConditionMask
3266 );
3267
3268 NTSYSAPI
3269 NTSTATUS
3270 NTAPI
3271 RtlGetVersion(IN OUT PRTL_OSVERSIONINFOW lpVersionInformation);
3272
3273 NTSYSAPI
3274 BOOLEAN
3275 NTAPI
3276 RtlGetNtProductType(OUT PNT_PRODUCT_TYPE ProductType);
3277
3278 //
3279 // Secure Memory Functions
3280 //
3281 #ifdef NTOS_MODE_USER
3282 NTSYSAPI
3283 NTSTATUS
3284 NTAPI
3285 RtlRegisterSecureMemoryCacheCallback(
3286 IN PRTL_SECURE_MEMORY_CACHE_CALLBACK Callback);
3287
3288 NTSYSAPI
3289 BOOLEAN
3290 NTAPI
3291 RtlFlushSecureMemoryCache(
3292 IN PVOID MemoryCache,
3293 IN OPTIONAL SIZE_T MemoryLength
3294 );
3295 #endif
3296
3297 #ifdef __cplusplus
3298 }
3299 #endif
3300
3301 #endif