48e3f7d0432ff491b1f991fd2c8cd754ee718704
[reactos.git] / sdk / 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 <pstypes.h>
29 #include <extypes.h>
30 #include "in6addr.h"
31 #include "inaddr.h"
32
33 #ifdef __cplusplus
34 extern "C" {
35 #endif
36
37 #ifdef NTOS_MODE_USER
38
39 //
40 // List Functions
41 //
42 FORCEINLINE
43 VOID
44 InitializeListHead(
45 _Out_ PLIST_ENTRY ListHead
46 )
47 {
48 ListHead->Flink = ListHead->Blink = ListHead;
49 }
50
51 FORCEINLINE
52 VOID
53 InsertHeadList(
54 _Inout_ PLIST_ENTRY ListHead,
55 _Inout_ PLIST_ENTRY Entry
56 )
57 {
58 PLIST_ENTRY OldFlink;
59 OldFlink = ListHead->Flink;
60 Entry->Flink = OldFlink;
61 Entry->Blink = ListHead;
62 OldFlink->Blink = Entry;
63 ListHead->Flink = Entry;
64 }
65
66 FORCEINLINE
67 VOID
68 InsertTailList(
69 _Inout_ PLIST_ENTRY ListHead,
70 _Inout_ PLIST_ENTRY Entry
71 )
72 {
73 PLIST_ENTRY OldBlink;
74 OldBlink = ListHead->Blink;
75 Entry->Flink = ListHead;
76 Entry->Blink = OldBlink;
77 OldBlink->Flink = Entry;
78 ListHead->Blink = Entry;
79 }
80
81 _Must_inspect_result_
82 FORCEINLINE
83 BOOLEAN
84 IsListEmpty(
85 _In_ const LIST_ENTRY * ListHead
86 )
87 {
88 return (BOOLEAN)(ListHead->Flink == ListHead);
89 }
90
91 FORCEINLINE
92 PSINGLE_LIST_ENTRY
93 PopEntryList(
94 _Inout_ PSINGLE_LIST_ENTRY ListHead
95 )
96 {
97 PSINGLE_LIST_ENTRY FirstEntry;
98 FirstEntry = ListHead->Next;
99 if (FirstEntry != NULL) {
100 ListHead->Next = FirstEntry->Next;
101 }
102
103 return FirstEntry;
104 }
105
106 FORCEINLINE
107 VOID
108 PushEntryList(
109 _Inout_ PSINGLE_LIST_ENTRY ListHead,
110 _Inout_ PSINGLE_LIST_ENTRY Entry
111 )
112 {
113 Entry->Next = ListHead->Next;
114 ListHead->Next = Entry;
115 }
116
117 FORCEINLINE
118 BOOLEAN
119 RemoveEntryList(
120 _In_ PLIST_ENTRY Entry)
121 {
122 PLIST_ENTRY OldFlink;
123 PLIST_ENTRY OldBlink;
124
125 OldFlink = Entry->Flink;
126 OldBlink = Entry->Blink;
127 OldFlink->Blink = OldBlink;
128 OldBlink->Flink = OldFlink;
129 return (BOOLEAN)(OldFlink == OldBlink);
130 }
131
132 FORCEINLINE
133 PLIST_ENTRY
134 RemoveHeadList(
135 _Inout_ PLIST_ENTRY ListHead)
136 {
137 PLIST_ENTRY Flink;
138 PLIST_ENTRY Entry;
139
140 Entry = ListHead->Flink;
141 Flink = Entry->Flink;
142 ListHead->Flink = Flink;
143 Flink->Blink = ListHead;
144 return Entry;
145 }
146
147 FORCEINLINE
148 PLIST_ENTRY
149 RemoveTailList(
150 _Inout_ PLIST_ENTRY ListHead)
151 {
152 PLIST_ENTRY Blink;
153 PLIST_ENTRY Entry;
154
155 Entry = ListHead->Blink;
156 Blink = Entry->Blink;
157 ListHead->Blink = Blink;
158 Blink->Flink = ListHead;
159 return Entry;
160 }
161
162 //
163 // Unicode string macros
164 //
165 _At_(UnicodeString->Buffer, _Post_equal_to_(Buffer))
166 _At_(UnicodeString->Length, _Post_equal_to_(0))
167 _At_(UnicodeString->MaximumLength, _Post_equal_to_(BufferSize))
168 FORCEINLINE
169 VOID
170 RtlInitEmptyUnicodeString(
171 _Out_ PUNICODE_STRING UnicodeString,
172 _When_(BufferSize != 0, _Notnull_) _Writable_bytes_(BufferSize) __drv_aliasesMem PWCHAR Buffer,
173 _In_ USHORT BufferSize)
174 {
175 UnicodeString->Length = 0;
176 UnicodeString->MaximumLength = BufferSize;
177 UnicodeString->Buffer = Buffer;
178 }
179
180 _At_(AnsiString->Buffer, _Post_equal_to_(Buffer))
181 _At_(AnsiString->Length, _Post_equal_to_(0))
182 _At_(AnsiString->MaximumLength, _Post_equal_to_(BufferSize))
183 FORCEINLINE
184 VOID
185 RtlInitEmptyAnsiString(
186 _Out_ PANSI_STRING AnsiString,
187 _When_(BufferSize != 0, _Notnull_) _Writable_bytes_(BufferSize) __drv_aliasesMem PCHAR Buffer,
188 _In_ USHORT BufferSize)
189 {
190 AnsiString->Length = 0;
191 AnsiString->MaximumLength = BufferSize;
192 AnsiString->Buffer = Buffer;
193 }
194
195 //
196 // LUID Macros
197 //
198 #define RtlEqualLuid(L1, L2) (((L1)->HighPart == (L2)->HighPart) && \
199 ((L1)->LowPart == (L2)->LowPart))
200 FORCEINLINE
201 LUID
202 NTAPI_INLINE
203 RtlConvertUlongToLuid(
204 _In_ ULONG Ulong)
205 {
206 LUID TempLuid;
207
208 TempLuid.LowPart = Ulong;
209 TempLuid.HighPart = 0;
210 return TempLuid;
211 }
212
213 //
214 // ASSERT Macros
215 //
216 #ifndef ASSERT
217 #if DBG
218
219 #define ASSERT( exp ) \
220 ((void)((!(exp)) ? \
221 (RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, NULL ),FALSE) : \
222 TRUE))
223
224 #define ASSERTMSG( msg, exp ) \
225 ((void)((!(exp)) ? \
226 (RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, (PCHAR)msg ),FALSE) : \
227 TRUE))
228
229 #else
230
231 #define ASSERT( exp ) ((void) 0)
232 #define ASSERTMSG( msg, exp ) ((void) 0)
233
234 #endif
235 #endif
236
237 #ifdef NTOS_KERNEL_RUNTIME
238
239 //
240 // Executing RTL functions at DISPATCH_LEVEL or higher will result in a
241 // bugcheck.
242 //
243 #define RTL_PAGED_CODE PAGED_CODE
244
245 #else
246
247 //
248 // This macro does nothing in user mode
249 //
250 #define RTL_PAGED_CODE NOP_FUNCTION
251
252 #endif
253
254 //
255 // RTL Splay Tree Functions
256 //
257 #ifndef RTL_USE_AVL_TABLES
258
259 NTSYSAPI
260 VOID
261 NTAPI
262 RtlInitializeGenericTable(
263 _Out_ PRTL_GENERIC_TABLE Table,
264 _In_ PRTL_GENERIC_COMPARE_ROUTINE CompareRoutine,
265 _In_opt_ PRTL_GENERIC_ALLOCATE_ROUTINE AllocateRoutine,
266 _In_opt_ PRTL_GENERIC_FREE_ROUTINE FreeRoutine,
267 _In_opt_ PVOID TableContext
268 );
269
270 NTSYSAPI
271 PVOID
272 NTAPI
273 RtlInsertElementGenericTable(
274 _In_ PRTL_GENERIC_TABLE Table,
275 _In_reads_bytes_(BufferSize) PVOID Buffer,
276 _In_ CLONG BufferSize,
277 _Out_opt_ PBOOLEAN NewElement
278 );
279
280 NTSYSAPI
281 PVOID
282 NTAPI
283 RtlInsertElementGenericTableFull(
284 _In_ PRTL_GENERIC_TABLE Table,
285 _In_reads_bytes_(BufferSize) PVOID Buffer,
286 _In_ CLONG BufferSize,
287 _Out_opt_ PBOOLEAN NewElement,
288 _In_ PVOID NodeOrParent,
289 _In_ TABLE_SEARCH_RESULT SearchResult
290 );
291
292 NTSYSAPI
293 BOOLEAN
294 NTAPI
295 RtlDeleteElementGenericTable(
296 _In_ PRTL_GENERIC_TABLE Table,
297 _In_ PVOID Buffer
298 );
299
300 _Must_inspect_result_
301 NTSYSAPI
302 PVOID
303 NTAPI
304 RtlLookupElementGenericTable(
305 _In_ PRTL_GENERIC_TABLE Table,
306 _In_ PVOID Buffer
307 );
308
309 NTSYSAPI
310 PVOID
311 NTAPI
312 RtlLookupElementGenericTableFull(
313 _In_ PRTL_GENERIC_TABLE Table,
314 _In_ PVOID Buffer,
315 _Out_ PVOID *NodeOrParent,
316 _Out_ TABLE_SEARCH_RESULT *SearchResult
317 );
318
319 _Must_inspect_result_
320 NTSYSAPI
321 PVOID
322 NTAPI
323 RtlEnumerateGenericTable(
324 _In_ PRTL_GENERIC_TABLE Table,
325 _In_ BOOLEAN Restart
326 );
327
328 _Must_inspect_result_
329 NTSYSAPI
330 PVOID
331 NTAPI
332 RtlEnumerateGenericTableWithoutSplaying(
333 _In_ PRTL_GENERIC_TABLE Table,
334 _Inout_ PVOID *RestartKey
335 );
336
337 _Must_inspect_result_
338 NTSYSAPI
339 PVOID
340 NTAPI
341 RtlGetElementGenericTable(
342 _In_ PRTL_GENERIC_TABLE Table,
343 _In_ ULONG I
344 );
345
346 NTSYSAPI
347 ULONG
348 NTAPI
349 RtlNumberGenericTableElements(
350 _In_ PRTL_GENERIC_TABLE Table
351 );
352
353 _Must_inspect_result_
354 NTSYSAPI
355 BOOLEAN
356 NTAPI
357 RtlIsGenericTableEmpty(
358 _In_ PRTL_GENERIC_TABLE Table
359 );
360
361 #endif /* !RTL_USE_AVL_TABLES */
362
363 NTSYSAPI
364 PRTL_SPLAY_LINKS
365 NTAPI
366 RtlSplay(
367 _Inout_ PRTL_SPLAY_LINKS Links
368 );
369
370 NTSYSAPI
371 PRTL_SPLAY_LINKS
372 NTAPI
373 RtlDelete(
374 _In_ PRTL_SPLAY_LINKS Links
375 );
376
377 NTSYSAPI
378 VOID
379 NTAPI
380 RtlDeleteNoSplay(
381 _In_ PRTL_SPLAY_LINKS Links,
382 _Inout_ PRTL_SPLAY_LINKS *Root
383 );
384
385 _Must_inspect_result_
386 NTSYSAPI
387 PRTL_SPLAY_LINKS
388 NTAPI
389 RtlSubtreeSuccessor(
390 _In_ PRTL_SPLAY_LINKS Links
391 );
392
393 _Must_inspect_result_
394 NTSYSAPI
395 PRTL_SPLAY_LINKS
396 NTAPI
397 RtlSubtreePredecessor(
398 _In_ PRTL_SPLAY_LINKS Links
399 );
400
401 _Must_inspect_result_
402 NTSYSAPI
403 PRTL_SPLAY_LINKS
404 NTAPI
405 RtlRealSuccessor(
406 _In_ PRTL_SPLAY_LINKS Links
407 );
408
409 _Must_inspect_result_
410 NTSYSAPI
411 PRTL_SPLAY_LINKS
412 NTAPI
413 RtlRealPredecessor(
414 _In_ PRTL_SPLAY_LINKS Links
415 );
416
417 #define RtlIsLeftChild(Links) \
418 (RtlLeftChild(RtlParent(Links)) == (PRTL_SPLAY_LINKS)(Links))
419
420 #define RtlIsRightChild(Links) \
421 (RtlRightChild(RtlParent(Links)) == (PRTL_SPLAY_LINKS)(Links))
422
423 #define RtlRightChild(Links) \
424 ((PRTL_SPLAY_LINKS)(Links))->RightChild
425
426 #define RtlIsRoot(Links) \
427 (RtlParent(Links) == (PRTL_SPLAY_LINKS)(Links))
428
429 #define RtlLeftChild(Links) \
430 ((PRTL_SPLAY_LINKS)(Links))->LeftChild
431
432 #define RtlParent(Links) \
433 ((PRTL_SPLAY_LINKS)(Links))->Parent
434
435 // FIXME: use inline function
436
437 #define RtlInitializeSplayLinks(Links) \
438 { \
439 PRTL_SPLAY_LINKS _SplayLinks; \
440 _SplayLinks = (PRTL_SPLAY_LINKS)(Links); \
441 _SplayLinks->Parent = _SplayLinks; \
442 _SplayLinks->LeftChild = NULL; \
443 _SplayLinks->RightChild = NULL; \
444 }
445
446 #define RtlInsertAsLeftChild(ParentLinks,ChildLinks) \
447 { \
448 PRTL_SPLAY_LINKS _SplayParent; \
449 PRTL_SPLAY_LINKS _SplayChild; \
450 _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks); \
451 _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks); \
452 _SplayParent->LeftChild = _SplayChild; \
453 _SplayChild->Parent = _SplayParent; \
454 }
455
456 #define RtlInsertAsRightChild(ParentLinks,ChildLinks) \
457 { \
458 PRTL_SPLAY_LINKS _SplayParent; \
459 PRTL_SPLAY_LINKS _SplayChild; \
460 _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks); \
461 _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks); \
462 _SplayParent->RightChild = _SplayChild; \
463 _SplayChild->Parent = _SplayParent; \
464 }
465
466 //
467 // RTL AVL Tree Functions
468 //
469 NTSYSAPI
470 VOID
471 NTAPI
472 RtlInitializeGenericTableAvl(
473 _Out_ PRTL_AVL_TABLE Table,
474 _In_ PRTL_AVL_COMPARE_ROUTINE CompareRoutine,
475 _In_opt_ PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine,
476 _In_opt_ PRTL_AVL_FREE_ROUTINE FreeRoutine,
477 _In_opt_ PVOID TableContext
478 );
479
480 NTSYSAPI
481 PVOID
482 NTAPI
483 RtlInsertElementGenericTableAvl(
484 _In_ PRTL_AVL_TABLE Table,
485 _In_reads_bytes_(BufferSize) PVOID Buffer,
486 _In_ CLONG BufferSize,
487 _Out_opt_ PBOOLEAN NewElement
488 );
489
490 NTSYSAPI
491 PVOID
492 NTAPI
493 RtlInsertElementGenericTableFullAvl(
494 _In_ PRTL_AVL_TABLE Table,
495 _In_reads_bytes_(BufferSize) PVOID Buffer,
496 _In_ CLONG BufferSize,
497 _Out_opt_ PBOOLEAN NewElement,
498 _In_ PVOID NodeOrParent,
499 _In_ TABLE_SEARCH_RESULT SearchResult
500 );
501
502 NTSYSAPI
503 BOOLEAN
504 NTAPI
505 RtlDeleteElementGenericTableAvl(
506 _In_ PRTL_AVL_TABLE Table,
507 _In_ PVOID Buffer
508 );
509
510 _Must_inspect_result_
511 NTSYSAPI
512 PVOID
513 NTAPI
514 RtlLookupElementGenericTableAvl(
515 _In_ PRTL_AVL_TABLE Table,
516 _In_ PVOID Buffer
517 );
518
519 NTSYSAPI
520 PVOID
521 NTAPI
522 RtlLookupElementGenericTableFullAvl(
523 _In_ PRTL_AVL_TABLE Table,
524 _In_ PVOID Buffer,
525 _Out_ PVOID *NodeOrParent,
526 _Out_ TABLE_SEARCH_RESULT *SearchResult
527 );
528
529 _Must_inspect_result_
530 NTSYSAPI
531 PVOID
532 NTAPI
533 RtlEnumerateGenericTableAvl(
534 _In_ PRTL_AVL_TABLE Table,
535 _In_ BOOLEAN Restart
536 );
537
538 _Must_inspect_result_
539 NTSYSAPI
540 PVOID
541 NTAPI
542 RtlEnumerateGenericTableWithoutSplayingAvl(
543 _In_ PRTL_AVL_TABLE Table,
544 _Inout_ PVOID *RestartKey
545 );
546
547 _Must_inspect_result_
548 NTSYSAPI
549 PVOID
550 NTAPI
551 RtlLookupFirstMatchingElementGenericTableAvl(
552 _In_ PRTL_AVL_TABLE Table,
553 _In_ PVOID Buffer,
554 _Out_ PVOID *RestartKey
555 );
556
557 _Must_inspect_result_
558 NTSYSAPI
559 PVOID
560 NTAPI
561 RtlEnumerateGenericTableLikeADirectory(
562 _In_ PRTL_AVL_TABLE Table,
563 _In_opt_ PRTL_AVL_MATCH_FUNCTION MatchFunction,
564 _In_opt_ PVOID MatchData,
565 _In_ ULONG NextFlag,
566 _Inout_ PVOID *RestartKey,
567 _Inout_ PULONG DeleteCount,
568 _In_ PVOID Buffer
569 );
570
571 _Must_inspect_result_
572 NTSYSAPI
573 PVOID
574 NTAPI
575 RtlGetElementGenericTableAvl(
576 _In_ PRTL_AVL_TABLE Table,
577 _In_ ULONG I
578 );
579
580 NTSYSAPI
581 ULONG
582 NTAPI
583 RtlNumberGenericTableElementsAvl(
584 _In_ PRTL_AVL_TABLE Table
585 );
586
587 _Must_inspect_result_
588 NTSYSAPI
589 BOOLEAN
590 NTAPI
591 RtlIsGenericTableEmptyAvl(
592 _In_ PRTL_AVL_TABLE Table
593 );
594
595 #ifdef RTL_USE_AVL_TABLES
596
597 #define RtlInitializeGenericTable RtlInitializeGenericTableAvl
598 #define RtlInsertElementGenericTable RtlInsertElementGenericTableAvl
599 #define RtlInsertElementGenericTableFull RtlInsertElementGenericTableFullAvl
600 #define RtlDeleteElementGenericTable RtlDeleteElementGenericTableAvl
601 #define RtlLookupElementGenericTable RtlLookupElementGenericTableAvl
602 #define RtlLookupElementGenericTableFull RtlLookupElementGenericTableFullAvl
603 #define RtlEnumerateGenericTable RtlEnumerateGenericTableAvl
604 #define RtlEnumerateGenericTableWithoutSplaying RtlEnumerateGenericTableWithoutSplayingAvl
605 #define RtlGetElementGenericTable RtlGetElementGenericTableAvl
606 #define RtlNumberGenericTableElements RtlNumberGenericTableElementsAvl
607 #define RtlIsGenericTableEmpty RtlIsGenericTableEmptyAvl
608
609 #endif /* RTL_USE_AVL_TABLES */
610
611 //
612 // Exception and Error Functions
613 //
614 NTSYSAPI
615 PVOID
616 NTAPI
617 RtlAddVectoredExceptionHandler(
618 _In_ ULONG FirstHandler,
619 _In_ PVECTORED_EXCEPTION_HANDLER VectoredHandler
620 );
621
622 NTSYSAPI
623 ULONG
624 NTAPI
625 RtlRemoveVectoredExceptionHandler(
626 _In_ PVOID VectoredHandlerHandle
627 );
628
629 NTSYSAPI
630 PVOID
631 NTAPI
632 RtlAddVectoredContinueHandler(
633 _In_ ULONG FirstHandler,
634 _In_ PVECTORED_EXCEPTION_HANDLER VectoredHandler
635 );
636
637 NTSYSAPI
638 ULONG
639 NTAPI
640 RtlRemoveVectoredContinueHandler(
641 _In_ PVOID VectoredHandlerHandle
642 );
643
644 NTSYSAPI
645 VOID
646 NTAPI
647 RtlSetUnhandledExceptionFilter(
648 _In_ PRTLP_UNHANDLED_EXCEPTION_FILTER TopLevelExceptionFilter
649 );
650
651 NTSYSAPI
652 LONG
653 NTAPI
654 RtlUnhandledExceptionFilter(
655 _In_ struct _EXCEPTION_POINTERS* ExceptionInfo
656 );
657
658 __analysis_noreturn
659 NTSYSAPI
660 VOID
661 NTAPI
662 RtlAssert(
663 _In_ PVOID FailedAssertion,
664 _In_ PVOID FileName,
665 _In_ ULONG LineNumber,
666 _In_opt_z_ PCHAR Message
667 );
668
669 NTSYSAPI
670 PVOID
671 NTAPI
672 RtlEncodePointer(
673 _In_ PVOID Pointer
674 );
675
676 NTSYSAPI
677 PVOID
678 NTAPI
679 RtlDecodePointer(
680 _In_ PVOID Pointer
681 );
682
683 NTSYSAPI
684 PVOID
685 NTAPI
686 RtlEncodeSystemPointer(
687 _In_ PVOID Pointer
688 );
689
690 NTSYSAPI
691 PVOID
692 NTAPI
693 RtlDecodeSystemPointer(
694 _In_ PVOID Pointer
695 );
696
697 NTSYSAPI
698 NTSTATUS
699 NTAPI
700 RtlGetLastNtStatus(
701 VOID
702 );
703
704 NTSYSAPI
705 ULONG
706 NTAPI
707 RtlGetLastWin32Error(
708 VOID
709 );
710
711 NTSYSAPI
712 VOID
713 NTAPI
714 RtlSetLastWin32Error(
715 _In_ ULONG LastError
716 );
717
718 NTSYSAPI
719 VOID
720 NTAPI
721 RtlSetLastWin32ErrorAndNtStatusFromNtStatus(
722 _In_ NTSTATUS Status
723 );
724
725 NTSYSAPI
726 NTSTATUS
727 NTAPI
728 RtlSetThreadErrorMode(
729 _In_ ULONG NewMode,
730 _Out_opt_ PULONG OldMode
731 );
732
733 NTSYSAPI
734 ULONG
735 NTAPI
736 RtlGetThreadErrorMode(
737 VOID
738 );
739
740 #endif /* NTOS_MODE_USER */
741
742 NTSYSAPI
743 VOID
744 NTAPI
745 RtlCaptureContext(
746 _Out_ PCONTEXT ContextRecord
747 );
748
749 NTSYSAPI
750 BOOLEAN
751 NTAPI
752 RtlDispatchException(
753 _In_ PEXCEPTION_RECORD ExceptionRecord,
754 _In_ PCONTEXT Context
755 );
756
757 _IRQL_requires_max_(APC_LEVEL)
758 _When_(Status < 0, _Out_range_(>, 0))
759 _When_(Status >= 0, _Out_range_(==, 0))
760 NTSYSAPI
761 ULONG
762 NTAPI
763 RtlNtStatusToDosError(
764 _In_ NTSTATUS Status
765 );
766
767 _When_(Status < 0, _Out_range_(>, 0))
768 _When_(Status >= 0, _Out_range_(==, 0))
769 NTSYSAPI
770 ULONG
771 NTAPI
772 RtlNtStatusToDosErrorNoTeb(
773 _In_ NTSTATUS Status
774 );
775
776 NTSYSAPI
777 NTSTATUS
778 NTAPI
779 RtlMapSecurityErrorToNtStatus(
780 _In_ ULONG SecurityError
781 );
782
783 NTSYSAPI
784 VOID
785 NTAPI
786 RtlRaiseException(
787 _In_ PEXCEPTION_RECORD ExceptionRecord
788 );
789
790 DECLSPEC_NORETURN
791 NTSYSAPI
792 VOID
793 NTAPI
794 RtlRaiseStatus(
795 _In_ NTSTATUS Status
796 );
797
798 NTSYSAPI
799 VOID
800 NTAPI
801 RtlUnwind(
802 _In_opt_ PVOID TargetFrame,
803 _In_opt_ PVOID TargetIp,
804 _In_opt_ PEXCEPTION_RECORD ExceptionRecord,
805 _In_ PVOID ReturnValue
806 );
807
808 #define RTL_STACK_WALKING_MODE_FRAMES_TO_SKIP_SHIFT 8
809
810 //
811 // Tracing Functions
812 //
813 NTSYSAPI
814 ULONG
815 NTAPI
816 RtlWalkFrameChain(
817 _Out_writes_(Count - (Flags >> RTL_STACK_WALKING_MODE_FRAMES_TO_SKIP_SHIFT)) PVOID *Callers,
818 _In_ ULONG Count,
819 _In_ ULONG Flags
820 );
821
822 NTSYSAPI
823 USHORT
824 NTAPI
825 RtlLogStackBackTrace(
826 VOID
827 );
828
829 #ifdef NTOS_MODE_USER
830 //
831 // Heap Functions
832 //
833 _Must_inspect_result_
834 _Ret_maybenull_
835 _Post_writable_byte_size_(Size)
836 NTSYSAPI
837 PVOID
838 NTAPI
839 RtlAllocateHeap(
840 _In_ PVOID HeapHandle,
841 _In_opt_ ULONG Flags,
842 _In_ SIZE_T Size
843 );
844
845 _Must_inspect_result_
846 NTSYSAPI
847 PVOID
848 NTAPI
849 RtlCreateHeap(
850 _In_ ULONG Flags,
851 _In_opt_ PVOID BaseAddress,
852 _In_opt_ SIZE_T SizeToReserve,
853 _In_opt_ SIZE_T SizeToCommit,
854 _In_opt_ PVOID Lock,
855 _In_opt_ PRTL_HEAP_PARAMETERS Parameters
856 );
857
858 NTSYSAPI
859 ULONG
860 NTAPI
861 RtlCreateTagHeap(
862 _In_ HANDLE HeapHandle,
863 _In_ ULONG Flags,
864 _In_ PWSTR TagName,
865 _In_ PWSTR TagSubName
866 );
867
868 ULONG
869 NTAPI
870 RtlCompactHeap(
871 _In_ HANDLE Heap,
872 _In_ ULONG Flags
873 );
874
875 _Must_inspect_result_
876 NTSYSAPI
877 PVOID
878 NTAPI
879 RtlDebugCreateHeap(
880 _In_ ULONG Flags,
881 _In_opt_ PVOID BaseAddress,
882 _In_opt_ SIZE_T SizeToReserve,
883 _In_opt_ SIZE_T SizeToCommit,
884 _In_opt_ PVOID Lock,
885 _In_opt_ PRTL_HEAP_PARAMETERS Parameters
886 );
887
888 NTSYSAPI
889 HANDLE
890 NTAPI
891 RtlDestroyHeap(
892 _In_ _Post_invalid_ HANDLE Heap
893 );
894
895 NTSYSAPI
896 ULONG
897 NTAPI
898 RtlExtendHeap(
899 _In_ HANDLE Heap,
900 _In_ ULONG Flags,
901 _In_ PVOID P,
902 _In_ SIZE_T Size
903 );
904
905 _Success_(return != 0)
906 NTSYSAPI
907 BOOLEAN
908 NTAPI
909 RtlFreeHeap(
910 _In_ HANDLE HeapHandle,
911 _In_opt_ ULONG Flags,
912 _In_ _Post_invalid_ PVOID P
913 );
914
915 ULONG
916 NTAPI
917 RtlGetProcessHeaps(
918 _In_ ULONG HeapCount,
919 _Out_cap_(HeapCount) HANDLE *HeapArray
920 );
921
922 _Success_(return != 0)
923 BOOLEAN
924 NTAPI
925 RtlGetUserInfoHeap(
926 _In_ PVOID HeapHandle,
927 _In_ ULONG Flags,
928 _In_ PVOID BaseAddress,
929 _Inout_opt_ PVOID *UserValue,
930 _Out_opt_ PULONG UserFlags
931 );
932
933 NTSYSAPI
934 PVOID
935 NTAPI
936 RtlProtectHeap(
937 _In_ PVOID HeapHandle,
938 _In_ BOOLEAN Protect
939 );
940
941 NTSYSAPI
942 NTSTATUS
943 NTAPI
944 RtlQueryHeapInformation(
945 _In_ PVOID HeapHandle,
946 _In_ HEAP_INFORMATION_CLASS HeapInformationClass,
947 _Out_ PVOID HeapInformation,
948 _In_ SIZE_T HeapInformationLength,
949 _When_(HeapInformationClass==HeapCompatibilityInformation, _On_failure_(_Out_opt_))
950 _Out_opt_ PSIZE_T ReturnLength
951 );
952
953 _Ret_opt_z_
954 NTSYSAPI
955 PWSTR
956 NTAPI
957 RtlQueryTagHeap(
958 _In_ PVOID HeapHandle,
959 _In_ ULONG Flags,
960 _In_ USHORT TagIndex,
961 _In_ BOOLEAN ResetCounters,
962 _Out_ PRTL_HEAP_TAG_INFO HeapTagInfo
963 );
964
965 _Must_inspect_result_
966 _Ret_maybenull_
967 _Post_writable_byte_size_(Size)
968 NTSYSAPI
969 PVOID
970 NTAPI
971 RtlReAllocateHeap(
972 _In_ HANDLE Heap,
973 _In_opt_ ULONG Flags,
974 _In_ _Post_invalid_ PVOID Ptr,
975 _In_ SIZE_T Size
976 );
977
978 NTSYSAPI
979 NTSTATUS
980 NTAPI
981 RtlSetHeapInformation(
982 _In_ PVOID HeapHandle,
983 _In_ HEAP_INFORMATION_CLASS HeapInformationClass,
984 _When_(HeapInformationClass==HeapCompatibilityInformation,_In_) PVOID HeapInformation,
985 _In_ SIZE_T HeapInformationLength
986 );
987
988 NTSYSAPI
989 BOOLEAN
990 NTAPI
991 RtlLockHeap(
992 _In_ HANDLE Heap
993 );
994
995 _Must_inspect_result_
996 NTSYSAPI
997 NTSTATUS
998 NTAPI
999 RtlMultipleAllocateHeap (
1000 _In_ HANDLE HeapHandle,
1001 _In_ ULONG Flags,
1002 _In_ SIZE_T Size,
1003 _In_ ULONG Count,
1004 _Out_cap_(Count) _Deref_post_bytecap_(Size) PVOID * Array
1005 );
1006
1007 NTSYSAPI
1008 NTSTATUS
1009 NTAPI
1010 RtlMultipleFreeHeap (
1011 _In_ HANDLE HeapHandle,
1012 _In_ ULONG Flags,
1013 _In_ ULONG Count,
1014 _In_count_(Count) /* _Deref_ _Post_invalid_ */ PVOID * Array
1015 );
1016
1017 NTSYSAPI
1018 NTSTATUS
1019 NTAPI
1020 RtlUsageHeap(
1021 _In_ HANDLE Heap,
1022 _In_ ULONG Flags,
1023 _Out_ PRTL_HEAP_USAGE Usage
1024 );
1025
1026 NTSYSAPI
1027 BOOLEAN
1028 NTAPI
1029 RtlUnlockHeap(
1030 _In_ HANDLE Heap
1031 );
1032
1033 BOOLEAN
1034 NTAPI
1035 RtlSetUserValueHeap(
1036 _In_ PVOID HeapHandle,
1037 _In_ ULONG Flags,
1038 _In_ PVOID BaseAddress,
1039 _In_ PVOID UserValue
1040 );
1041
1042 BOOLEAN
1043 NTAPI
1044 RtlSetUserFlagsHeap(
1045 _In_ PVOID HeapHandle,
1046 _In_ ULONG Flags,
1047 _In_ PVOID BaseAddress,
1048 _In_ ULONG UserFlagsReset,
1049 _In_ ULONG UserFlagsSet
1050 );
1051
1052 NTSYSAPI
1053 BOOLEAN
1054 NTAPI
1055 RtlValidateHeap(
1056 _In_ HANDLE Heap,
1057 _In_ ULONG Flags,
1058 _In_opt_ PVOID P
1059 );
1060
1061 NTSYSAPI
1062 NTSTATUS
1063 NTAPI
1064 RtlWalkHeap(
1065 _In_ HANDLE HeapHandle,
1066 _In_ PVOID HeapEntry
1067 );
1068
1069 #define RtlGetProcessHeap() (NtCurrentPeb()->ProcessHeap)
1070
1071 #endif // NTOS_MODE_USER
1072
1073 #define NtCurrentPeb() (NtCurrentTeb()->ProcessEnvironmentBlock)
1074
1075 NTSYSAPI
1076 SIZE_T
1077 NTAPI
1078 RtlSizeHeap(
1079 _In_ PVOID HeapHandle,
1080 _In_ ULONG Flags,
1081 _In_ PVOID MemoryPointer
1082 );
1083
1084
1085 //
1086 // Security Functions
1087 //
1088 _IRQL_requires_max_(APC_LEVEL)
1089 NTSYSAPI
1090 NTSTATUS
1091 NTAPI
1092 RtlAbsoluteToSelfRelativeSD(
1093 _In_ PSECURITY_DESCRIPTOR AbsoluteSecurityDescriptor,
1094 _Out_writes_bytes_to_opt_(*BufferLength, *BufferLength) PSECURITY_DESCRIPTOR SelfRelativeSecurityDescriptor,
1095 _Inout_ PULONG BufferLength
1096 );
1097
1098 _IRQL_requires_max_(APC_LEVEL)
1099 NTSYSAPI
1100 NTSTATUS
1101 NTAPI
1102 RtlAddAccessAllowedAce(
1103 _Inout_ PACL Acl,
1104 _In_ ULONG Revision,
1105 _In_ ACCESS_MASK AccessMask,
1106 _In_ PSID Sid
1107 );
1108
1109 _IRQL_requires_max_(APC_LEVEL)
1110 NTSYSAPI
1111 NTSTATUS
1112 NTAPI
1113 RtlAddAccessAllowedAceEx(
1114 _Inout_ PACL pAcl,
1115 _In_ ULONG dwAceRevision,
1116 _In_ ULONG AceFlags,
1117 _In_ ACCESS_MASK AccessMask,
1118 _In_ PSID pSid
1119 );
1120
1121 NTSYSAPI
1122 NTSTATUS
1123 NTAPI
1124 RtlAddAccessAllowedObjectAce(
1125 _Inout_ PACL pAcl,
1126 _In_ ULONG dwAceRevision,
1127 _In_ ULONG AceFlags,
1128 _In_ ACCESS_MASK AccessMask,
1129 _In_opt_ GUID *ObjectTypeGuid,
1130 _In_opt_ GUID *InheritedObjectTypeGuid,
1131 _In_ PSID pSid
1132 );
1133
1134 NTSYSAPI
1135 NTSTATUS
1136 NTAPI
1137 RtlAddAccessDeniedAce(
1138 _Inout_ PACL Acl,
1139 _In_ ULONG Revision,
1140 _In_ ACCESS_MASK AccessMask,
1141 _In_ PSID Sid
1142 );
1143
1144 NTSYSAPI
1145 NTSTATUS
1146 NTAPI
1147 RtlAddAccessDeniedAceEx(
1148 _Inout_ PACL Acl,
1149 _In_ ULONG Revision,
1150 _In_ ULONG Flags,
1151 _In_ ACCESS_MASK AccessMask,
1152 _In_ PSID Sid
1153 );
1154
1155 NTSYSAPI
1156 NTSTATUS
1157 NTAPI
1158 RtlAddAccessDeniedObjectAce(
1159 _Inout_ PACL pAcl,
1160 _In_ ULONG dwAceRevision,
1161 _In_ ULONG AceFlags,
1162 _In_ ACCESS_MASK AccessMask,
1163 _In_opt_ GUID *ObjectTypeGuid,
1164 _In_opt_ GUID *InheritedObjectTypeGuid,
1165 _In_ PSID pSid
1166 );
1167
1168 NTSYSAPI
1169 NTSTATUS
1170 NTAPI
1171 RtlAddAce(
1172 _Inout_ PACL Acl,
1173 _In_ ULONG AceRevision,
1174 _In_ ULONG StartingAceIndex,
1175 _In_reads_bytes_(AceListLength) PVOID AceList,
1176 _In_ ULONG AceListLength
1177 );
1178
1179 NTSYSAPI
1180 NTSTATUS
1181 NTAPI
1182 RtlAddAuditAccessAce(
1183 _Inout_ PACL Acl,
1184 _In_ ULONG Revision,
1185 _In_ ACCESS_MASK AccessMask,
1186 _In_ PSID Sid,
1187 _In_ BOOLEAN Success,
1188 _In_ BOOLEAN Failure
1189 );
1190
1191 NTSYSAPI
1192 NTSTATUS
1193 NTAPI
1194 RtlAcquirePrivilege(
1195 _In_ PULONG Privilege,
1196 _In_ ULONG NumPriv,
1197 _In_ ULONG Flags,
1198 _Out_ PVOID *ReturnedState
1199 );
1200
1201 NTSYSAPI
1202 NTSTATUS
1203 NTAPI
1204 RtlAddAuditAccessAceEx(
1205 _Inout_ PACL Acl,
1206 _In_ ULONG Revision,
1207 _In_ ULONG Flags,
1208 _In_ ACCESS_MASK AccessMask,
1209 _In_ PSID Sid,
1210 _In_ BOOLEAN Success,
1211 _In_ BOOLEAN Failure
1212 );
1213
1214 NTSYSAPI
1215 NTSTATUS
1216 NTAPI
1217 RtlAddAuditAccessObjectAce(
1218 _Inout_ PACL Acl,
1219 _In_ ULONG Revision,
1220 _In_ ULONG Flags,
1221 _In_ ACCESS_MASK AccessMask,
1222 _In_opt_ GUID *ObjectTypeGuid,
1223 _In_opt_ GUID *InheritedObjectTypeGuid,
1224 _In_ PSID Sid,
1225 _In_ BOOLEAN Success,
1226 _In_ BOOLEAN Failure
1227 );
1228
1229 NTSYSAPI
1230 NTSTATUS
1231 NTAPI
1232 RtlAddMandatoryAce(
1233 _Inout_ PACL Acl,
1234 _In_ ULONG Revision,
1235 _In_ ULONG Flags,
1236 _In_ ULONG MandatoryFlags,
1237 _In_ UCHAR AceType,
1238 _In_ PSID LabelSid);
1239
1240 NTSYSAPI
1241 NTSTATUS
1242 NTAPI
1243 RtlAdjustPrivilege(
1244 _In_ ULONG Privilege,
1245 _In_ BOOLEAN NewValue,
1246 _In_ BOOLEAN ForThread,
1247 _Out_ PBOOLEAN OldValue
1248 );
1249
1250 _Must_inspect_result_
1251 NTSYSAPI
1252 NTSTATUS
1253 NTAPI
1254 RtlAllocateAndInitializeSid(
1255 _In_ PSID_IDENTIFIER_AUTHORITY IdentifierAuthority,
1256 _In_ UCHAR SubAuthorityCount,
1257 _In_ ULONG SubAuthority0,
1258 _In_ ULONG SubAuthority1,
1259 _In_ ULONG SubAuthority2,
1260 _In_ ULONG SubAuthority3,
1261 _In_ ULONG SubAuthority4,
1262 _In_ ULONG SubAuthority5,
1263 _In_ ULONG SubAuthority6,
1264 _In_ ULONG SubAuthority7,
1265 _Outptr_ PSID *Sid
1266 );
1267
1268 NTSYSAPI
1269 BOOLEAN
1270 NTAPI
1271 RtlAreAllAccessesGranted(
1272 ACCESS_MASK GrantedAccess,
1273 ACCESS_MASK DesiredAccess
1274 );
1275
1276 NTSYSAPI
1277 BOOLEAN
1278 NTAPI
1279 RtlAreAnyAccessesGranted(
1280 ACCESS_MASK GrantedAccess,
1281 ACCESS_MASK DesiredAccess
1282 );
1283
1284 _IRQL_requires_max_(APC_LEVEL)
1285 NTSYSAPI
1286 VOID
1287 NTAPI
1288 RtlCopyLuid (
1289 _Out_ PLUID DestinationLuid,
1290 _In_ PLUID SourceLuid
1291 );
1292
1293 NTSYSAPI
1294 VOID
1295 NTAPI
1296 RtlCopyLuidAndAttributesArray(
1297 ULONG Count,
1298 PLUID_AND_ATTRIBUTES Src,
1299 PLUID_AND_ATTRIBUTES Dest
1300 );
1301
1302 NTSYSAPI
1303 NTSTATUS
1304 NTAPI
1305 RtlCopySidAndAttributesArray(
1306 _In_ ULONG Count,
1307 _In_ PSID_AND_ATTRIBUTES Src,
1308 _In_ ULONG SidAreaSize,
1309 _In_ PSID_AND_ATTRIBUTES Dest,
1310 _In_ PSID SidArea,
1311 _Out_ PSID* RemainingSidArea,
1312 _Out_ PULONG RemainingSidAreaSize
1313 );
1314
1315 _IRQL_requires_max_(APC_LEVEL)
1316 NTSYSAPI
1317 NTSTATUS
1318 NTAPI
1319 RtlConvertSidToUnicodeString(
1320 _Inout_ PUNICODE_STRING UnicodeString,
1321 _In_ PSID Sid,
1322 _In_ BOOLEAN AllocateDestinationString
1323 );
1324
1325 _IRQL_requires_max_(APC_LEVEL)
1326 NTSYSAPI
1327 NTSTATUS
1328 NTAPI
1329 RtlCopySid(
1330 _In_ ULONG DestinationSidLength,
1331 _Out_writes_bytes_(DestinationSidLength) PSID DestinationSid,
1332 _In_ PSID SourceSid
1333 );
1334
1335 NTSYSAPI
1336 NTSTATUS
1337 NTAPI
1338 RtlCreateAcl(
1339 PACL Acl,
1340 ULONG AclSize,
1341 ULONG AclRevision
1342 );
1343
1344 NTSYSAPI
1345 NTSTATUS
1346 NTAPI
1347 RtlCreateSecurityDescriptor(
1348 _Out_ PSECURITY_DESCRIPTOR SecurityDescriptor,
1349 _In_ ULONG Revision
1350 );
1351
1352 NTSYSAPI
1353 NTSTATUS
1354 NTAPI
1355 RtlCreateSecurityDescriptorRelative(
1356 _Out_ PISECURITY_DESCRIPTOR_RELATIVE SecurityDescriptor,
1357 _In_ ULONG Revision
1358 );
1359
1360 NTSYSAPI
1361 NTSTATUS
1362 NTAPI
1363 RtlCopySecurityDescriptor(
1364 _In_ PSECURITY_DESCRIPTOR pSourceSecurityDescriptor,
1365 _Out_ PSECURITY_DESCRIPTOR *pDestinationSecurityDescriptor
1366 );
1367
1368 NTSYSAPI
1369 NTSTATUS
1370 NTAPI
1371 RtlDeleteAce(
1372 PACL Acl,
1373 ULONG AceIndex
1374 );
1375
1376 NTSYSAPI
1377 BOOLEAN
1378 NTAPI
1379 RtlEqualPrefixSid(
1380 PSID Sid1,
1381 PSID Sid2
1382 );
1383
1384 NTSYSAPI
1385 BOOLEAN
1386 NTAPI
1387 RtlEqualSid (
1388 _In_ PSID Sid1,
1389 _In_ PSID Sid2
1390 );
1391
1392 NTSYSAPI
1393 BOOLEAN
1394 NTAPI
1395 RtlFirstFreeAce(
1396 PACL Acl,
1397 PACE* Ace
1398 );
1399
1400 NTSYSAPI
1401 PVOID
1402 NTAPI
1403 RtlFreeSid(
1404 _In_ _Post_invalid_ PSID Sid
1405 );
1406
1407 NTSYSAPI
1408 NTSTATUS
1409 NTAPI
1410 RtlGetAce(
1411 PACL Acl,
1412 ULONG AceIndex,
1413 PVOID *Ace
1414 );
1415
1416 NTSYSAPI
1417 NTSTATUS
1418 NTAPI
1419 RtlGetControlSecurityDescriptor(
1420 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,
1421 _Out_ PSECURITY_DESCRIPTOR_CONTROL Control,
1422 _Out_ PULONG Revision
1423 );
1424
1425 NTSYSAPI
1426 NTSTATUS
1427 NTAPI
1428 RtlGetDaclSecurityDescriptor(
1429 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,
1430 _Out_ PBOOLEAN DaclPresent,
1431 _Out_ PACL *Dacl,
1432 _Out_ PBOOLEAN DaclDefaulted
1433 );
1434
1435 NTSYSAPI
1436 NTSTATUS
1437 NTAPI
1438 RtlGetSaclSecurityDescriptor(
1439 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,
1440 _Out_ PBOOLEAN SaclPresent,
1441 _Out_ PACL* Sacl,
1442 _Out_ PBOOLEAN SaclDefaulted
1443 );
1444
1445 NTSYSAPI
1446 NTSTATUS
1447 NTAPI
1448 RtlGetGroupSecurityDescriptor(
1449 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,
1450 _Out_ PSID *Group,
1451 _Out_ PBOOLEAN GroupDefaulted
1452 );
1453
1454 NTSYSAPI
1455 NTSTATUS
1456 NTAPI
1457 RtlGetOwnerSecurityDescriptor(
1458 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,
1459 _Out_ PSID *Owner,
1460 _Out_ PBOOLEAN OwnerDefaulted
1461 );
1462
1463 NTSYSAPI
1464 BOOLEAN
1465 NTAPI
1466 RtlGetSecurityDescriptorRMControl(
1467 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,
1468 _Out_ PUCHAR RMControl
1469 );
1470
1471 NTSYSAPI
1472 PSID_IDENTIFIER_AUTHORITY
1473 NTAPI
1474 RtlIdentifierAuthoritySid(PSID Sid);
1475
1476 NTSYSAPI
1477 NTSTATUS
1478 NTAPI
1479 RtlImpersonateSelf(IN SECURITY_IMPERSONATION_LEVEL ImpersonationLevel);
1480
1481 _IRQL_requires_max_(APC_LEVEL)
1482 NTSYSAPI
1483 NTSTATUS
1484 NTAPI
1485 RtlInitializeSid(
1486 _Out_ PSID Sid,
1487 _In_ PSID_IDENTIFIER_AUTHORITY IdentifierAuthority,
1488 _In_ UCHAR SubAuthorityCount
1489 );
1490
1491 NTSYSAPI
1492 ULONG
1493 NTAPI
1494 RtlLengthRequiredSid(IN ULONG SubAuthorityCount);
1495
1496 _IRQL_requires_max_(APC_LEVEL)
1497 NTSYSAPI
1498 ULONG
1499 NTAPI
1500 RtlLengthSecurityDescriptor(
1501 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor);
1502
1503 NTSYSAPI
1504 ULONG
1505 NTAPI
1506 RtlLengthSid(IN PSID Sid);
1507
1508 NTSYSAPI
1509 NTSTATUS
1510 NTAPI
1511 RtlMakeSelfRelativeSD(
1512 _In_ PSECURITY_DESCRIPTOR AbsoluteSD,
1513 _Out_ PSECURITY_DESCRIPTOR SelfRelativeSD,
1514 _Inout_ PULONG BufferLength);
1515
1516 NTSYSAPI
1517 VOID
1518 NTAPI
1519 RtlMapGenericMask(
1520 PACCESS_MASK AccessMask,
1521 PGENERIC_MAPPING GenericMapping
1522 );
1523
1524 #ifdef NTOS_MODE_USER
1525
1526 NTSYSAPI
1527 NTSTATUS
1528 NTAPI
1529 RtlQueryInformationAcl(
1530 PACL Acl,
1531 PVOID Information,
1532 ULONG InformationLength,
1533 ACL_INFORMATION_CLASS InformationClass
1534 );
1535
1536 #endif
1537
1538 NTSYSAPI
1539 VOID
1540 NTAPI
1541 RtlReleasePrivilege(
1542 _In_ PVOID ReturnedState
1543 );
1544
1545 _IRQL_requires_max_(APC_LEVEL)
1546 NTSYSAPI
1547 NTSTATUS
1548 NTAPI
1549 RtlSelfRelativeToAbsoluteSD(
1550 _In_ PSECURITY_DESCRIPTOR SelfRelativeSecurityDescriptor,
1551 _Out_writes_bytes_to_opt_(*AbsoluteSecurityDescriptorSize, *AbsoluteSecurityDescriptorSize) PSECURITY_DESCRIPTOR AbsoluteSecurityDescriptor,
1552 _Inout_ PULONG AbsoluteSecurityDescriptorSize,
1553 _Out_writes_bytes_to_opt_(*DaclSize, *DaclSize) PACL Dacl,
1554 _Inout_ PULONG DaclSize,
1555 _Out_writes_bytes_to_opt_(*SaclSize, *SaclSize) PACL Sacl,
1556 _Inout_ PULONG SaclSize,
1557 _Out_writes_bytes_to_opt_(*OwnerSize, *OwnerSize) PSID Owner,
1558 _Inout_ PULONG OwnerSize,
1559 _Out_writes_bytes_to_opt_(*PrimaryGroupSize, *PrimaryGroupSize) PSID PrimaryGroup,
1560 _Inout_ PULONG PrimaryGroupSize
1561 );
1562
1563 NTSYSAPI
1564 NTSTATUS
1565 NTAPI
1566 RtlSelfRelativeToAbsoluteSD2(
1567 _Inout_ PSECURITY_DESCRIPTOR SelfRelativeSD,
1568 _Out_ PULONG BufferSize
1569 );
1570
1571 NTSYSAPI
1572 NTSTATUS
1573 NTAPI
1574 RtlSetAttributesSecurityDescriptor(
1575 _Inout_ PSECURITY_DESCRIPTOR SecurityDescriptor,
1576 _In_ SECURITY_DESCRIPTOR_CONTROL Control,
1577 _Out_ PULONG Revision
1578 );
1579
1580 NTSYSAPI
1581 NTSTATUS
1582 NTAPI
1583 RtlSetControlSecurityDescriptor(
1584 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,
1585 _In_ SECURITY_DESCRIPTOR_CONTROL ControlBitsOfInterest,
1586 _In_ SECURITY_DESCRIPTOR_CONTROL ControlBitsToSet
1587 );
1588
1589 _IRQL_requires_max_(APC_LEVEL)
1590 NTSYSAPI
1591 NTSTATUS
1592 NTAPI
1593 RtlSetDaclSecurityDescriptor(
1594 _Inout_ PSECURITY_DESCRIPTOR SecurityDescriptor,
1595 _In_ BOOLEAN DaclPresent,
1596 _In_opt_ PACL Dacl,
1597 _In_opt_ BOOLEAN DaclDefaulted
1598 );
1599
1600 _IRQL_requires_max_(APC_LEVEL)
1601 NTSYSAPI
1602 NTSTATUS
1603 NTAPI
1604 RtlSetGroupSecurityDescriptor(
1605 _Inout_ PSECURITY_DESCRIPTOR SecurityDescriptor,
1606 _In_opt_ PSID Group,
1607 _In_opt_ BOOLEAN GroupDefaulted
1608 );
1609
1610 #ifdef NTOS_MODE_USER
1611
1612 NTSYSAPI
1613 NTSTATUS
1614 NTAPI
1615 RtlSetInformationAcl(
1616 PACL Acl,
1617 PVOID Information,
1618 ULONG InformationLength,
1619 ACL_INFORMATION_CLASS InformationClass
1620 );
1621
1622 #endif
1623
1624 _IRQL_requires_max_(APC_LEVEL)
1625 NTSYSAPI
1626 NTSTATUS
1627 NTAPI
1628 RtlSetOwnerSecurityDescriptor(
1629 _Inout_ PSECURITY_DESCRIPTOR SecurityDescriptor,
1630 _In_opt_ PSID Owner,
1631 _In_opt_ BOOLEAN OwnerDefaulted
1632 );
1633
1634 NTSYSAPI
1635 NTSTATUS
1636 NTAPI
1637 RtlSetSaclSecurityDescriptor(
1638 _Inout_ PSECURITY_DESCRIPTOR SecurityDescriptor,
1639 _In_ BOOLEAN SaclPresent,
1640 _In_ PACL Sacl,
1641 _In_ BOOLEAN SaclDefaulted
1642 );
1643
1644 NTSYSAPI
1645 VOID
1646 NTAPI
1647 RtlSetSecurityDescriptorRMControl(
1648 _Inout_ PSECURITY_DESCRIPTOR SecurityDescriptor,
1649 _In_ PUCHAR RMControl
1650 );
1651
1652 NTSYSAPI
1653 PUCHAR
1654 NTAPI
1655 RtlSubAuthorityCountSid(
1656 _In_ PSID Sid
1657 );
1658
1659 NTSYSAPI
1660 PULONG
1661 NTAPI
1662 RtlSubAuthoritySid(
1663 _In_ PSID Sid,
1664 _In_ ULONG SubAuthority
1665 );
1666
1667 _IRQL_requires_max_(APC_LEVEL)
1668 _Must_inspect_result_
1669 NTSYSAPI
1670 BOOLEAN
1671 NTAPI
1672 RtlValidRelativeSecurityDescriptor(
1673 _In_reads_bytes_(SecurityDescriptorLength) PSECURITY_DESCRIPTOR SecurityDescriptorInput,
1674 _In_ ULONG SecurityDescriptorLength,
1675 _In_ SECURITY_INFORMATION RequiredInformation
1676 );
1677
1678 NTSYSAPI
1679 BOOLEAN
1680 NTAPI
1681 RtlValidSecurityDescriptor(IN PSECURITY_DESCRIPTOR SecurityDescriptor);
1682
1683 NTSYSAPI
1684 BOOLEAN
1685 NTAPI
1686 RtlValidSid(IN PSID Sid);
1687
1688 NTSYSAPI
1689 BOOLEAN
1690 NTAPI
1691 RtlValidAcl(PACL Acl);
1692
1693 NTSYSAPI
1694 NTSTATUS
1695 NTAPI
1696 RtlDeleteSecurityObject(
1697 _In_ PSECURITY_DESCRIPTOR *ObjectDescriptor
1698 );
1699
1700 NTSYSAPI
1701 NTSTATUS
1702 NTAPI
1703 RtlNewSecurityObject(
1704 _In_ PSECURITY_DESCRIPTOR ParentDescriptor,
1705 _In_ PSECURITY_DESCRIPTOR CreatorDescriptor,
1706 _Out_ PSECURITY_DESCRIPTOR *NewDescriptor,
1707 _In_ BOOLEAN IsDirectoryObject,
1708 _In_ HANDLE Token,
1709 _In_ PGENERIC_MAPPING GenericMapping
1710 );
1711
1712 NTSYSAPI
1713 NTSTATUS
1714 NTAPI
1715 RtlQuerySecurityObject(
1716 _In_ PSECURITY_DESCRIPTOR ObjectDescriptor,
1717 _In_ SECURITY_INFORMATION SecurityInformation,
1718 _Out_ PSECURITY_DESCRIPTOR ResultantDescriptor,
1719 _In_ ULONG DescriptorLength,
1720 _Out_ PULONG ReturnLength
1721 );
1722
1723 NTSYSAPI
1724 NTSTATUS
1725 NTAPI
1726 RtlSetSecurityObject(
1727 _In_ SECURITY_INFORMATION SecurityInformation,
1728 _In_ PSECURITY_DESCRIPTOR ModificationDescriptor,
1729 _Out_ PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor,
1730 _In_ PGENERIC_MAPPING GenericMapping,
1731 _In_ HANDLE Token
1732 );
1733
1734 //
1735 // Single-Character Functions
1736 //
1737 NTSYSAPI
1738 NTSTATUS
1739 NTAPI
1740 RtlLargeIntegerToChar(
1741 _In_ PLARGE_INTEGER Value,
1742 _In_ ULONG Base,
1743 _In_ ULONG Length,
1744 _Out_ PCHAR String
1745 );
1746
1747 NTSYSAPI
1748 CHAR
1749 NTAPI
1750 RtlUpperChar(CHAR Source);
1751
1752 NTSYSAPI
1753 WCHAR
1754 NTAPI
1755 RtlUpcaseUnicodeChar(WCHAR Source);
1756
1757 NTSYSAPI
1758 WCHAR
1759 NTAPI
1760 RtlDowncaseUnicodeChar(IN WCHAR Source);
1761
1762 NTSYSAPI
1763 NTSTATUS
1764 NTAPI
1765 RtlIntegerToChar(
1766 _In_ ULONG Value,
1767 _In_ ULONG Base,
1768 _In_ ULONG Length,
1769 _Out_ PCHAR String
1770 );
1771
1772 NTSYSAPI
1773 NTSTATUS
1774 NTAPI
1775 RtlIntegerToUnicode(
1776 _In_ ULONG Value,
1777 _In_opt_ ULONG Base,
1778 _In_opt_ ULONG Length,
1779 _Inout_ LPWSTR String
1780 );
1781
1782 _IRQL_requires_max_(PASSIVE_LEVEL)
1783 _At_(String->MaximumLength, _Const_)
1784 NTSYSAPI
1785 NTSTATUS
1786 NTAPI
1787 RtlIntegerToUnicodeString(
1788 _In_ ULONG Value,
1789 _In_opt_ ULONG Base,
1790 _Inout_ PUNICODE_STRING String
1791 );
1792
1793 NTSYSAPI
1794 NTSTATUS
1795 NTAPI
1796 RtlCharToInteger(
1797 PCSZ String,
1798 ULONG Base,
1799 PULONG Value
1800 );
1801
1802 //
1803 // Byte Swap Functions
1804 //
1805 #ifdef NTOS_MODE_USER
1806
1807 unsigned short __cdecl _byteswap_ushort(unsigned short);
1808 unsigned long __cdecl _byteswap_ulong (unsigned long);
1809 unsigned __int64 __cdecl _byteswap_uint64(unsigned __int64);
1810 #ifdef _MSC_VER
1811 #pragma intrinsic(_byteswap_ushort)
1812 #pragma intrinsic(_byteswap_ulong)
1813 #pragma intrinsic(_byteswap_uint64)
1814 #endif // _MSC_VER
1815 #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
1816 #define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
1817 #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
1818
1819 #endif // NTOS_MODE_USER
1820
1821 //
1822 // Unicode->Ansi String Functions
1823 //
1824 NTSYSAPI
1825 ULONG
1826 NTAPI
1827 RtlxUnicodeStringToAnsiSize(IN PCUNICODE_STRING UnicodeString);
1828
1829 #ifdef NTOS_MODE_USER
1830
1831 #define RtlUnicodeStringToAnsiSize(STRING) ( \
1832 NLS_MB_CODE_PAGE_TAG ? \
1833 RtlxUnicodeStringToAnsiSize(STRING) : \
1834 ((STRING)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
1835 )
1836
1837 #endif
1838
1839 NTSYSAPI
1840 NTSTATUS
1841 NTAPI
1842 RtlUnicodeStringToAnsiString(
1843 PANSI_STRING DestinationString,
1844 PCUNICODE_STRING SourceString,
1845 BOOLEAN AllocateDestinationString
1846 );
1847
1848 //
1849 // Unicode->OEM String Functions
1850 //
1851 NTSYSAPI
1852 NTSTATUS
1853 NTAPI
1854 RtlUpcaseUnicodeStringToOemString(
1855 POEM_STRING DestinationString,
1856 PCUNICODE_STRING SourceString,
1857 BOOLEAN AllocateDestinationString
1858 );
1859
1860 _IRQL_requires_max_(PASSIVE_LEVEL)
1861 _Must_inspect_result_
1862 //_At_(DestinationString->Buffer, _Post_bytecount_(DestinationString->Length))
1863 NTSYSAPI
1864 NTSTATUS
1865 NTAPI
1866 RtlUpcaseUnicodeStringToCountedOemString(
1867 _When_(AllocateDestinationString, _Out_ _At_(DestinationString->Buffer, __drv_allocatesMem(Mem)))
1868 _When_(!AllocateDestinationString, _Inout_)
1869 POEM_STRING DestinationString,
1870 _In_ PCUNICODE_STRING SourceString,
1871 _In_ BOOLEAN AllocateDestinationString
1872 );
1873
1874 NTSYSAPI
1875 NTSTATUS
1876 NTAPI
1877 RtlUnicodeStringToOemString(
1878 POEM_STRING DestinationString,
1879 PCUNICODE_STRING SourceString,
1880 BOOLEAN AllocateDestinationString
1881 );
1882
1883 NTSYSAPI
1884 NTSTATUS
1885 NTAPI
1886 RtlUpcaseUnicodeToOemN(
1887 PCHAR OemString,
1888 ULONG OemSize,
1889 PULONG ResultSize,
1890 PCWCH UnicodeString,
1891 ULONG UnicodeSize
1892 );
1893
1894 NTSYSAPI
1895 ULONG
1896 NTAPI
1897 RtlxUnicodeStringToOemSize(IN PCUNICODE_STRING UnicodeString);
1898
1899 #ifdef NTOS_MODE_USER
1900
1901 #define RtlUnicodeStringToOemSize(STRING) ( \
1902 NLS_MB_OEM_CODE_PAGE_TAG ? \
1903 RtlxUnicodeStringToOemSize(STRING) : \
1904 ((STRING)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
1905 )
1906
1907 #define RtlUnicodeStringToCountedOemSize(STRING) ( \
1908 (ULONG)(RtlUnicodeStringToOemSize(STRING) - sizeof(ANSI_NULL)) \
1909 )
1910
1911 #endif
1912
1913 NTSYSAPI
1914 NTSTATUS
1915 NTAPI
1916 RtlUnicodeToOemN(
1917 PCHAR OemString,
1918 ULONG OemSize,
1919 PULONG ResultSize,
1920 PCWCH UnicodeString,
1921 ULONG UnicodeSize
1922 );
1923
1924 //
1925 // Unicode->MultiByte String Functions
1926 //
1927 NTSYSAPI
1928 NTSTATUS
1929 NTAPI
1930 RtlUnicodeToMultiByteN(
1931 PCHAR MbString,
1932 ULONG MbSize,
1933 PULONG ResultSize,
1934 PCWCH UnicodeString,
1935 ULONG UnicodeSize
1936 );
1937
1938 NTSYSAPI
1939 NTSTATUS
1940 NTAPI
1941 RtlUpcaseUnicodeToMultiByteN(
1942 PCHAR MbString,
1943 ULONG MbSize,
1944 PULONG ResultSize,
1945 PCWCH UnicodeString,
1946 ULONG UnicodeSize
1947 );
1948
1949 NTSYSAPI
1950 NTSTATUS
1951 NTAPI
1952 RtlUnicodeToMultiByteSize(
1953 PULONG MbSize,
1954 PCWCH UnicodeString,
1955 ULONG UnicodeSize
1956 );
1957
1958 NTSYSAPI
1959 ULONG
1960 NTAPI
1961 RtlxOemStringToUnicodeSize(IN PCOEM_STRING OemString);
1962
1963 //
1964 // OEM to Unicode Functions
1965 //
1966 NTSYSAPI
1967 NTSTATUS
1968 NTAPI
1969 RtlOemStringToUnicodeString(
1970 PUNICODE_STRING DestinationString,
1971 PCOEM_STRING SourceString,
1972 BOOLEAN AllocateDestinationString
1973 );
1974
1975 _IRQL_requires_max_(PASSIVE_LEVEL)
1976 NTSYSAPI
1977 NTSTATUS
1978 NTAPI
1979 RtlOemToUnicodeN(
1980 _Out_writes_bytes_to_(MaxBytesInUnicodeString, *BytesInUnicodeString) PWCH UnicodeString,
1981 _In_ ULONG MaxBytesInUnicodeString,
1982 _Out_opt_ PULONG BytesInUnicodeString,
1983 _In_reads_bytes_(BytesInOemString) PCCH OemString,
1984 _In_ ULONG BytesInOemString
1985 );
1986
1987 #ifdef NTOS_MODE_USER
1988
1989 #define RtlOemStringToUnicodeSize(STRING) ( \
1990 NLS_MB_OEM_CODE_PAGE_TAG ? \
1991 RtlxOemStringToUnicodeSize(STRING) : \
1992 ((STRING)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
1993 )
1994
1995 #define RtlOemStringToCountedUnicodeSize(STRING) ( \
1996 (ULONG)(RtlOemStringToUnicodeSize(STRING) - sizeof(UNICODE_NULL)) \
1997 )
1998
1999 #endif
2000
2001 //
2002 // Ansi->Unicode String Functions
2003 //
2004 _IRQL_requires_max_(APC_LEVEL)
2005 NTSYSAPI
2006 WCHAR
2007 NTAPI
2008 RtlAnsiCharToUnicodeChar(
2009 _Inout_ PUCHAR *SourceCharacter);
2010
2011 NTSYSAPI
2012 NTSTATUS
2013 NTAPI
2014 RtlAnsiStringToUnicodeString(
2015 PUNICODE_STRING DestinationString,
2016 PCANSI_STRING SourceString,
2017 BOOLEAN AllocateDestinationString
2018 );
2019
2020 NTSYSAPI
2021 ULONG
2022 NTAPI
2023 RtlxAnsiStringToUnicodeSize(
2024 PCANSI_STRING AnsiString
2025 );
2026
2027 #ifdef NTOS_MODE_USER
2028
2029 #define RtlAnsiStringToUnicodeSize(STRING) ( \
2030 NLS_MB_CODE_PAGE_TAG ? \
2031 RtlxAnsiStringToUnicodeSize(STRING) : \
2032 ((STRING)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
2033 )
2034
2035 #endif
2036
2037 NTSYSAPI
2038 BOOLEAN
2039 NTAPI
2040 RtlCreateUnicodeStringFromAsciiz(
2041 _Out_ PUNICODE_STRING Destination,
2042 _In_ PCSZ Source
2043 );
2044
2045 //
2046 // Unicode String Functions
2047 //
2048 NTSYSAPI
2049 NTSTATUS
2050 NTAPI
2051 RtlAppendUnicodeToString(
2052 PUNICODE_STRING Destination,
2053 PCWSTR Source
2054 );
2055
2056 NTSYSAPI
2057 NTSTATUS
2058 NTAPI
2059 RtlAppendUnicodeStringToString(
2060 PUNICODE_STRING Destination,
2061 PCUNICODE_STRING Source
2062 );
2063
2064 NTSYSAPI
2065 LONG
2066 NTAPI
2067 RtlCompareUnicodeString(
2068 PCUNICODE_STRING String1,
2069 PCUNICODE_STRING String2,
2070 BOOLEAN CaseInsensitive
2071 );
2072
2073 NTSYSAPI
2074 VOID
2075 NTAPI
2076 RtlCopyUnicodeString(
2077 PUNICODE_STRING DestinationString,
2078 PCUNICODE_STRING SourceString
2079 );
2080
2081 NTSYSAPI
2082 BOOLEAN
2083 NTAPI
2084 RtlCreateUnicodeString(
2085 PUNICODE_STRING DestinationString,
2086 PCWSTR SourceString
2087 );
2088
2089 #ifdef NTOS_MODE_USER
2090
2091 NTSYSAPI
2092 NTSTATUS
2093 NTAPI
2094 RtlDowncaseUnicodeString(
2095 _Inout_ PUNICODE_STRING UniDest,
2096 _In_ PCUNICODE_STRING UniSource,
2097 _In_ BOOLEAN AllocateDestinationString
2098 );
2099
2100 NTSYSAPI
2101 NTSTATUS
2102 NTAPI
2103 RtlDuplicateUnicodeString(
2104 _In_ ULONG Flags,
2105 _In_ PCUNICODE_STRING SourceString,
2106 _Out_ PUNICODE_STRING DestinationString
2107 );
2108
2109 //
2110 // Memory Functions
2111 //
2112 NTSYSAPI
2113 VOID
2114 NTAPI
2115 RtlFillMemoryUlong(
2116 _In_ PVOID Destination,
2117 _In_ SIZE_T Length,
2118 _In_ ULONG Fill
2119 );
2120
2121 NTSYSAPI
2122 VOID
2123 NTAPI
2124 RtlFillMemoryUlonglong(
2125 _Out_ PVOID Destination,
2126 _In_ SIZE_T Length,
2127 _In_ ULONGLONG Pattern
2128 );
2129
2130 NTSYSAPI
2131 NTSTATUS
2132 NTAPI
2133 RtlCopyMappedMemory(
2134 _Out_writes_bytes_all_(Size) PVOID Destination,
2135 _In_reads_bytes_(Size) const VOID *Source,
2136 _In_ SIZE_T Size
2137 );
2138
2139 NTSYSAPI
2140 SIZE_T
2141 NTAPI
2142 RtlCompareMemoryUlong(
2143 _In_ PVOID Source,
2144 _In_ SIZE_T Length,
2145 _In_ ULONG Pattern
2146 );
2147
2148 #ifndef RtlEqualMemory
2149 #define RtlEqualMemory(Destination, Source, Length) \
2150 (!memcmp(Destination, Source, Length))
2151 #endif
2152
2153 #define RtlCopyBytes RtlCopyMemory
2154 #define RtlFillBytes RtlFillMemory
2155 #define RtlZeroBytes RtlZeroMemory
2156
2157 #endif
2158
2159 NTSYSAPI
2160 BOOLEAN
2161 NTAPI
2162 RtlEqualUnicodeString(
2163 PCUNICODE_STRING String1,
2164 PCUNICODE_STRING String2,
2165 BOOLEAN CaseInsensitive
2166 );
2167
2168 NTSYSAPI
2169 NTSTATUS
2170 NTAPI
2171 RtlFindCharInUnicodeString(
2172 _In_ ULONG Flags,
2173 _In_ PCUNICODE_STRING SearchString,
2174 _In_ PCUNICODE_STRING MatchString,
2175 _Out_ PUSHORT Position
2176 );
2177
2178 _IRQL_requires_max_(PASSIVE_LEVEL)
2179 NTSYSAPI
2180 VOID
2181 NTAPI
2182 RtlFreeUnicodeString(
2183 _Inout_ _At_(UnicodeString->Buffer, __drv_freesMem(Mem))
2184 PUNICODE_STRING UnicodeString
2185 );
2186
2187 NTSYSAPI
2188 VOID
2189 NTAPI
2190 RtlEraseUnicodeString(
2191 _Inout_ PUNICODE_STRING String
2192 );
2193
2194 NTSYSAPI
2195 NTSTATUS
2196 NTAPI
2197 RtlHashUnicodeString(
2198 _In_ CONST UNICODE_STRING *String,
2199 _In_ BOOLEAN CaseInSensitive,
2200 _In_ ULONG HashAlgorithm,
2201 _Out_ PULONG HashValue
2202 );
2203
2204 _IRQL_requires_max_(DISPATCH_LEVEL)
2205 _At_(DestinationString->Buffer, _Post_equal_to_(SourceString))
2206 _When_(SourceString != NULL,
2207 _At_(DestinationString->Length, _Post_equal_to_(_String_length_(SourceString)))
2208 _At_(DestinationString->MaximumLength, _Post_equal_to_(DestinationString->Length + sizeof(CHAR))))
2209 _When_(SourceString == NULL,
2210 _At_(DestinationString->Length, _Post_equal_to_(0))
2211 _At_(DestinationString->MaximumLength, _Post_equal_to_(0)))
2212 NTSYSAPI
2213 VOID
2214 NTAPI
2215 RtlInitString(
2216 _Out_ PSTRING DestinationString,
2217 _In_opt_z_ __drv_aliasesMem PCSTR SourceString
2218 );
2219
2220 _IRQL_requires_max_(DISPATCH_LEVEL)
2221 _At_(DestinationString->Buffer, _Post_equal_to_(SourceString))
2222 _When_(SourceString != NULL,
2223 _At_(DestinationString->Length, _Post_equal_to_(_String_length_(SourceString) * sizeof(WCHAR)))
2224 _At_(DestinationString->MaximumLength, _Post_equal_to_(DestinationString->Length + sizeof(WCHAR))))
2225 _When_(SourceString == NULL,
2226 _At_(DestinationString->Length, _Post_equal_to_(0))
2227 _At_(DestinationString->MaximumLength, _Post_equal_to_(0)))
2228 NTSYSAPI
2229 VOID
2230 NTAPI
2231 RtlInitUnicodeString(
2232 _Out_ PUNICODE_STRING DestinationString,
2233 _In_opt_z_ __drv_aliasesMem PCWSTR SourceString
2234 );
2235
2236 _IRQL_requires_max_(DISPATCH_LEVEL)
2237 NTSYSAPI
2238 NTSTATUS
2239 NTAPI
2240 RtlInitUnicodeStringEx(
2241 _Out_ PUNICODE_STRING DestinationString,
2242 _In_opt_z_ __drv_aliasesMem PCWSTR SourceString
2243 );
2244
2245 NTSYSAPI
2246 BOOLEAN
2247 NTAPI
2248 RtlIsTextUnicode(
2249 _In_ CONST VOID* Buffer,
2250 _In_ INT Size,
2251 _Inout_opt_ INT* Flags
2252 );
2253
2254 _IRQL_requires_max_(PASSIVE_LEVEL)
2255 _Must_inspect_result_
2256 NTSYSAPI
2257 BOOLEAN
2258 NTAPI
2259 RtlPrefixString(
2260 _In_ const STRING *String1,
2261 _In_ const STRING *String2,
2262 _In_ BOOLEAN CaseInsensitive
2263 );
2264
2265 _IRQL_requires_max_(PASSIVE_LEVEL)
2266 _Must_inspect_result_
2267 NTSYSAPI
2268 BOOLEAN
2269 NTAPI
2270 RtlPrefixUnicodeString(
2271 _In_ PCUNICODE_STRING String1,
2272 _In_ PCUNICODE_STRING String2,
2273 _In_ BOOLEAN CaseInsensitive
2274 );
2275
2276 _IRQL_requires_max_(PASSIVE_LEVEL)
2277 NTSYSAPI
2278 VOID
2279 NTAPI
2280 RtlUpperString(
2281 _Inout_ PSTRING DestinationString,
2282 _In_ const STRING *SourceString
2283 );
2284
2285 _IRQL_requires_max_(PASSIVE_LEVEL)
2286 _Must_inspect_result_
2287 NTSYSAPI
2288 LONG
2289 NTAPI
2290 RtlCompareString(
2291 _In_ const STRING *String1,
2292 _In_ const STRING *String2,
2293 _In_ BOOLEAN CaseInSensitive
2294 );
2295
2296 NTSYSAPI
2297 VOID
2298 NTAPI
2299 RtlCopyString(
2300 _Out_ PSTRING DestinationString,
2301 _In_opt_ const STRING *SourceString
2302 );
2303
2304 _IRQL_requires_max_(PASSIVE_LEVEL)
2305 _Must_inspect_result_
2306 NTSYSAPI
2307 BOOLEAN
2308 NTAPI
2309 RtlEqualString(
2310 _In_ const STRING *String1,
2311 _In_ const STRING *String2,
2312 _In_ BOOLEAN CaseInSensitive
2313 );
2314
2315 _IRQL_requires_max_(APC_LEVEL)
2316 NTSYSAPI
2317 NTSTATUS
2318 NTAPI
2319 RtlAppendStringToString(
2320 _Inout_ PSTRING Destination,
2321 _In_ const STRING *Source
2322 );
2323
2324 _IRQL_requires_max_(PASSIVE_LEVEL)
2325 _When_(AllocateDestinationString, _Must_inspect_result_)
2326 NTSYSAPI
2327 NTSTATUS
2328 NTAPI
2329 RtlUpcaseUnicodeString(
2330 _When_(AllocateDestinationString, _Out_ _At_(DestinationString->Buffer, __drv_allocatesMem(Mem)))
2331 _When_(!AllocateDestinationString, _Inout_)
2332 PUNICODE_STRING DestinationString,
2333 _In_ PCUNICODE_STRING SourceString,
2334 _In_ BOOLEAN AllocateDestinationString
2335 );
2336
2337 _IRQL_requires_max_(PASSIVE_LEVEL)
2338 NTSYSAPI
2339 NTSTATUS
2340 NTAPI
2341 RtlUnicodeStringToInteger(
2342 _In_ PCUNICODE_STRING String,
2343 _In_opt_ ULONG Base,
2344 _Out_ PULONG Value
2345 );
2346
2347 NTSYSAPI
2348 NTSTATUS
2349 NTAPI
2350 RtlValidateUnicodeString(
2351 _In_ ULONG Flags,
2352 _In_ PCUNICODE_STRING String
2353 );
2354
2355 #define RTL_SKIP_BUFFER_COPY 0x00000001
2356
2357 NTSYSAPI
2358 NTSTATUS
2359 NTAPI
2360 RtlpEnsureBufferSize(
2361 _In_ ULONG Flags,
2362 _Inout_ PRTL_BUFFER Buffer,
2363 _In_ SIZE_T RequiredSize
2364 );
2365
2366 #ifdef NTOS_MODE_USER
2367
2368 FORCEINLINE
2369 VOID
2370 RtlInitBuffer(
2371 _Inout_ PRTL_BUFFER Buffer,
2372 _In_ PUCHAR Data,
2373 _In_ ULONG DataSize
2374 )
2375 {
2376 Buffer->Buffer = Buffer->StaticBuffer = Data;
2377 Buffer->Size = Buffer->StaticSize = DataSize;
2378 Buffer->ReservedForAllocatedSize = 0;
2379 Buffer->ReservedForIMalloc = NULL;
2380 }
2381
2382 FORCEINLINE
2383 NTSTATUS
2384 RtlEnsureBufferSize(
2385 _In_ ULONG Flags,
2386 _Inout_ PRTL_BUFFER Buffer,
2387 _In_ ULONG RequiredSize
2388 )
2389 {
2390 if (Buffer && RequiredSize <= Buffer->Size)
2391 return STATUS_SUCCESS;
2392 return RtlpEnsureBufferSize(Flags, Buffer, RequiredSize);
2393 }
2394
2395 FORCEINLINE
2396 VOID
2397 RtlFreeBuffer(
2398 _Inout_ PRTL_BUFFER Buffer
2399 )
2400 {
2401 if (Buffer->Buffer != Buffer->StaticBuffer && Buffer->Buffer)
2402 RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer->Buffer);
2403 Buffer->Buffer = Buffer->StaticBuffer;
2404 Buffer->Size = Buffer->StaticSize;
2405 }
2406
2407 #endif /* NTOS_MODE_USER */
2408
2409 //
2410 // Ansi String Functions
2411 //
2412 _IRQL_requires_max_(PASSIVE_LEVEL)
2413 NTSYSAPI
2414 VOID
2415 NTAPI
2416 RtlFreeAnsiString(
2417 _Inout_ _At_(AnsiString->Buffer, __drv_freesMem(Mem))
2418 PANSI_STRING AnsiString
2419 );
2420
2421 _IRQL_requires_max_(DISPATCH_LEVEL)
2422 NTSYSAPI
2423 VOID
2424 NTAPI
2425 RtlInitAnsiString(
2426 _Out_ PANSI_STRING DestinationString,
2427 _In_opt_z_ __drv_aliasesMem PCSZ SourceString
2428 );
2429
2430 _IRQL_requires_max_(DISPATCH_LEVEL)
2431 NTSYSAPI
2432 NTSTATUS
2433 NTAPI
2434 RtlInitAnsiStringEx(
2435 _Out_ PANSI_STRING DestinationString,
2436 _In_opt_z_ __drv_aliasesMem PCSZ SourceString
2437 );
2438
2439 //
2440 // OEM String Functions
2441 //
2442 _IRQL_requires_max_(PASSIVE_LEVEL)
2443 NTSYSAPI
2444 VOID
2445 NTAPI
2446 RtlFreeOemString(
2447 _Inout_ _At_(OemString->Buffer, __drv_freesMem(Mem))
2448 POEM_STRING OemString
2449 );
2450
2451 //
2452 // MultiByte->Unicode String Functions
2453 //
2454 _IRQL_requires_max_(PASSIVE_LEVEL)
2455 NTSYSAPI
2456 NTSTATUS
2457 NTAPI
2458 RtlMultiByteToUnicodeN(
2459 _Out_writes_bytes_to_(MaxBytesInUnicodeString, *BytesInUnicodeString) PWCH UnicodeString,
2460 _In_ ULONG MaxBytesInUnicodeString,
2461 _Out_opt_ PULONG BytesInUnicodeString,
2462 _In_reads_bytes_(BytesInMultiByteString) const CHAR *MultiByteString,
2463 _In_ ULONG BytesInMultiByteString
2464 );
2465
2466 _IRQL_requires_max_(PASSIVE_LEVEL)
2467 NTSYSAPI
2468 NTSTATUS
2469 NTAPI
2470 RtlMultiByteToUnicodeSize(
2471 _Out_ PULONG BytesInUnicodeString,
2472 _In_reads_bytes_(BytesInMultiByteString) const CHAR *MultiByteString,
2473 _In_ ULONG BytesInMultiByteString
2474 );
2475
2476 //
2477 // Atom Functions
2478 //
2479 NTSYSAPI
2480 NTSTATUS
2481 NTAPI
2482 RtlAddAtomToAtomTable(
2483 _In_ PRTL_ATOM_TABLE AtomTable,
2484 _In_ PWSTR AtomName,
2485 _Out_ PRTL_ATOM Atom
2486 );
2487
2488 NTSYSAPI
2489 NTSTATUS
2490 NTAPI
2491 RtlCreateAtomTable(
2492 _In_ ULONG TableSize,
2493 _Inout_ PRTL_ATOM_TABLE *AtomTable
2494 );
2495
2496 NTSYSAPI
2497 NTSTATUS
2498 NTAPI
2499 RtlDeleteAtomFromAtomTable(
2500 _In_ PRTL_ATOM_TABLE AtomTable,
2501 _In_ RTL_ATOM Atom
2502 );
2503
2504 NTSYSAPI
2505 NTSTATUS
2506 NTAPI
2507 RtlDestroyAtomTable(IN PRTL_ATOM_TABLE AtomTable);
2508
2509 NTSYSAPI
2510 NTSTATUS
2511 NTAPI
2512 RtlQueryAtomInAtomTable(
2513 _In_ PRTL_ATOM_TABLE AtomTable,
2514 _In_ RTL_ATOM Atom,
2515 _Out_opt_ PULONG RefCount,
2516 _Out_opt_ PULONG PinCount,
2517 _Out_opt_z_bytecap_(*NameLength) PWSTR AtomName,
2518 _Inout_opt_ PULONG NameLength
2519 );
2520
2521 NTSYSAPI
2522 NTSTATUS
2523 NTAPI
2524 RtlPinAtomInAtomTable(
2525 _In_ PRTL_ATOM_TABLE AtomTable,
2526 _In_ RTL_ATOM Atom
2527 );
2528
2529 NTSYSAPI
2530 NTSTATUS
2531 NTAPI
2532 RtlLookupAtomInAtomTable(
2533 _In_ PRTL_ATOM_TABLE AtomTable,
2534 _In_ PWSTR AtomName,
2535 _Out_ PRTL_ATOM Atom
2536 );
2537
2538 //
2539 // Process Management Functions
2540 //
2541 NTSYSAPI
2542 PPEB
2543 NTAPI
2544 RtlGetCurrentPeb(
2545 VOID
2546 );
2547
2548 NTSYSAPI
2549 VOID
2550 NTAPI
2551 RtlAcquirePebLock(VOID);
2552
2553 NTSYSAPI
2554 NTSTATUS
2555 NTAPI
2556 RtlCreateProcessParameters (
2557 _Out_ PRTL_USER_PROCESS_PARAMETERS *ProcessParameters,
2558 _In_ PUNICODE_STRING ImagePathName,
2559 _In_opt_ PUNICODE_STRING DllPath,
2560 _In_opt_ PUNICODE_STRING CurrentDirectory,
2561 _In_opt_ PUNICODE_STRING CommandLine,
2562 _In_opt_ PWSTR Environment,
2563 _In_opt_ PUNICODE_STRING WindowTitle,
2564 _In_opt_ PUNICODE_STRING DesktopInfo,
2565 _In_opt_ PUNICODE_STRING ShellInfo,
2566 _In_opt_ PUNICODE_STRING RuntimeInfo
2567 );
2568
2569 NTSYSAPI
2570 NTSTATUS
2571 NTAPI
2572 RtlCreateUserProcess(
2573 _In_ PUNICODE_STRING ImageFileName,
2574 _In_ ULONG Attributes,
2575 _In_ PRTL_USER_PROCESS_PARAMETERS ProcessParameters,
2576 _In_opt_ PSECURITY_DESCRIPTOR ProcessSecutityDescriptor,
2577 _In_opt_ PSECURITY_DESCRIPTOR ThreadSecurityDescriptor,
2578 _In_opt_ HANDLE ParentProcess,
2579 _In_ BOOLEAN CurrentDirectory,
2580 _In_opt_ HANDLE DebugPort,
2581 _In_opt_ HANDLE ExceptionPort,
2582 _Out_ PRTL_USER_PROCESS_INFORMATION ProcessInfo
2583 );
2584
2585 #if (NTDDI_VERSION >= NTDDI_WIN7)
2586 NTSYSAPI
2587 NTSTATUS
2588 NTAPI
2589 RtlCreateUserThread(
2590 _In_ PVOID ThreadContext,
2591 _Out_ HANDLE *OutThreadHandle,
2592 _Reserved_ PVOID Reserved1,
2593 _Reserved_ PVOID Reserved2,
2594 _Reserved_ PVOID Reserved3,
2595 _Reserved_ PVOID Reserved4,
2596 _Reserved_ PVOID Reserved5,
2597 _Reserved_ PVOID Reserved6,
2598 _Reserved_ PVOID Reserved7,
2599 _Reserved_ PVOID Reserved8
2600 );
2601 #else
2602 NTSYSAPI
2603 NTSTATUS
2604 NTAPI
2605 RtlCreateUserThread(
2606 _In_ HANDLE ProcessHandle,
2607 _In_opt_ PSECURITY_DESCRIPTOR SecurityDescriptor,
2608 _In_ BOOLEAN CreateSuspended,
2609 _In_ ULONG StackZeroBits,
2610 _In_ SIZE_T StackReserve,
2611 _In_ SIZE_T StackCommit,
2612 _In_ PTHREAD_START_ROUTINE StartAddress,
2613 _In_ PVOID Parameter,
2614 _Out_opt_ PHANDLE ThreadHandle,
2615 _Out_opt_ PCLIENT_ID ClientId
2616 );
2617 #endif
2618
2619 NTSYSAPI
2620 PRTL_USER_PROCESS_PARAMETERS
2621 NTAPI
2622 RtlDeNormalizeProcessParams(
2623 _In_ PRTL_USER_PROCESS_PARAMETERS ProcessParameters);
2624
2625 NTSYSAPI
2626 NTSTATUS
2627 NTAPI
2628 RtlDestroyProcessParameters(
2629 _In_ PRTL_USER_PROCESS_PARAMETERS ProcessParameters);
2630
2631 NTSYSAPI
2632 VOID
2633 NTAPI
2634 RtlExitUserThread(
2635 _In_ NTSTATUS Status);
2636
2637 NTSYSAPI
2638 VOID
2639 NTAPI
2640 RtlInitializeContext(
2641 _In_ HANDLE ProcessHandle,
2642 _Out_ PCONTEXT ThreadContext,
2643 _In_opt_ PVOID ThreadStartParam,
2644 _In_ PTHREAD_START_ROUTINE ThreadStartAddress,
2645 _In_ PINITIAL_TEB InitialTeb
2646 );
2647
2648 #ifdef _M_AMD64
2649 typedef struct _WOW64_CONTEXT *PWOW64_CONTEXT;
2650
2651 NTSYSAPI
2652 NTSTATUS
2653 NTAPI
2654 RtlWow64GetThreadContext(
2655 _In_ HANDLE ThreadHandle,
2656 _Inout_ PWOW64_CONTEXT ThreadContext
2657 );
2658
2659
2660 NTSYSAPI
2661 NTSTATUS
2662 NTAPI
2663 RtlWow64SetThreadContext(
2664 _In_ HANDLE ThreadHandle,
2665 _In_ PWOW64_CONTEXT ThreadContext
2666 );
2667 #endif
2668
2669 NTSYSAPI
2670 BOOLEAN
2671 NTAPI
2672 RtlIsThreadWithinLoaderCallout(VOID);
2673
2674 NTSYSAPI
2675 PRTL_USER_PROCESS_PARAMETERS
2676 NTAPI
2677 RtlNormalizeProcessParams(
2678 _In_ PRTL_USER_PROCESS_PARAMETERS ProcessParameters);
2679
2680 NTSYSAPI
2681 VOID
2682 NTAPI
2683 RtlReleasePebLock(VOID);
2684
2685 NTSYSAPI
2686 NTSTATUS
2687 NTAPI
2688 RtlRemoteCall(
2689 _In_ HANDLE Process,
2690 _In_ HANDLE Thread,
2691 _In_ PVOID CallSite,
2692 _In_ ULONG ArgumentCount,
2693 _In_ PULONG Arguments,
2694 _In_ BOOLEAN PassContext,
2695 _In_ BOOLEAN AlreadySuspended
2696 );
2697
2698 NTSYSAPI
2699 NTSTATUS
2700 __cdecl
2701 RtlSetProcessIsCritical(
2702 _In_ BOOLEAN NewValue,
2703 _Out_opt_ PBOOLEAN OldValue,
2704 _In_ BOOLEAN NeedBreaks
2705 );
2706
2707 NTSYSAPI
2708 NTSTATUS
2709 __cdecl
2710 RtlSetThreadIsCritical(
2711 _In_ BOOLEAN NewValue,
2712 _Out_opt_ PBOOLEAN OldValue,
2713 _In_ BOOLEAN NeedBreaks
2714 );
2715
2716 NTSYSAPI
2717 ULONG
2718 NTAPI
2719 RtlGetCurrentProcessorNumber(
2720 VOID
2721 );
2722
2723
2724 //
2725 // Thread Pool Functions
2726 //
2727 //
2728 NTSTATUS
2729 NTAPI
2730 RtlSetThreadPoolStartFunc(
2731 _In_ PRTL_START_POOL_THREAD StartPoolThread,
2732 _In_ PRTL_EXIT_POOL_THREAD ExitPoolThread
2733 );
2734
2735 NTSYSAPI
2736 NTSTATUS
2737 NTAPI
2738 RtlDeregisterWaitEx(
2739 _In_ HANDLE hWaitHandle,
2740 _In_opt_ HANDLE hCompletionEvent
2741 );
2742
2743 NTSYSAPI
2744 NTSTATUS
2745 NTAPI
2746 RtlDeregisterWait(
2747 _In_ HANDLE hWaitHandle
2748 );
2749
2750 NTSYSAPI
2751 NTSTATUS
2752 NTAPI
2753 RtlQueueWorkItem(
2754 _In_ WORKERCALLBACKFUNC Function,
2755 _In_opt_ PVOID Context,
2756 _In_ ULONG Flags
2757 );
2758
2759 NTSYSAPI
2760 NTSTATUS
2761 NTAPI
2762 RtlSetIoCompletionCallback(
2763 _In_ HANDLE FileHandle,
2764 _In_ PIO_APC_ROUTINE Callback,
2765 _In_ ULONG Flags
2766 );
2767
2768 NTSYSAPI
2769 NTSTATUS
2770 NTAPI
2771 RtlRegisterWait(
2772 _In_ PHANDLE phNewWaitObject,
2773 _In_ HANDLE hObject,
2774 _In_ WAITORTIMERCALLBACKFUNC Callback,
2775 _In_ PVOID pvContext,
2776 _In_ ULONG ulMilliseconds,
2777 _In_ ULONG ulFlags
2778 );
2779
2780 //
2781 // Environment/Path Functions
2782 //
2783 NTSYSAPI
2784 NTSTATUS
2785 NTAPI
2786 RtlCreateEnvironment(
2787 _In_ BOOLEAN Inherit,
2788 _Out_ PWSTR *Environment
2789 );
2790
2791 NTSYSAPI
2792 NTSTATUS
2793 NTAPI
2794 RtlComputePrivatizedDllName_U(
2795 _In_ PUNICODE_STRING DllName,
2796 _Inout_ PUNICODE_STRING RealName,
2797 _Inout_ PUNICODE_STRING LocalName
2798 );
2799
2800 NTSYSAPI
2801 VOID
2802 NTAPI
2803 RtlDestroyEnvironment(
2804 _In_ PWSTR Environment
2805 );
2806
2807 NTSYSAPI
2808 BOOLEAN
2809 NTAPI
2810 RtlDoesFileExists_U(
2811 _In_ PCWSTR FileName
2812 );
2813
2814 NTSYSAPI
2815 RTL_PATH_TYPE
2816 NTAPI
2817 RtlDetermineDosPathNameType_U(
2818 _In_ PCWSTR Path
2819 );
2820
2821 NTSYSAPI
2822 ULONG
2823 NTAPI
2824 RtlDosSearchPath_U(
2825 _In_ PCWSTR Path,
2826 _In_ PCWSTR FileName,
2827 _In_ PCWSTR Extension,
2828 _In_ ULONG BufferSize,
2829 _Out_ PWSTR Buffer,
2830 _Out_ PWSTR *PartName
2831 );
2832
2833 NTSYSAPI
2834 NTSTATUS
2835 NTAPI
2836 RtlDosSearchPath_Ustr(
2837 _In_ ULONG Flags,
2838 _In_ PUNICODE_STRING PathString,
2839 _In_ PUNICODE_STRING FileNameString,
2840 _In_ PUNICODE_STRING ExtensionString,
2841 _In_ PUNICODE_STRING CallerBuffer,
2842 _Inout_opt_ PUNICODE_STRING DynamicString,
2843 _Out_opt_ PUNICODE_STRING* FullNameOut,
2844 _Out_opt_ PSIZE_T FilePartSize,
2845 _Out_opt_ PSIZE_T LengthNeeded
2846 );
2847
2848 NTSYSAPI
2849 BOOLEAN
2850 NTAPI
2851 RtlDosPathNameToNtPathName_U(
2852 _In_opt_z_ PCWSTR DosPathName,
2853 _Out_ PUNICODE_STRING NtPathName,
2854 _Out_opt_ PCWSTR *NtFileNamePart,
2855 _Out_opt_ PRTL_RELATIVE_NAME_U DirectoryInfo
2856 );
2857
2858
2859 #define RTL_UNCHANGED_UNK_PATH 1
2860 #define RTL_CONVERTED_UNC_PATH 2
2861 #define RTL_CONVERTED_NT_PATH 3
2862 #define RTL_UNCHANGED_DOS_PATH 4
2863
2864 NTSYSAPI
2865 NTSTATUS
2866 NTAPI
2867 RtlNtPathNameToDosPathName(
2868 _In_ ULONG Flags,
2869 _Inout_ PRTL_UNICODE_STRING_BUFFER Path,
2870 _Out_opt_ PULONG PathType,
2871 _Out_opt_ PULONG Unknown
2872 );
2873
2874
2875 NTSYSAPI
2876 BOOLEAN
2877 NTAPI
2878 RtlDosPathNameToRelativeNtPathName_U(
2879 _In_ PCWSTR DosName,
2880 _Out_ PUNICODE_STRING NtName,
2881 _Out_ PCWSTR *PartName,
2882 _Out_ PRTL_RELATIVE_NAME_U RelativeName
2883 );
2884
2885 _At_(Destination->Buffer, _Out_bytecap_(Destination->MaximumLength))
2886 NTSYSAPI
2887 NTSTATUS
2888 NTAPI
2889 RtlExpandEnvironmentStrings_U(
2890 _In_z_ PWSTR Environment,
2891 _In_ PUNICODE_STRING Source,
2892 _Inout_ PUNICODE_STRING Destination,
2893 _Out_ PULONG Length
2894 );
2895
2896 NTSYSAPI
2897 ULONG
2898 NTAPI
2899 RtlGetCurrentDirectory_U(
2900 _In_ ULONG MaximumLength,
2901 _Out_bytecap_(MaximumLength) PWSTR Buffer
2902 );
2903
2904 NTSYSAPI
2905 ULONG
2906 NTAPI
2907 RtlGetFullPathName_U(
2908 _In_ PCWSTR FileName,
2909 _In_ ULONG Size,
2910 _Out_z_bytecap_(Size) PWSTR Buffer,
2911 _Out_opt_ PWSTR *ShortName
2912 );
2913
2914 #if (NTDDI_VERSION >= NTDDI_WIN7)
2915 NTSYSAPI
2916 NTSTATUS
2917 NTAPI
2918 RtlGetFullPathName_UEx(
2919 _In_ PWSTR FileName,
2920 _In_ ULONG BufferLength,
2921 _Out_ PWSTR Buffer,
2922 _Out_opt_ PWSTR *FilePart,
2923 _Out_opt_ RTL_PATH_TYPE *InputPathType
2924 );
2925 #endif
2926
2927 NTSTATUS
2928 NTAPI
2929 RtlGetFullPathName_UstrEx(
2930 _In_ PUNICODE_STRING FileName,
2931 _In_opt_ PUNICODE_STRING StaticString,
2932 _In_opt_ PUNICODE_STRING DynamicString,
2933 _Out_opt_ PUNICODE_STRING *StringUsed,
2934 _Out_opt_ PSIZE_T FilePartSize,
2935 _Out_opt_ PBOOLEAN NameInvalid,
2936 _Out_ RTL_PATH_TYPE* PathType,
2937 _Out_opt_ PSIZE_T LengthNeeded
2938 );
2939
2940 NTSYSAPI
2941 NTSTATUS
2942 NTAPI
2943 RtlGetLengthWithoutTrailingPathSeperators(
2944 _Reserved_ ULONG Flags,
2945 _In_ PCUNICODE_STRING PathString,
2946 _Out_ PULONG Length
2947 );
2948
2949 NTSYSAPI
2950 ULONG
2951 NTAPI
2952 RtlGetLongestNtPathLength(
2953 VOID
2954 );
2955
2956 NTSYSAPI
2957 ULONG
2958 NTAPI
2959 RtlIsDosDeviceName_U(
2960 _In_ PCWSTR Name
2961 );
2962
2963 NTSYSAPI
2964 ULONG
2965 NTAPI
2966 RtlIsDosDeviceName_Ustr(
2967 _In_ PCUNICODE_STRING Name
2968 );
2969
2970 _IRQL_requires_max_(PASSIVE_LEVEL)
2971 _Must_inspect_result_
2972 NTSYSAPI
2973 BOOLEAN
2974 NTAPI
2975 RtlIsNameLegalDOS8Dot3(
2976 _In_ PCUNICODE_STRING Name,
2977 _Inout_opt_ POEM_STRING OemName,
2978 _Out_opt_ PBOOLEAN NameContainsSpaces
2979 );
2980
2981 NTSYSAPI
2982 NTSTATUS
2983 NTAPI
2984 RtlQueryEnvironmentVariable_U(
2985 _In_opt_ PWSTR Environment,
2986 _In_ PCUNICODE_STRING Name,
2987 _Out_ PUNICODE_STRING Value
2988 );
2989
2990 VOID
2991 NTAPI
2992 RtlReleaseRelativeName(
2993 _In_ PRTL_RELATIVE_NAME_U RelativeName
2994 );
2995
2996 NTSYSAPI
2997 NTSTATUS
2998 NTAPI
2999 RtlSetCurrentDirectory_U(
3000 _In_ PUNICODE_STRING name
3001 );
3002
3003 NTSYSAPI
3004 NTSTATUS
3005 NTAPI
3006 RtlSetEnvironmentVariable(
3007 _In_z_ PWSTR *Environment,
3008 _In_ PUNICODE_STRING Name,
3009 _In_ PUNICODE_STRING Value
3010 );
3011
3012 //
3013 // Critical Section/Resource Functions
3014 //
3015 NTSYSAPI
3016 NTSTATUS
3017 NTAPI
3018 RtlDeleteCriticalSection (
3019 _In_ PRTL_CRITICAL_SECTION CriticalSection
3020 );
3021
3022 NTSYSAPI
3023 NTSTATUS
3024 NTAPI
3025 RtlEnterCriticalSection(
3026 _In_ PRTL_CRITICAL_SECTION CriticalSection
3027 );
3028
3029 NTSYSAPI
3030 NTSTATUS
3031 NTAPI
3032 RtlInitializeCriticalSection(
3033 _In_ PRTL_CRITICAL_SECTION CriticalSection
3034 );
3035
3036 NTSYSAPI
3037 NTSTATUS
3038 NTAPI
3039 RtlInitializeCriticalSectionAndSpinCount(
3040 _In_ PRTL_CRITICAL_SECTION CriticalSection,
3041 _In_ ULONG SpinCount
3042 );
3043
3044 NTSYSAPI
3045 ULONG
3046 NTAPI
3047 RtlIsCriticalSectionLocked(
3048 _In_ PRTL_CRITICAL_SECTION CriticalSection
3049 );
3050
3051 NTSYSAPI
3052 ULONG
3053 NTAPI
3054 RtlIsCriticalSectionLockedByThread(
3055 _In_ PRTL_CRITICAL_SECTION CriticalSection
3056 );
3057
3058 NTSYSAPI
3059 NTSTATUS
3060 NTAPI
3061 RtlLeaveCriticalSection(
3062 _In_ PRTL_CRITICAL_SECTION CriticalSection
3063 );
3064
3065 NTSYSAPI
3066 BOOLEAN
3067 NTAPI
3068 RtlTryEnterCriticalSection(
3069 _In_ PRTL_CRITICAL_SECTION CriticalSection
3070 );
3071
3072 NTSYSAPI
3073 VOID
3074 NTAPI
3075 RtlpUnWaitCriticalSection(
3076 _In_ PRTL_CRITICAL_SECTION CriticalSection
3077 );
3078
3079 NTSYSAPI
3080 NTSTATUS
3081 NTAPI
3082 RtlpWaitForCriticalSection(
3083 _In_ PRTL_CRITICAL_SECTION CriticalSection
3084 );
3085
3086 NTSYSAPI
3087 BOOLEAN
3088 NTAPI
3089 RtlAcquireResourceExclusive(
3090 _In_ PRTL_RESOURCE Resource,
3091 _In_ BOOLEAN Wait
3092 );
3093
3094 NTSYSAPI
3095 BOOLEAN
3096 NTAPI
3097 RtlAcquireResourceShared(
3098 _In_ PRTL_RESOURCE Resource,
3099 _In_ BOOLEAN Wait
3100 );
3101
3102 NTSYSAPI
3103 VOID
3104 NTAPI
3105 RtlConvertExclusiveToShared(
3106 _In_ PRTL_RESOURCE Resource
3107 );
3108
3109 NTSYSAPI
3110 VOID
3111 NTAPI
3112 RtlConvertSharedToExclusive(
3113 _In_ PRTL_RESOURCE Resource
3114 );
3115
3116 NTSYSAPI
3117 VOID
3118 NTAPI
3119 RtlDeleteResource(
3120 _In_ PRTL_RESOURCE Resource
3121 );
3122
3123 NTSYSAPI
3124 VOID
3125 NTAPI
3126 RtlDumpResource(
3127 _In_ PRTL_RESOURCE Resource
3128 );
3129
3130 NTSYSAPI
3131 VOID
3132 NTAPI
3133 RtlInitializeResource(
3134 _In_ PRTL_RESOURCE Resource
3135 );
3136
3137 NTSYSAPI
3138 VOID
3139 NTAPI
3140 RtlReleaseResource(
3141 _In_ PRTL_RESOURCE Resource
3142 );
3143
3144 //
3145 // Compression Functions
3146 //
3147 NTSYSAPI //NT_RTL_COMPRESS_API
3148 NTSTATUS
3149 NTAPI
3150 RtlCompressBuffer(
3151 _In_ USHORT CompressionFormatAndEngine,
3152 _In_reads_bytes_(UncompressedBufferSize) PUCHAR UncompressedBuffer,
3153 _In_ ULONG UncompressedBufferSize,
3154 _Out_writes_bytes_to_(CompressedBufferSize, *FinalCompressedSize) PUCHAR CompressedBuffer,
3155 _In_ ULONG CompressedBufferSize,
3156 _In_ ULONG UncompressedChunkSize,
3157 _Out_ PULONG FinalCompressedSize,
3158 _In_ PVOID WorkSpace
3159 );
3160
3161 _IRQL_requires_max_(APC_LEVEL)
3162 NTSYSAPI //NT_RTL_COMPRESS_API
3163 NTSTATUS
3164 NTAPI
3165 RtlDecompressBuffer(
3166 _In_ USHORT CompressionFormat,
3167 _Out_writes_bytes_to_(UncompressedBufferSize, *FinalUncompressedSize) PUCHAR UncompressedBuffer,
3168 _In_ ULONG UncompressedBufferSize,
3169 _In_reads_bytes_(CompressedBufferSize) PUCHAR CompressedBuffer,
3170 _In_ ULONG CompressedBufferSize,
3171 _Out_ PULONG FinalUncompressedSize
3172 );
3173
3174 NTSYSAPI
3175 NTSTATUS
3176 NTAPI
3177 RtlGetCompressionWorkSpaceSize(
3178 _In_ USHORT CompressionFormatAndEngine,
3179 _Out_ PULONG CompressBufferWorkSpaceSize,
3180 _Out_ PULONG CompressFragmentWorkSpaceSize
3181 );
3182
3183 //
3184 // Frame Functions
3185 //
3186 NTSYSAPI
3187 VOID
3188 NTAPI
3189 RtlPopFrame(
3190 _In_ PTEB_ACTIVE_FRAME Frame
3191 );
3192
3193 NTSYSAPI
3194 VOID
3195 NTAPI
3196 RtlPushFrame(
3197 _In_ PTEB_ACTIVE_FRAME Frame
3198 );
3199
3200 NTSYSAPI
3201 PTEB_ACTIVE_FRAME
3202 NTAPI
3203 RtlGetFrame(
3204 VOID
3205 );
3206
3207 //
3208 // Debug Info Functions
3209 //
3210 NTSYSAPI
3211 PRTL_DEBUG_INFORMATION
3212 NTAPI
3213 RtlCreateQueryDebugBuffer(
3214 _In_ ULONG Size,
3215 _In_ BOOLEAN EventPair
3216 );
3217
3218 NTSYSAPI
3219 NTSTATUS
3220 NTAPI
3221 RtlDestroyQueryDebugBuffer(IN PRTL_DEBUG_INFORMATION DebugBuffer);
3222
3223 NTSYSAPI
3224 NTSTATUS
3225 NTAPI
3226 RtlQueryProcessDebugInformation(
3227 _In_ ULONG ProcessId,
3228 _In_ ULONG DebugInfoClassMask,
3229 _Inout_ PRTL_DEBUG_INFORMATION DebugBuffer
3230 );
3231
3232 //
3233 // Bitmap Functions
3234 //
3235 #ifdef NTOS_MODE_USER
3236
3237 NTSYSAPI
3238 BOOLEAN
3239 NTAPI
3240 RtlAreBitsClear(
3241 _In_ PRTL_BITMAP BitMapHeader,
3242 _In_ ULONG StartingIndex,
3243 _In_ ULONG Length
3244 );
3245
3246 NTSYSAPI
3247 BOOLEAN
3248 NTAPI
3249 RtlAreBitsSet(
3250 _In_ PRTL_BITMAP BitMapHeader,
3251 _In_ ULONG StartingIndex,
3252 _In_ ULONG Length
3253 );
3254
3255 NTSYSAPI
3256 VOID
3257 NTAPI
3258 RtlClearAllBits(
3259 _In_ PRTL_BITMAP BitMapHeader
3260 );
3261
3262 NTSYSAPI
3263 VOID
3264 NTAPI
3265 RtlClearBit(
3266 _In_ PRTL_BITMAP BitMapHeader,
3267 _In_range_(<, BitMapHeader->SizeOfBitMap) ULONG BitNumber
3268 );
3269
3270 NTSYSAPI
3271 VOID
3272 NTAPI
3273 RtlClearBits(
3274 _In_ PRTL_BITMAP BitMapHeader,
3275 _In_range_(0, BitMapHeader->SizeOfBitMap - NumberToClear) ULONG StartingIndex,
3276 _In_range_(0, BitMapHeader->SizeOfBitMap - StartingIndex) ULONG NumberToClear
3277 );
3278
3279 NTSYSAPI
3280 ULONG
3281 NTAPI
3282 RtlFindClearBits(
3283 _In_ PRTL_BITMAP BitMapHeader,
3284 _In_ ULONG NumberToFind,
3285 _In_ ULONG HintIndex
3286 );
3287
3288 NTSYSAPI
3289 ULONG
3290 NTAPI
3291 RtlFindClearBitsAndSet(
3292 _In_ PRTL_BITMAP BitMapHeader,
3293 _In_ ULONG NumberToFind,
3294 _In_ ULONG HintIndex
3295 );
3296
3297 NTSYSAPI
3298 ULONG
3299 NTAPI
3300 RtlFindFirstRunClear(
3301 _In_ PRTL_BITMAP BitMapHeader,
3302 _Out_ PULONG StartingIndex
3303 );
3304
3305 NTSYSAPI
3306 ULONG
3307 NTAPI
3308 RtlFindClearRuns(
3309 _In_ PRTL_BITMAP BitMapHeader,
3310 _Out_writes_to_(SizeOfRunArray, return) PRTL_BITMAP_RUN RunArray,
3311 _In_range_(>, 0) ULONG SizeOfRunArray,
3312 _In_ BOOLEAN LocateLongestRuns
3313 );
3314
3315 NTSYSAPI
3316 ULONG
3317 NTAPI
3318 RtlFindLastBackwardRunClear(
3319 _In_ PRTL_BITMAP BitMapHeader,
3320 _In_ ULONG FromIndex,
3321 _Out_ PULONG StartingRunIndex
3322 );
3323
3324 NTSYSAPI
3325 CCHAR
3326 NTAPI
3327 RtlFindLeastSignificantBit(
3328 _In_ ULONGLONG Value
3329 );
3330
3331 NTSYSAPI
3332 ULONG
3333 NTAPI
3334 RtlFindLongestRunClear(
3335 _In_ PRTL_BITMAP BitMapHeader,
3336 _Out_ PULONG StartingIndex
3337 );
3338
3339 NTSYSAPI
3340 CCHAR
3341 NTAPI
3342 RtlFindMostSignificantBit(
3343 _In_ ULONGLONG Value
3344 );
3345
3346 NTSYSAPI
3347 ULONG
3348 NTAPI
3349 RtlFindNextForwardRunClear(
3350 _In_ PRTL_BITMAP BitMapHeader,
3351 _In_ ULONG FromIndex,
3352 _Out_ PULONG StartingRunIndex
3353 );
3354
3355 NTSYSAPI
3356 ULONG
3357 NTAPI
3358 RtlFindNextForwardRunSet(
3359 _In_ PRTL_BITMAP BitMapHeader,
3360 _In_ ULONG FromIndex,
3361 _Out_ PULONG StartingRunIndex
3362 );
3363
3364 NTSYSAPI
3365 ULONG
3366 NTAPI
3367 RtlFindSetBits(
3368 _In_ PRTL_BITMAP BitMapHeader,
3369 _In_ ULONG NumberToFind,
3370 _In_ ULONG HintIndex
3371 );
3372
3373 NTSYSAPI
3374 ULONG
3375 NTAPI
3376 RtlFindSetBitsAndClear(
3377 _In_ PRTL_BITMAP BitMapHeader,
3378 _In_ ULONG NumberToFind,
3379 _In_ ULONG HintIndex
3380 );
3381
3382 #ifdef __REACTOS__ // ReactOS improvement
3383 _At_(BitMapHeader->SizeOfBitMap, _Post_equal_to_(SizeOfBitMap))
3384 _At_(BitMapHeader->Buffer, _Post_equal_to_(BitMapBuffer))
3385 #endif
3386 NTSYSAPI
3387 VOID
3388 NTAPI
3389 RtlInitializeBitMap(
3390 _Out_ PRTL_BITMAP BitMapHeader,
3391 _In_opt_ __drv_aliasesMem PULONG BitMapBuffer,
3392 _In_opt_ ULONG SizeOfBitMap
3393 );
3394
3395 NTSYSAPI
3396 ULONG
3397 NTAPI
3398 RtlNumberOfClearBits(
3399 _In_ PRTL_BITMAP BitMapHeader
3400 );
3401
3402 NTSYSAPI
3403 ULONG
3404 NTAPI
3405 RtlNumberOfSetBits(
3406 _In_ PRTL_BITMAP BitMapHeader
3407 );
3408
3409 NTSYSAPI
3410 VOID
3411 NTAPI
3412 RtlSetBit(
3413 _In_ PRTL_BITMAP BitMapHeader,
3414 _In_range_(<, BitMapHeader->SizeOfBitMap) ULONG BitNumber
3415 );
3416
3417 NTSYSAPI
3418 VOID
3419 NTAPI
3420 RtlSetBits(
3421 _In_ PRTL_BITMAP BitMapHeader,
3422 _In_range_(0, BitMapHeader->SizeOfBitMap - NumberToSet) ULONG StartingIndex,
3423 _In_range_(0, BitMapHeader->SizeOfBitMap - StartingIndex) ULONG NumberToSet
3424 );
3425
3426 NTSYSAPI
3427 VOID
3428 NTAPI
3429 RtlSetAllBits(
3430 _In_ PRTL_BITMAP BitMapHeader
3431 );
3432
3433 _Must_inspect_result_
3434 NTSYSAPI
3435 BOOLEAN
3436 NTAPI
3437 RtlTestBit(
3438 _In_ PRTL_BITMAP BitMapHeader,
3439 _In_range_(<, BitMapHeader->SizeOfBitMap) ULONG BitNumber
3440 );
3441
3442 #if defined(_M_AMD64)
3443 _Must_inspect_result_
3444 FORCEINLINE
3445 BOOLEAN
3446 RtlCheckBit(
3447 _In_ PRTL_BITMAP BitMapHeader,
3448 _In_range_(<, BitMapHeader->SizeOfBitMap) ULONG BitPosition)
3449 {
3450 return BitTest64((LONG64 CONST*)BitMapHeader->Buffer, (LONG64)BitPosition);
3451 }
3452 #else
3453 #define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP)/32]) >> ((BP)%32)) & 0x1)
3454 #endif /* defined(_M_AMD64) */
3455
3456 #endif // NTOS_MODE_USER
3457
3458
3459 //
3460 // Timer Functions
3461 //
3462 NTSYSAPI
3463 NTSTATUS
3464 NTAPI
3465 RtlCreateTimer(
3466 _In_ HANDLE TimerQueue,
3467 _In_ PHANDLE phNewTimer,
3468 _In_ WAITORTIMERCALLBACKFUNC Callback,
3469 _In_ PVOID Parameter,
3470 _In_ ULONG DueTime,
3471 _In_ ULONG Period,
3472 _In_ ULONG Flags
3473 );
3474
3475 NTSYSAPI
3476 NTSTATUS
3477 NTAPI
3478 RtlCreateTimerQueue(PHANDLE TimerQueue);
3479
3480 NTSYSAPI
3481 NTSTATUS
3482 NTAPI
3483 RtlDeleteTimer(
3484 _In_ HANDLE TimerQueue,
3485 _In_ HANDLE Timer,
3486 _In_ HANDLE CompletionEvent
3487 );
3488
3489 NTSYSAPI
3490 NTSTATUS
3491 NTAPI
3492 RtlUpdateTimer(
3493 _In_ HANDLE TimerQueue,
3494 _In_ HANDLE Timer,
3495 _In_ ULONG DueTime,
3496 _In_ ULONG Period
3497 );
3498
3499 NTSYSAPI
3500 NTSTATUS
3501 NTAPI
3502 RtlDeleteTimerQueueEx(
3503 _In_ HANDLE TimerQueue,
3504 _In_opt_ HANDLE CompletionEvent
3505 );
3506
3507 NTSYSAPI
3508 NTSTATUS
3509 NTAPI
3510 RtlDeleteTimerQueue(HANDLE TimerQueue);
3511
3512 //
3513 // SList functions
3514 //
3515 PSLIST_ENTRY
3516 FASTCALL
3517 InterlockedPushListSList(
3518 _Inout_ PSLIST_HEADER ListHead,
3519 _Inout_ __drv_aliasesMem PSLIST_ENTRY List,
3520 _Inout_ PSLIST_ENTRY ListEnd,
3521 _In_ ULONG Count
3522 );
3523
3524 //
3525 // Range List functions
3526 //
3527 NTSYSAPI
3528 VOID
3529 NTAPI
3530 RtlInitializeRangeList(
3531 _Inout_ PRTL_RANGE_LIST RangeList
3532 );
3533
3534 NTSYSAPI
3535 VOID
3536 NTAPI
3537 RtlFreeRangeList(
3538 _In_ PRTL_RANGE_LIST RangeList
3539 );
3540
3541 NTSYSAPI
3542 NTSTATUS
3543 NTAPI
3544 RtlAddRange(
3545 _Inout_ PRTL_RANGE_LIST RangeList,
3546 _In_ ULONGLONG Start,
3547 _In_ ULONGLONG End,
3548 _In_ UCHAR Attributes,
3549 _In_ ULONG Flags,
3550 _In_opt_ PVOID UserData,
3551 _In_opt_ PVOID Owner
3552 );
3553
3554 //
3555 // Debug Functions
3556 //
3557 ULONG
3558 __cdecl
3559 DbgPrint(
3560 _In_z_ _Printf_format_string_ PCSTR Format,
3561 ...
3562 );
3563
3564 NTSYSAPI
3565 ULONG
3566 __cdecl
3567 DbgPrintEx(
3568 _In_ ULONG ComponentId,
3569 _In_ ULONG Level,
3570 _In_z_ _Printf_format_string_ PCSTR Format,
3571 ...
3572 );
3573
3574 NTSYSAPI
3575 ULONG
3576 NTAPI
3577 DbgPrompt(
3578 _In_z_ PCCH Prompt,
3579 _Out_writes_bytes_(MaximumResponseLength) PCH Response,
3580 _In_ ULONG MaximumResponseLength
3581 );
3582
3583 #undef DbgBreakPoint
3584 VOID
3585 NTAPI
3586 DbgBreakPoint(
3587 VOID
3588 );
3589
3590 VOID
3591 NTAPI
3592 DbgLoadImageSymbols(
3593 _In_ PSTRING Name,
3594 _In_ PVOID Base,
3595 _In_ ULONG_PTR ProcessId
3596 );
3597
3598 VOID
3599 NTAPI
3600 DbgUnLoadImageSymbols(
3601 _In_ PSTRING Name,
3602 _In_ PVOID Base,
3603 _In_ ULONG_PTR ProcessId
3604 );
3605
3606 VOID
3607 NTAPI
3608 DbgCommandString(
3609 _In_ PCCH Name,
3610 _In_ PCCH Command
3611 );
3612
3613 //
3614 // Generic Table Functions
3615 //
3616 #if defined(NTOS_MODE_USER) || defined(_NTIFS_)
3617 NTSYSAPI
3618 PVOID
3619 NTAPI
3620 RtlInsertElementGenericTable(
3621 _In_ PRTL_GENERIC_TABLE Table,
3622 _In_reads_bytes_(BufferSize) PVOID Buffer,
3623 _In_ CLONG BufferSize,
3624 _Out_opt_ PBOOLEAN NewElement
3625 );
3626
3627 NTSYSAPI
3628 PVOID
3629 NTAPI
3630 RtlInsertElementGenericTableFull(
3631 _In_ PRTL_GENERIC_TABLE Table,
3632 _In_reads_bytes_(BufferSize) PVOID Buffer,
3633 _In_ CLONG BufferSize,
3634 _Out_opt_ PBOOLEAN NewElement,
3635 _In_ PVOID NodeOrParent,
3636 _In_ TABLE_SEARCH_RESULT SearchResult
3637 );
3638
3639 NTSYSAPI
3640 BOOLEAN
3641 NTAPI
3642 RtlIsGenericTableEmpty(
3643 _In_ PRTL_GENERIC_TABLE Table
3644 );
3645
3646 NTSYSAPI
3647 PVOID
3648 NTAPI
3649 RtlLookupElementGenericTableFull(
3650 _In_ PRTL_GENERIC_TABLE Table,
3651 _In_ PVOID Buffer,
3652 _Out_ PVOID *NodeOrParent,
3653 _Out_ TABLE_SEARCH_RESULT *SearchResult
3654 );
3655 #endif
3656
3657 //
3658 // Handle Table Functions
3659 //
3660 NTSYSAPI
3661 PRTL_HANDLE_TABLE_ENTRY
3662 NTAPI
3663 RtlAllocateHandle(
3664 _In_ PRTL_HANDLE_TABLE HandleTable,
3665 _Inout_ PULONG Index
3666 );
3667
3668 NTSYSAPI
3669 VOID
3670 NTAPI
3671 RtlDestroyHandleTable(
3672 _Inout_ PRTL_HANDLE_TABLE HandleTable);
3673
3674 NTSYSAPI
3675 BOOLEAN
3676 NTAPI
3677 RtlFreeHandle(
3678 _In_ PRTL_HANDLE_TABLE HandleTable,
3679 _In_ PRTL_HANDLE_TABLE_ENTRY Handle
3680 );
3681
3682 NTSYSAPI
3683 VOID
3684 NTAPI
3685 RtlInitializeHandleTable(
3686 _In_ ULONG TableSize,
3687 _In_ ULONG HandleSize,
3688 _In_ PRTL_HANDLE_TABLE HandleTable
3689 );
3690
3691 NTSYSAPI
3692 BOOLEAN
3693 NTAPI
3694 RtlIsValidHandle(
3695 _In_ PRTL_HANDLE_TABLE HandleTable,
3696 _In_ PRTL_HANDLE_TABLE_ENTRY Handle
3697 );
3698
3699 _Success_(return!=FALSE)
3700 NTSYSAPI
3701 BOOLEAN
3702 NTAPI
3703 RtlIsValidIndexHandle(
3704 _In_ PRTL_HANDLE_TABLE HandleTable,
3705 _In_ ULONG Index,
3706 _Out_ PRTL_HANDLE_TABLE_ENTRY *Handle
3707 );
3708
3709 //
3710 // PE Functions
3711 //
3712 NTSYSAPI
3713 NTSTATUS
3714 NTAPI
3715 RtlFindMessage(
3716 _In_ PVOID BaseAddress,
3717 _In_ ULONG Type,
3718 _In_ ULONG Language,
3719 _In_ ULONG MessageId,
3720 _Out_ PMESSAGE_RESOURCE_ENTRY *MessageResourceEntry
3721 );
3722
3723 NTSYSAPI
3724 ULONG
3725 NTAPI
3726 RtlGetNtGlobalFlags(VOID);
3727
3728 _Success_(return!=NULL)
3729 NTSYSAPI
3730 PVOID
3731 NTAPI
3732 RtlImageDirectoryEntryToData(
3733 _In_ PVOID BaseAddress,
3734 _In_ BOOLEAN MappedAsImage,
3735 _In_ USHORT Directory,
3736 _Out_ PULONG Size
3737 );
3738
3739 NTSYSAPI
3740 PVOID
3741 NTAPI
3742 RtlImageRvaToVa(
3743 _In_ PIMAGE_NT_HEADERS NtHeader,
3744 _In_ PVOID BaseAddress,
3745 _In_ ULONG Rva,
3746 _Inout_opt_ PIMAGE_SECTION_HEADER *SectionHeader
3747 );
3748
3749 NTSYSAPI
3750 PIMAGE_NT_HEADERS
3751 NTAPI
3752 RtlImageNtHeader(
3753 _In_ PVOID BaseAddress);
3754
3755 NTSYSAPI
3756 NTSTATUS
3757 NTAPI
3758 RtlImageNtHeaderEx(
3759 _In_ ULONG Flags,
3760 _In_ PVOID BaseAddress,
3761 _In_ ULONGLONG Size,
3762 _Out_ PIMAGE_NT_HEADERS *NtHeader
3763 );
3764
3765 NTSYSAPI
3766 PIMAGE_SECTION_HEADER
3767 NTAPI
3768 RtlImageRvaToSection(
3769 _In_ PIMAGE_NT_HEADERS NtHeader,
3770 _In_ PVOID BaseAddress,
3771 _In_ ULONG Rva
3772 );
3773
3774 NTSYSAPI
3775 ULONG
3776 NTAPI
3777 LdrRelocateImageWithBias(
3778 _In_ PVOID NewAddress,
3779 _In_ LONGLONG AdditionalBias,
3780 _In_ PCCH LoaderName,
3781 _In_ ULONG Success,
3782 _In_ ULONG Conflict,
3783 _In_ ULONG Invalid
3784 );
3785
3786 //
3787 // Activation Context Functions
3788 //
3789 #ifdef NTOS_MODE_USER
3790 NTSYSAPI
3791 NTSTATUS
3792 NTAPI
3793 RtlActivateActivationContextEx(
3794 _In_ ULONG Flags,
3795 _In_ PTEB Teb,
3796 _In_ PVOID Context,
3797 _Out_ PULONG_PTR Cookie
3798 );
3799
3800 NTSYSAPI
3801 NTSTATUS
3802 NTAPI
3803 RtlActivateActivationContext(
3804 _In_ ULONG Flags,
3805 _In_ HANDLE Handle,
3806 _Out_ PULONG_PTR Cookie
3807 );
3808
3809 NTSYSAPI
3810 VOID
3811 NTAPI
3812 RtlAddRefActivationContext(
3813 _In_ PVOID Context
3814 );
3815
3816 NTSYSAPI
3817 PRTL_ACTIVATION_CONTEXT_STACK_FRAME
3818 FASTCALL
3819 RtlActivateActivationContextUnsafeFast(
3820 _In_ PRTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED Frame,
3821 _In_ PVOID Context
3822 );
3823
3824 NTSYSAPI
3825 NTSTATUS
3826 NTAPI
3827 RtlAllocateActivationContextStack(
3828 _In_ PACTIVATION_CONTEXT_STACK *Stack
3829 );
3830
3831 NTSYSAPI
3832 NTSTATUS
3833 NTAPI
3834 RtlCreateActivationContext(
3835 _In_ ULONG Flags,
3836 _In_ PACTIVATION_CONTEXT_DATA ActivationContextData,
3837 _In_ ULONG ExtraBytes,
3838 _In_ PVOID NotificationRoutine,
3839 _In_ PVOID NotificationContext,
3840 _Out_ PACTIVATION_CONTEXT *ActCtx
3841 );
3842
3843 NTSYSAPI
3844 NTSTATUS
3845 NTAPI
3846 RtlGetActiveActivationContext(
3847 _In_ PVOID *Context
3848 );
3849
3850 NTSYSAPI
3851 VOID
3852 NTAPI
3853 RtlReleaseActivationContext(
3854 _In_ HANDLE handle
3855 );
3856
3857 NTSYSAPI
3858 NTSTATUS
3859 NTAPI
3860 RtlDeactivateActivationContext(
3861 _In_ ULONG dwFlags,
3862 _In_ ULONG_PTR ulCookie
3863 );
3864
3865 NTSYSAPI
3866 VOID
3867 NTAPI
3868 RtlFreeActivationContextStack(
3869 _In_ PACTIVATION_CONTEXT_STACK Stack
3870 );
3871
3872 NTSYSAPI
3873 VOID
3874 NTAPI
3875 RtlFreeThreadActivationContextStack(VOID);
3876
3877 NTSYSAPI
3878 PRTL_ACTIVATION_CONTEXT_STACK_FRAME
3879 FASTCALL
3880 RtlDeactivateActivationContextUnsafeFast(
3881 _In_ PRTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED Frame
3882 );
3883
3884 NTSYSAPI
3885 NTSTATUS
3886 NTAPI
3887 RtlDosApplyFileIsolationRedirection_Ustr(
3888 _In_ ULONG Flags,
3889 _In_ PUNICODE_STRING OriginalName,
3890 _In_ PUNICODE_STRING Extension,
3891 _Inout_ PUNICODE_STRING StaticString,
3892 _Inout_ PUNICODE_STRING DynamicString,
3893 _Inout_ PUNICODE_STRING *NewName,
3894 _In_ PULONG NewFlags,
3895 _In_ PSIZE_T FileNameSize,
3896 _In_ PSIZE_T RequiredLength
3897 );
3898
3899 NTSYSAPI
3900 NTSTATUS
3901 NTAPI
3902 RtlFindActivationContextSectionString(
3903 _In_ ULONG dwFlags,
3904 _In_ const GUID *ExtensionGuid,
3905 _In_ ULONG SectionType,
3906 _In_ const UNICODE_STRING *SectionName,
3907 _Inout_ PVOID ReturnedData
3908 );
3909
3910 NTSYSAPI
3911 NTSTATUS
3912 NTAPI
3913 RtlQueryInformationActivationContext(
3914 _In_ DWORD dwFlags,
3915 _In_opt_ PVOID Context,
3916 _In_opt_ PVOID pvSubInstance,
3917 _In_ ULONG ulInfoClass,
3918 _Out_bytecap_(cbBuffer) PVOID pvBuffer,
3919 _In_opt_ SIZE_T cbBuffer,
3920 _Out_opt_ SIZE_T *pcbWrittenOrRequired
3921 );
3922
3923 NTSYSAPI
3924 NTSTATUS
3925 NTAPI
3926 RtlQueryInformationActiveActivationContext(
3927 _In_ ULONG ulInfoClass,
3928 _Out_bytecap_(cbBuffer) PVOID pvBuffer,
3929 _In_opt_ SIZE_T cbBuffer,
3930 _Out_opt_ SIZE_T *pcbWrittenOrRequired
3931 );
3932
3933 NTSYSAPI
3934 NTSTATUS
3935 NTAPI
3936 RtlZombifyActivationContext(
3937 PVOID Context
3938 );
3939
3940 //
3941 // WOW64 Functions
3942 //
3943 NTSYSAPI
3944 NTSTATUS
3945 NTAPI
3946 RtlWow64EnableFsRedirection(
3947 _In_ BOOLEAN Wow64FsEnableRedirection
3948 );
3949
3950 NTSYSAPI
3951 NTSTATUS
3952 NTAPI
3953 RtlWow64EnableFsRedirectionEx(
3954 _In_ PVOID Wow64FsEnableRedirection,
3955 _Out_ PVOID *OldFsRedirectionLevel
3956 );
3957
3958 #endif
3959
3960 //
3961 // Registry Functions
3962 //
3963 _IRQL_requires_max_(PASSIVE_LEVEL)
3964 _Must_inspect_result_
3965 NTSYSAPI
3966 NTSTATUS
3967 NTAPI
3968 RtlCheckRegistryKey(
3969 _In_ ULONG RelativeTo,
3970 _In_ PWSTR Path
3971 );
3972
3973 NTSYSAPI
3974 NTSTATUS
3975 NTAPI
3976 RtlCreateRegistryKey(
3977 _In_ ULONG RelativeTo,
3978 _In_ PWSTR Path
3979 );
3980
3981 NTSYSAPI
3982 NTSTATUS
3983 NTAPI
3984 RtlFormatCurrentUserKeyPath(
3985 _Out_ _At_(KeyPath->Buffer, __drv_allocatesMem(Mem) _Post_bytecap_(KeyPath->MaximumLength) _Post_bytecount_(KeyPath->Length))
3986 PUNICODE_STRING KeyPath
3987 );
3988
3989 NTSYSAPI
3990 NTSTATUS
3991 NTAPI
3992 RtlOpenCurrentUser(
3993 _In_ ACCESS_MASK DesiredAccess,
3994 _Out_ PHANDLE KeyHandle
3995 );
3996
3997 _IRQL_requires_max_(PASSIVE_LEVEL)
3998 NTSYSAPI
3999 NTSTATUS
4000 NTAPI
4001 RtlQueryRegistryValues(
4002 _In_ ULONG RelativeTo,
4003 _In_ PCWSTR Path,
4004 _Inout_ _At_(*(*QueryTable).EntryContext, _Pre_unknown_)
4005 PRTL_QUERY_REGISTRY_TABLE QueryTable,
4006 _In_opt_ PVOID Context,
4007 _In_opt_ PVOID Environment
4008 );
4009
4010 _IRQL_requires_max_(PASSIVE_LEVEL)
4011 NTSYSAPI
4012 NTSTATUS
4013 NTAPI
4014 RtlWriteRegistryValue(
4015 _In_ ULONG RelativeTo,
4016 _In_ PCWSTR Path,
4017 _In_z_ PCWSTR ValueName,
4018 _In_ ULONG ValueType,
4019 _In_reads_bytes_opt_(ValueLength) PVOID ValueData,
4020 _In_ ULONG ValueLength
4021 );
4022
4023 #ifdef NTOS_MODE_USER
4024 NTSYSAPI
4025 NTSTATUS
4026 NTAPI
4027 RtlpNtCreateKey(
4028 _Out_ HANDLE KeyHandle,
4029 _In_ ACCESS_MASK DesiredAccess,
4030 _In_ POBJECT_ATTRIBUTES ObjectAttributes,
4031 _In_ ULONG TitleIndex,
4032 _In_ PUNICODE_STRING Class,
4033 _Out_ PULONG Disposition
4034 );
4035
4036 NTSYSAPI
4037 NTSTATUS
4038 NTAPI
4039 RtlpNtEnumerateSubKey(
4040 _In_ HANDLE KeyHandle,
4041 _Inout_ PUNICODE_STRING SubKeyName,
4042 _In_ ULONG Index,
4043 _In_ ULONG Unused
4044 );
4045
4046 NTSYSAPI
4047 NTSTATUS
4048 NTAPI
4049 RtlpNtMakeTemporaryKey(
4050 _In_ HANDLE KeyHandle
4051 );
4052
4053 NTSYSAPI
4054 NTSTATUS
4055 NTAPI
4056 RtlpNtOpenKey(
4057 _Out_ HANDLE KeyHandle,
4058 _In_ ACCESS_MASK DesiredAccess,
4059 _In_ POBJECT_ATTRIBUTES ObjectAttributes,
4060 _In_ ULONG Unused
4061 );
4062
4063 NTSYSAPI
4064 NTSTATUS
4065 NTAPI
4066 RtlpNtQueryValueKey(
4067 _In_ HANDLE KeyHandle,
4068 _Out_opt_ PULONG Type,
4069 _Out_opt_ PVOID Data,
4070 _Inout_opt_ PULONG DataLength,
4071 _In_ ULONG Unused
4072 );
4073
4074 NTSYSAPI
4075 NTSTATUS
4076 NTAPI
4077 RtlpNtSetValueKey(
4078 _In_ HANDLE KeyHandle,
4079 _In_ ULONG Type,
4080 _In_ PVOID Data,
4081 _In_ ULONG DataLength
4082 );
4083 #endif
4084
4085 //
4086 // NLS Functions
4087 //
4088 NTSYSAPI
4089 VOID
4090 NTAPI
4091 RtlGetDefaultCodePage(
4092 _Out_ PUSHORT AnsiCodePage,
4093 _Out_ PUSHORT OemCodePage
4094 );
4095
4096 NTSYSAPI
4097 VOID
4098 NTAPI
4099 RtlInitNlsTables(
4100 _In_ PUSHORT AnsiTableBase,
4101 _In_ PUSHORT OemTableBase,
4102 _In_ PUSHORT CaseTableBase,
4103 _Out_ PNLSTABLEINFO NlsTable
4104 );
4105
4106 _IRQL_requires_max_(PASSIVE_LEVEL)
4107 NTSYSAPI
4108 VOID
4109 NTAPI
4110 RtlInitCodePageTable(
4111 _In_ PUSHORT TableBase,
4112 _Out_ PCPTABLEINFO CodePageTable
4113 );
4114
4115 NTSYSAPI
4116 VOID
4117 NTAPI
4118 RtlResetRtlTranslations(
4119 _In_ PNLSTABLEINFO NlsTable);
4120
4121 #if defined(NTOS_MODE_USER) && !defined(NO_RTL_INLINES)
4122
4123 //
4124 // Misc conversion functions
4125 //
4126 static __inline
4127 LARGE_INTEGER
4128 NTAPI_INLINE
4129 RtlConvertLongToLargeInteger(
4130 _In_ LONG SignedInteger