[PSDK]
[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 <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 // Error and Exception Functions
613 //
614 NTSYSAPI
615 PVOID
616 NTAPI
617 RtlAddVectoredExceptionHandler(
618 _In_ ULONG FirstHandler,
619 _In_ PVECTORED_EXCEPTION_HANDLER VectoredHandler
620 );
621
622 __analysis_noreturn
623 NTSYSAPI
624 VOID
625 NTAPI
626 RtlAssert(
627 _In_ PVOID FailedAssertion,
628 _In_ PVOID FileName,
629 _In_ ULONG LineNumber,
630 _In_opt_z_ PCHAR Message
631 );
632
633 NTSYSAPI
634 VOID
635 NTAPI
636 RtlSetUnhandledExceptionFilter(
637 _In_ PRTLP_UNHANDLED_EXCEPTION_FILTER TopLevelExceptionFilter
638 );
639
640 #endif /* NTOS_MODE_USER */
641
642 NTSYSAPI
643 VOID
644 NTAPI
645 RtlCaptureContext(
646 _Out_ PCONTEXT ContextRecord
647 );
648
649 NTSYSAPI
650 PVOID
651 NTAPI
652 RtlEncodePointer(
653 _In_ PVOID Pointer
654 );
655
656 NTSYSAPI
657 PVOID
658 NTAPI
659 RtlDecodePointer(
660 _In_ PVOID Pointer
661 );
662
663 NTSYSAPI
664 PVOID
665 NTAPI
666 RtlEncodeSystemPointer(
667 _In_ PVOID Pointer
668 );
669
670 NTSYSAPI
671 PVOID
672 NTAPI
673 RtlDecodeSystemPointer(
674 _In_ PVOID Pointer
675 );
676
677 NTSYSAPI
678 BOOLEAN
679 NTAPI
680 RtlDispatchException(
681 _In_ PEXCEPTION_RECORD ExceptionRecord,
682 _In_ PCONTEXT Context
683 );
684
685 _IRQL_requires_max_(APC_LEVEL)
686 _When_(Status < 0, _Out_range_(>, 0))
687 _When_(Status >= 0, _Out_range_(==, 0))
688 NTSYSAPI
689 ULONG
690 NTAPI
691 RtlNtStatusToDosError(
692 _In_ NTSTATUS Status
693 );
694
695 _When_(Status < 0, _Out_range_(>, 0))
696 _When_(Status >= 0, _Out_range_(==, 0))
697 NTSYSAPI
698 ULONG
699 NTAPI
700 RtlNtStatusToDosErrorNoTeb(
701 _In_ NTSTATUS Status
702 );
703
704 NTSYSAPI
705 VOID
706 NTAPI
707 RtlSetLastWin32ErrorAndNtStatusFromNtStatus(
708 _In_ NTSTATUS Status
709 );
710
711 NTSYSAPI
712 VOID
713 NTAPI
714 RtlRaiseException(
715 _In_ PEXCEPTION_RECORD ExceptionRecord
716 );
717
718 DECLSPEC_NORETURN
719 NTSYSAPI
720 VOID
721 NTAPI
722 RtlRaiseStatus(
723 _In_ NTSTATUS Status
724 );
725
726 NTSYSAPI
727 LONG
728 NTAPI
729 RtlUnhandledExceptionFilter(
730 _In_ struct _EXCEPTION_POINTERS* ExceptionInfo
731 );
732
733 NTSYSAPI
734 VOID
735 NTAPI
736 RtlUnwind(
737 _In_opt_ PVOID TargetFrame,
738 _In_opt_ PVOID TargetIp,
739 _In_opt_ PEXCEPTION_RECORD ExceptionRecord,
740 _In_ PVOID ReturnValue
741 );
742
743 #define RTL_STACK_WALKING_MODE_FRAMES_TO_SKIP_SHIFT 8
744
745 //
746 // Tracing Functions
747 //
748 NTSYSAPI
749 ULONG
750 NTAPI
751 RtlWalkFrameChain(
752 _Out_writes_(Count - (Flags >> RTL_STACK_WALKING_MODE_FRAMES_TO_SKIP_SHIFT)) PVOID *Callers,
753 _In_ ULONG Count,
754 _In_ ULONG Flags
755 );
756
757 NTSYSAPI
758 USHORT
759 NTAPI
760 RtlLogStackBackTrace(
761 VOID
762 );
763
764 #ifdef NTOS_MODE_USER
765 //
766 // Heap Functions
767 //
768 _Must_inspect_result_
769 _Ret_maybenull_
770 _Post_writable_byte_size_(Size)
771 NTSYSAPI
772 PVOID
773 NTAPI
774 RtlAllocateHeap(
775 _In_ PVOID HeapHandle,
776 _In_opt_ ULONG Flags,
777 _In_ SIZE_T Size
778 );
779
780 _Must_inspect_result_
781 NTSYSAPI
782 PVOID
783 NTAPI
784 RtlCreateHeap(
785 _In_ ULONG Flags,
786 _In_opt_ PVOID BaseAddress,
787 _In_opt_ SIZE_T SizeToReserve,
788 _In_opt_ SIZE_T SizeToCommit,
789 _In_opt_ PVOID Lock,
790 _In_opt_ PRTL_HEAP_PARAMETERS Parameters
791 );
792
793 NTSYSAPI
794 ULONG
795 NTAPI
796 RtlCreateTagHeap(
797 _In_ HANDLE HeapHandle,
798 _In_ ULONG Flags,
799 _In_ PWSTR TagName,
800 _In_ PWSTR TagSubName
801 );
802
803 ULONG
804 NTAPI
805 RtlCompactHeap(
806 _In_ HANDLE Heap,
807 _In_ ULONG Flags
808 );
809
810 _Must_inspect_result_
811 NTSYSAPI
812 PVOID
813 NTAPI
814 RtlDebugCreateHeap(
815 _In_ ULONG Flags,
816 _In_opt_ PVOID BaseAddress,
817 _In_opt_ SIZE_T SizeToReserve,
818 _In_opt_ SIZE_T SizeToCommit,
819 _In_opt_ PVOID Lock,
820 _In_opt_ PRTL_HEAP_PARAMETERS Parameters
821 );
822
823 NTSYSAPI
824 HANDLE
825 NTAPI
826 RtlDestroyHeap(
827 _In_ _Post_invalid_ HANDLE Heap
828 );
829
830 NTSYSAPI
831 ULONG
832 NTAPI
833 RtlExtendHeap(
834 _In_ HANDLE Heap,
835 _In_ ULONG Flags,
836 _In_ PVOID P,
837 _In_ SIZE_T Size
838 );
839
840 _Success_(return != 0)
841 NTSYSAPI
842 BOOLEAN
843 NTAPI
844 RtlFreeHeap(
845 _In_ HANDLE HeapHandle,
846 _In_opt_ ULONG Flags,
847 _In_ _Post_invalid_ PVOID P
848 );
849
850 ULONG
851 NTAPI
852 RtlGetProcessHeaps(
853 _In_ ULONG HeapCount,
854 _Out_cap_(HeapCount) HANDLE *HeapArray
855 );
856
857 _Success_(return != 0)
858 BOOLEAN
859 NTAPI
860 RtlGetUserInfoHeap(
861 _In_ PVOID HeapHandle,
862 _In_ ULONG Flags,
863 _In_ PVOID BaseAddress,
864 _Inout_opt_ PVOID *UserValue,
865 _Out_opt_ PULONG UserFlags
866 );
867
868 NTSYSAPI
869 PVOID
870 NTAPI
871 RtlProtectHeap(
872 _In_ PVOID HeapHandle,
873 _In_ BOOLEAN Protect
874 );
875
876 NTSYSAPI
877 NTSTATUS
878 NTAPI
879 RtlQueryHeapInformation(
880 _In_ PVOID HeapHandle,
881 _In_ HEAP_INFORMATION_CLASS HeapInformationClass,
882 _Out_ PVOID HeapInformation,
883 _In_ SIZE_T HeapInformationLength,
884 _When_(HeapInformationClass==HeapCompatibilityInformation, _On_failure_(_Out_opt_))
885 _Out_opt_ PSIZE_T ReturnLength
886 );
887
888 _Ret_opt_z_
889 NTSYSAPI
890 PWSTR
891 NTAPI
892 RtlQueryTagHeap(
893 _In_ PVOID HeapHandle,
894 _In_ ULONG Flags,
895 _In_ USHORT TagIndex,
896 _In_ BOOLEAN ResetCounters,
897 _Out_ PRTL_HEAP_TAG_INFO HeapTagInfo
898 );
899
900 _Must_inspect_result_
901 _Ret_maybenull_
902 _Post_writable_byte_size_(Size)
903 NTSYSAPI
904 PVOID
905 NTAPI
906 RtlReAllocateHeap(
907 _In_ HANDLE Heap,
908 _In_opt_ ULONG Flags,
909 _In_ _Post_invalid_ PVOID Ptr,
910 _In_ SIZE_T Size
911 );
912
913 NTSYSAPI
914 NTSTATUS
915 NTAPI
916 RtlSetHeapInformation(
917 _In_ PVOID HeapHandle,
918 _In_ HEAP_INFORMATION_CLASS HeapInformationClass,
919 _When_(HeapInformationClass==HeapCompatibilityInformation,_In_) PVOID HeapInformation,
920 _In_ SIZE_T HeapInformationLength
921 );
922
923 NTSYSAPI
924 BOOLEAN
925 NTAPI
926 RtlLockHeap(
927 _In_ HANDLE Heap
928 );
929
930 _Must_inspect_result_
931 NTSYSAPI
932 NTSTATUS
933 NTAPI
934 RtlMultipleAllocateHeap (
935 _In_ HANDLE HeapHandle,
936 _In_ ULONG Flags,
937 _In_ SIZE_T Size,
938 _In_ ULONG Count,
939 _Out_cap_(Count) _Deref_post_bytecap_(Size) PVOID * Array
940 );
941
942 NTSYSAPI
943 NTSTATUS
944 NTAPI
945 RtlMultipleFreeHeap (
946 _In_ HANDLE HeapHandle,
947 _In_ ULONG Flags,
948 _In_ ULONG Count,
949 _In_count_(Count) /* _Deref_ _Post_invalid_ */ PVOID * Array
950 );
951
952 NTSYSAPI
953 NTSTATUS
954 NTAPI
955 RtlUsageHeap(
956 _In_ HANDLE Heap,
957 _In_ ULONG Flags,
958 _Out_ PRTL_HEAP_USAGE Usage
959 );
960
961 NTSYSAPI
962 BOOLEAN
963 NTAPI
964 RtlUnlockHeap(
965 _In_ HANDLE Heap
966 );
967
968 BOOLEAN
969 NTAPI
970 RtlSetUserValueHeap(
971 _In_ PVOID HeapHandle,
972 _In_ ULONG Flags,
973 _In_ PVOID BaseAddress,
974 _In_ PVOID UserValue
975 );
976
977 BOOLEAN
978 NTAPI
979 RtlSetUserFlagsHeap(
980 _In_ PVOID HeapHandle,
981 _In_ ULONG Flags,
982 _In_ PVOID BaseAddress,
983 _In_ ULONG UserFlagsReset,
984 _In_ ULONG UserFlagsSet
985 );
986
987 NTSYSAPI
988 BOOLEAN
989 NTAPI
990 RtlValidateHeap(
991 _In_ HANDLE Heap,
992 _In_ ULONG Flags,
993 _In_opt_ PVOID P
994 );
995
996 NTSYSAPI
997 NTSTATUS
998 NTAPI
999 RtlWalkHeap(
1000 _In_ HANDLE HeapHandle,
1001 _In_ PVOID HeapEntry
1002 );
1003
1004 #define RtlGetProcessHeap() (NtCurrentPeb()->ProcessHeap)
1005
1006 #endif // NTOS_MODE_USER
1007
1008 NTSYSAPI
1009 SIZE_T
1010 NTAPI
1011 RtlSizeHeap(
1012 _In_ PVOID HeapHandle,
1013 _In_ ULONG Flags,
1014 _In_ PVOID MemoryPointer
1015 );
1016
1017
1018 //
1019 // Security Functions
1020 //
1021 _IRQL_requires_max_(APC_LEVEL)
1022 NTSYSAPI
1023 NTSTATUS
1024 NTAPI
1025 RtlAbsoluteToSelfRelativeSD(
1026 _In_ PSECURITY_DESCRIPTOR AbsoluteSecurityDescriptor,
1027 _Out_writes_bytes_to_opt_(*BufferLength, *BufferLength) PSECURITY_DESCRIPTOR SelfRelativeSecurityDescriptor,
1028 _Inout_ PULONG BufferLength
1029 );
1030
1031 _IRQL_requires_max_(APC_LEVEL)
1032 NTSYSAPI
1033 NTSTATUS
1034 NTAPI
1035 RtlAddAccessAllowedAce(
1036 _Inout_ PACL Acl,
1037 _In_ ULONG Revision,
1038 _In_ ACCESS_MASK AccessMask,
1039 _In_ PSID Sid
1040 );
1041
1042 _IRQL_requires_max_(APC_LEVEL)
1043 NTSYSAPI
1044 NTSTATUS
1045 NTAPI
1046 RtlAddAccessAllowedAceEx(
1047 _Inout_ PACL pAcl,
1048 _In_ ULONG dwAceRevision,
1049 _In_ ULONG AceFlags,
1050 _In_ ACCESS_MASK AccessMask,
1051 _In_ PSID pSid
1052 );
1053
1054 NTSYSAPI
1055 NTSTATUS
1056 NTAPI
1057 RtlAddAccessAllowedObjectAce(
1058 _Inout_ PACL pAcl,
1059 _In_ ULONG dwAceRevision,
1060 _In_ ULONG AceFlags,
1061 _In_ ACCESS_MASK AccessMask,
1062 _In_opt_ GUID *ObjectTypeGuid,
1063 _In_opt_ GUID *InheritedObjectTypeGuid,
1064 _In_ PSID pSid
1065 );
1066
1067 NTSYSAPI
1068 NTSTATUS
1069 NTAPI
1070 RtlAddAccessDeniedAce(
1071 _Inout_ PACL Acl,
1072 _In_ ULONG Revision,
1073 _In_ ACCESS_MASK AccessMask,
1074 _In_ PSID Sid
1075 );
1076
1077 NTSYSAPI
1078 NTSTATUS
1079 NTAPI
1080 RtlAddAccessDeniedAceEx(
1081 _Inout_ PACL Acl,
1082 _In_ ULONG Revision,
1083 _In_ ULONG Flags,
1084 _In_ ACCESS_MASK AccessMask,
1085 _In_ PSID Sid
1086 );
1087
1088 NTSYSAPI
1089 NTSTATUS
1090 NTAPI
1091 RtlAddAccessDeniedObjectAce(
1092 _Inout_ PACL pAcl,
1093 _In_ ULONG dwAceRevision,
1094 _In_ ULONG AceFlags,
1095 _In_ ACCESS_MASK AccessMask,
1096 _In_opt_ GUID *ObjectTypeGuid,
1097 _In_opt_ GUID *InheritedObjectTypeGuid,
1098 _In_ PSID pSid
1099 );
1100
1101 NTSYSAPI
1102 NTSTATUS
1103 NTAPI
1104 RtlAddAce(
1105 _Inout_ PACL Acl,
1106 _In_ ULONG AceRevision,
1107 _In_ ULONG StartingAceIndex,
1108 _In_reads_bytes_(AceListLength) PVOID AceList,
1109 _In_ ULONG AceListLength
1110 );
1111
1112 NTSYSAPI
1113 NTSTATUS
1114 NTAPI
1115 RtlAddAuditAccessAce(
1116 _Inout_ PACL Acl,
1117 _In_ ULONG Revision,
1118 _In_ ACCESS_MASK AccessMask,
1119 _In_ PSID Sid,
1120 _In_ BOOLEAN Success,
1121 _In_ BOOLEAN Failure
1122 );
1123
1124 NTSYSAPI
1125 NTSTATUS
1126 NTAPI
1127 RtlAcquirePrivilege(
1128 _In_ PULONG Privilege,
1129 _In_ ULONG NumPriv,
1130 _In_ ULONG Flags,
1131 _Out_ PVOID *ReturnedState
1132 );
1133
1134 NTSYSAPI
1135 NTSTATUS
1136 NTAPI
1137 RtlAddAuditAccessAceEx(
1138 _Inout_ PACL Acl,
1139 _In_ ULONG Revision,
1140 _In_ ULONG Flags,
1141 _In_ ACCESS_MASK AccessMask,
1142 _In_ PSID Sid,
1143 _In_ BOOLEAN Success,
1144 _In_ BOOLEAN Failure
1145 );
1146
1147 NTSYSAPI
1148 NTSTATUS
1149 NTAPI
1150 RtlAddAuditAccessObjectAce(
1151 _Inout_ PACL Acl,
1152 _In_ ULONG Revision,
1153 _In_ ULONG Flags,
1154 _In_ ACCESS_MASK AccessMask,
1155 _In_opt_ GUID *ObjectTypeGuid,
1156 _In_opt_ GUID *InheritedObjectTypeGuid,
1157 _In_ PSID Sid,
1158 _In_ BOOLEAN Success,
1159 _In_ BOOLEAN Failure
1160 );
1161
1162 NTSYSAPI
1163 NTSTATUS
1164 NTAPI
1165 RtlAddMandatoryAce(
1166 _Inout_ PACL Acl,
1167 _In_ ULONG Revision,
1168 _In_ ULONG Flags,
1169 _In_ ULONG MandatoryFlags,
1170 _In_ UCHAR AceType,
1171 _In_ PSID LabelSid);
1172
1173 NTSYSAPI
1174 NTSTATUS
1175 NTAPI
1176 RtlAdjustPrivilege(
1177 _In_ ULONG Privilege,
1178 _In_ BOOLEAN NewValue,
1179 _In_ BOOLEAN ForThread,
1180 _Out_ PBOOLEAN OldValue
1181 );
1182
1183 _Must_inspect_result_
1184 NTSYSAPI
1185 NTSTATUS
1186 NTAPI
1187 RtlAllocateAndInitializeSid(
1188 _In_ PSID_IDENTIFIER_AUTHORITY IdentifierAuthority,
1189 _In_ UCHAR SubAuthorityCount,
1190 _In_ ULONG SubAuthority0,
1191 _In_ ULONG SubAuthority1,
1192 _In_ ULONG SubAuthority2,
1193 _In_ ULONG SubAuthority3,
1194 _In_ ULONG SubAuthority4,
1195 _In_ ULONG SubAuthority5,
1196 _In_ ULONG SubAuthority6,
1197 _In_ ULONG SubAuthority7,
1198 _Outptr_ PSID *Sid
1199 );
1200
1201 NTSYSAPI
1202 BOOLEAN
1203 NTAPI
1204 RtlAreAllAccessesGranted(
1205 ACCESS_MASK GrantedAccess,
1206 ACCESS_MASK DesiredAccess
1207 );
1208
1209 NTSYSAPI
1210 BOOLEAN
1211 NTAPI
1212 RtlAreAnyAccessesGranted(
1213 ACCESS_MASK GrantedAccess,
1214 ACCESS_MASK DesiredAccess
1215 );
1216
1217 _IRQL_requires_max_(APC_LEVEL)
1218 NTSYSAPI
1219 VOID
1220 NTAPI
1221 RtlCopyLuid (
1222 _Out_ PLUID DestinationLuid,
1223 _In_ PLUID SourceLuid
1224 );
1225
1226 NTSYSAPI
1227 VOID
1228 NTAPI
1229 RtlCopyLuidAndAttributesArray(
1230 ULONG Count,
1231 PLUID_AND_ATTRIBUTES Src,
1232 PLUID_AND_ATTRIBUTES Dest
1233 );
1234
1235 NTSYSAPI
1236 NTSTATUS
1237 NTAPI
1238 RtlCopySidAndAttributesArray(
1239 ULONG Count,
1240 PSID_AND_ATTRIBUTES Src,
1241 ULONG SidAreaSize,
1242 PSID_AND_ATTRIBUTES Dest,
1243 PVOID SidArea,
1244 PVOID* RemainingSidArea,
1245 PULONG RemainingSidAreaSize
1246 );
1247
1248 _IRQL_requires_max_(APC_LEVEL)
1249 NTSYSAPI
1250 NTSTATUS
1251 NTAPI
1252 RtlConvertSidToUnicodeString(
1253 _Inout_ PUNICODE_STRING UnicodeString,
1254 _In_ PSID Sid,
1255 _In_ BOOLEAN AllocateDestinationString
1256 );
1257
1258 _IRQL_requires_max_(APC_LEVEL)
1259 NTSYSAPI
1260 NTSTATUS
1261 NTAPI
1262 RtlCopySid(
1263 _In_ ULONG DestinationSidLength,
1264 _Out_writes_bytes_(DestinationSidLength) PSID DestinationSid,
1265 _In_ PSID SourceSid
1266 );
1267
1268 NTSYSAPI
1269 NTSTATUS
1270 NTAPI
1271 RtlCreateAcl(
1272 PACL Acl,
1273 ULONG AclSize,
1274 ULONG AclRevision
1275 );
1276
1277 NTSYSAPI
1278 NTSTATUS
1279 NTAPI
1280 RtlCreateSecurityDescriptor(
1281 _Out_ PSECURITY_DESCRIPTOR SecurityDescriptor,
1282 _In_ ULONG Revision
1283 );
1284
1285 NTSYSAPI
1286 NTSTATUS
1287 NTAPI
1288 RtlCreateSecurityDescriptorRelative(
1289 _Out_ PISECURITY_DESCRIPTOR_RELATIVE SecurityDescriptor,
1290 _In_ ULONG Revision
1291 );
1292
1293 NTSYSAPI
1294 NTSTATUS
1295 NTAPI
1296 RtlCopySecurityDescriptor(
1297 _In_ PSECURITY_DESCRIPTOR pSourceSecurityDescriptor,
1298 _Out_ PSECURITY_DESCRIPTOR *pDestinationSecurityDescriptor
1299 );
1300
1301 NTSYSAPI
1302 NTSTATUS
1303 NTAPI
1304 RtlDeleteAce(
1305 PACL Acl,
1306 ULONG AceIndex
1307 );
1308
1309 NTSYSAPI
1310 BOOLEAN
1311 NTAPI
1312 RtlEqualPrefixSid(
1313 PSID Sid1,
1314 PSID Sid2
1315 );
1316
1317 NTSYSAPI
1318 BOOLEAN
1319 NTAPI
1320 RtlEqualSid (
1321 _In_ PSID Sid1,
1322 _In_ PSID Sid2
1323 );
1324
1325 NTSYSAPI
1326 BOOLEAN
1327 NTAPI
1328 RtlFirstFreeAce(
1329 PACL Acl,
1330 PACE* Ace
1331 );
1332
1333 NTSYSAPI
1334 PVOID
1335 NTAPI
1336 RtlFreeSid(
1337 _In_ _Post_invalid_ PSID Sid
1338 );
1339
1340 NTSYSAPI
1341 NTSTATUS
1342 NTAPI
1343 RtlGetAce(
1344 PACL Acl,
1345 ULONG AceIndex,
1346 PVOID *Ace
1347 );
1348
1349 NTSYSAPI
1350 NTSTATUS
1351 NTAPI
1352 RtlGetControlSecurityDescriptor(
1353 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,
1354 _Out_ PSECURITY_DESCRIPTOR_CONTROL Control,
1355 _Out_ PULONG Revision
1356 );
1357
1358 NTSYSAPI
1359 NTSTATUS
1360 NTAPI
1361 RtlGetDaclSecurityDescriptor(
1362 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,
1363 _Out_ PBOOLEAN DaclPresent,
1364 _Out_ PACL *Dacl,
1365 _Out_ PBOOLEAN DaclDefaulted
1366 );
1367
1368 NTSYSAPI
1369 NTSTATUS
1370 NTAPI
1371 RtlGetSaclSecurityDescriptor(
1372 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,
1373 _Out_ PBOOLEAN SaclPresent,
1374 _Out_ PACL* Sacl,
1375 _Out_ PBOOLEAN SaclDefaulted
1376 );
1377
1378 NTSYSAPI
1379 NTSTATUS
1380 NTAPI
1381 RtlGetGroupSecurityDescriptor(
1382 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,
1383 _Out_ PSID *Group,
1384 _Out_ PBOOLEAN GroupDefaulted
1385 );
1386
1387 NTSYSAPI
1388 NTSTATUS
1389 NTAPI
1390 RtlGetOwnerSecurityDescriptor(
1391 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,
1392 _Out_ PSID *Owner,
1393 _Out_ PBOOLEAN OwnerDefaulted
1394 );
1395
1396 NTSYSAPI
1397 BOOLEAN
1398 NTAPI
1399 RtlGetSecurityDescriptorRMControl(
1400 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,
1401 _Out_ PUCHAR RMControl
1402 );
1403
1404 NTSYSAPI
1405 PSID_IDENTIFIER_AUTHORITY
1406 NTAPI
1407 RtlIdentifierAuthoritySid(PSID Sid);
1408
1409 NTSYSAPI
1410 NTSTATUS
1411 NTAPI
1412 RtlImpersonateSelf(IN SECURITY_IMPERSONATION_LEVEL ImpersonationLevel);
1413
1414 _IRQL_requires_max_(APC_LEVEL)
1415 NTSYSAPI
1416 NTSTATUS
1417 NTAPI
1418 RtlInitializeSid(
1419 _Out_ PSID Sid,
1420 _In_ PSID_IDENTIFIER_AUTHORITY IdentifierAuthority,
1421 _In_ UCHAR SubAuthorityCount
1422 );
1423
1424 NTSYSAPI
1425 ULONG
1426 NTAPI
1427 RtlLengthRequiredSid(IN ULONG SubAuthorityCount);
1428
1429 NTSYSAPI
1430 ULONG
1431 NTAPI
1432 RtlLengthSid(IN PSID Sid);
1433
1434 NTSYSAPI
1435 NTSTATUS
1436 NTAPI
1437 RtlMakeSelfRelativeSD(
1438 _In_ PSECURITY_DESCRIPTOR AbsoluteSD,
1439 _Out_ PSECURITY_DESCRIPTOR SelfRelativeSD,
1440 _Inout_ PULONG BufferLength);
1441
1442 NTSYSAPI
1443 VOID
1444 NTAPI
1445 RtlMapGenericMask(
1446 PACCESS_MASK AccessMask,
1447 PGENERIC_MAPPING GenericMapping
1448 );
1449
1450 #ifdef NTOS_MODE_USER
1451
1452 NTSYSAPI
1453 NTSTATUS
1454 NTAPI
1455 RtlQueryInformationAcl(
1456 PACL Acl,
1457 PVOID Information,
1458 ULONG InformationLength,
1459 ACL_INFORMATION_CLASS InformationClass
1460 );
1461
1462 #endif
1463
1464 NTSYSAPI
1465 VOID
1466 NTAPI
1467 RtlReleasePrivilege(
1468 _In_ PVOID ReturnedState
1469 );
1470
1471 _IRQL_requires_max_(APC_LEVEL)
1472 NTSYSAPI
1473 NTSTATUS
1474 NTAPI
1475 RtlSelfRelativeToAbsoluteSD(
1476 _In_ PSECURITY_DESCRIPTOR SelfRelativeSecurityDescriptor,
1477 _Out_writes_bytes_to_opt_(*AbsoluteSecurityDescriptorSize, *AbsoluteSecurityDescriptorSize) PSECURITY_DESCRIPTOR AbsoluteSecurityDescriptor,
1478 _Inout_ PULONG AbsoluteSecurityDescriptorSize,
1479 _Out_writes_bytes_to_opt_(*DaclSize, *DaclSize) PACL Dacl,
1480 _Inout_ PULONG DaclSize,
1481 _Out_writes_bytes_to_opt_(*SaclSize, *SaclSize) PACL Sacl,
1482 _Inout_ PULONG SaclSize,
1483 _Out_writes_bytes_to_opt_(*OwnerSize, *OwnerSize) PSID Owner,
1484 _Inout_ PULONG OwnerSize,
1485 _Out_writes_bytes_to_opt_(*PrimaryGroupSize, *PrimaryGroupSize) PSID PrimaryGroup,
1486 _Inout_ PULONG PrimaryGroupSize
1487 );
1488
1489 NTSYSAPI
1490 NTSTATUS
1491 NTAPI
1492 RtlSelfRelativeToAbsoluteSD2(
1493 _Inout_ PSECURITY_DESCRIPTOR SelfRelativeSD,
1494 _Out_ PULONG BufferSize
1495 );
1496
1497 NTSYSAPI
1498 NTSTATUS
1499 NTAPI
1500 RtlSetAttributesSecurityDescriptor(
1501 _Inout_ PSECURITY_DESCRIPTOR SecurityDescriptor,
1502 _In_ SECURITY_DESCRIPTOR_CONTROL Control,
1503 _Out_ PULONG Revision
1504 );
1505
1506 NTSYSAPI
1507 NTSTATUS
1508 NTAPI
1509 RtlSetControlSecurityDescriptor(
1510 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,
1511 _In_ SECURITY_DESCRIPTOR_CONTROL ControlBitsOfInterest,
1512 _In_ SECURITY_DESCRIPTOR_CONTROL ControlBitsToSet
1513 );
1514
1515 _IRQL_requires_max_(APC_LEVEL)
1516 NTSYSAPI
1517 NTSTATUS
1518 NTAPI
1519 RtlSetDaclSecurityDescriptor(
1520 _Inout_ PSECURITY_DESCRIPTOR SecurityDescriptor,
1521 _In_ BOOLEAN DaclPresent,
1522 _In_opt_ PACL Dacl,
1523 _In_opt_ BOOLEAN DaclDefaulted
1524 );
1525
1526 _IRQL_requires_max_(APC_LEVEL)
1527 NTSYSAPI
1528 NTSTATUS
1529 NTAPI
1530 RtlSetGroupSecurityDescriptor(
1531 _Inout_ PSECURITY_DESCRIPTOR SecurityDescriptor,
1532 _In_opt_ PSID Group,
1533 _In_opt_ BOOLEAN GroupDefaulted
1534 );
1535
1536 #ifdef NTOS_MODE_USER
1537
1538 NTSYSAPI
1539 NTSTATUS
1540 NTAPI
1541 RtlSetInformationAcl(
1542 PACL Acl,
1543 PVOID Information,
1544 ULONG InformationLength,
1545 ACL_INFORMATION_CLASS InformationClass
1546 );
1547
1548 #endif
1549
1550 _IRQL_requires_max_(APC_LEVEL)
1551 NTSYSAPI
1552 NTSTATUS
1553 NTAPI
1554 RtlSetOwnerSecurityDescriptor(
1555 _Inout_ PSECURITY_DESCRIPTOR SecurityDescriptor,
1556 _In_opt_ PSID Owner,
1557 _In_opt_ BOOLEAN OwnerDefaulted
1558 );
1559
1560 NTSYSAPI
1561 NTSTATUS
1562 NTAPI
1563 RtlSetSaclSecurityDescriptor(
1564 _Inout_ PSECURITY_DESCRIPTOR SecurityDescriptor,
1565 _In_ BOOLEAN SaclPresent,
1566 _In_ PACL Sacl,
1567 _In_ BOOLEAN SaclDefaulted
1568 );
1569
1570 NTSYSAPI
1571 VOID
1572 NTAPI
1573 RtlSetSecurityDescriptorRMControl(
1574 _Inout_ PSECURITY_DESCRIPTOR SecurityDescriptor,
1575 _In_ PUCHAR RMControl
1576 );
1577
1578 NTSYSAPI
1579 PUCHAR
1580 NTAPI
1581 RtlSubAuthorityCountSid(
1582 _In_ PSID Sid
1583 );
1584
1585 NTSYSAPI
1586 PULONG
1587 NTAPI
1588 RtlSubAuthoritySid(
1589 _In_ PSID Sid,
1590 _In_ ULONG SubAuthority
1591 );
1592
1593 _IRQL_requires_max_(APC_LEVEL)
1594 _Must_inspect_result_
1595 NTSYSAPI
1596 BOOLEAN
1597 NTAPI
1598 RtlValidRelativeSecurityDescriptor(
1599 _In_reads_bytes_(SecurityDescriptorLength) PSECURITY_DESCRIPTOR SecurityDescriptorInput,
1600 _In_ ULONG SecurityDescriptorLength,
1601 _In_ SECURITY_INFORMATION RequiredInformation
1602 );
1603
1604 NTSYSAPI
1605 BOOLEAN
1606 NTAPI
1607 RtlValidSecurityDescriptor(IN PSECURITY_DESCRIPTOR SecurityDescriptor);
1608
1609 NTSYSAPI
1610 BOOLEAN
1611 NTAPI
1612 RtlValidSid(IN PSID Sid);
1613
1614 NTSYSAPI
1615 BOOLEAN
1616 NTAPI
1617 RtlValidAcl(PACL Acl);
1618
1619 NTSYSAPI
1620 NTSTATUS
1621 NTAPI
1622 RtlDeleteSecurityObject(
1623 _In_ PSECURITY_DESCRIPTOR *ObjectDescriptor
1624 );
1625
1626 NTSYSAPI
1627 NTSTATUS
1628 NTAPI
1629 RtlNewSecurityObject(
1630 _In_ PSECURITY_DESCRIPTOR ParentDescriptor,
1631 _In_ PSECURITY_DESCRIPTOR CreatorDescriptor,
1632 _Out_ PSECURITY_DESCRIPTOR *NewDescriptor,
1633 _In_ BOOLEAN IsDirectoryObject,
1634 _In_ HANDLE Token,
1635 _In_ PGENERIC_MAPPING GenericMapping
1636 );
1637
1638 NTSYSAPI
1639 NTSTATUS
1640 NTAPI
1641 RtlQuerySecurityObject(
1642 _In_ PSECURITY_DESCRIPTOR ObjectDescriptor,
1643 _In_ SECURITY_INFORMATION SecurityInformation,
1644 _Out_ PSECURITY_DESCRIPTOR ResultantDescriptor,
1645 _In_ ULONG DescriptorLength,
1646 _Out_ PULONG ReturnLength
1647 );
1648
1649 NTSYSAPI
1650 NTSTATUS
1651 NTAPI
1652 RtlSetSecurityObject(
1653 _In_ SECURITY_INFORMATION SecurityInformation,
1654 _In_ PSECURITY_DESCRIPTOR ModificationDescriptor,
1655 _Out_ PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor,
1656 _In_ PGENERIC_MAPPING GenericMapping,
1657 _In_ HANDLE Token
1658 );
1659
1660 //
1661 // Single-Character Functions
1662 //
1663 NTSYSAPI
1664 NTSTATUS
1665 NTAPI
1666 RtlLargeIntegerToChar(
1667 _In_ PLARGE_INTEGER Value,
1668 _In_ ULONG Base,
1669 _In_ ULONG Length,
1670 _Out_ PCHAR String
1671 );
1672
1673 NTSYSAPI
1674 CHAR
1675 NTAPI
1676 RtlUpperChar(CHAR Source);
1677
1678 NTSYSAPI
1679 WCHAR
1680 NTAPI
1681 RtlUpcaseUnicodeChar(WCHAR Source);
1682
1683 NTSYSAPI
1684 WCHAR
1685 NTAPI
1686 RtlDowncaseUnicodeChar(IN WCHAR Source);
1687
1688 NTSYSAPI
1689 NTSTATUS
1690 NTAPI
1691 RtlIntegerToChar(
1692 _In_ ULONG Value,
1693 _In_ ULONG Base,
1694 _In_ ULONG Length,
1695 _Out_ PCHAR String
1696 );
1697
1698 NTSYSAPI
1699 NTSTATUS
1700 NTAPI
1701 RtlIntegerToUnicode(
1702 _In_ ULONG Value,
1703 _In_opt_ ULONG Base,
1704 _In_opt_ ULONG Length,
1705 _Inout_ LPWSTR String
1706 );
1707
1708 _IRQL_requires_max_(PASSIVE_LEVEL)
1709 _At_(String->MaximumLength, _Const_)
1710 NTSYSAPI
1711 NTSTATUS
1712 NTAPI
1713 RtlIntegerToUnicodeString(
1714 _In_ ULONG Value,
1715 _In_opt_ ULONG Base,
1716 _Inout_ PUNICODE_STRING String
1717 );
1718
1719 NTSYSAPI
1720 NTSTATUS
1721 NTAPI
1722 RtlCharToInteger(
1723 PCSZ String,
1724 ULONG Base,
1725 PULONG Value
1726 );
1727
1728 //
1729 // Byte Swap Functions
1730 //
1731 #ifdef NTOS_MODE_USER
1732
1733 #if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037)) || \
1734 ((defined(_M_AMD64) || \
1735 defined(_M_IA64)) && (_MSC_FULL_VER > 13009175))
1736
1737 unsigned short __cdecl _byteswap_ushort(unsigned short);
1738 unsigned long __cdecl _byteswap_ulong (unsigned long);
1739 unsigned __int64 __cdecl _byteswap_uint64(unsigned __int64);
1740 #pragma intrinsic(_byteswap_ushort)
1741 #pragma intrinsic(_byteswap_ulong)
1742 #pragma intrinsic(_byteswap_uint64)
1743 #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
1744 #define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
1745 #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
1746
1747 #elif defined (__GNUC__)
1748
1749 #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
1750 #define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
1751 #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
1752
1753 #else
1754
1755 #if (NTDDI_VERSION >= NTDDI_WIN2K)
1756 NTSYSAPI
1757 USHORT
1758 FASTCALL
1759 RtlUshortByteSwap(IN USHORT Source);
1760
1761 NTSYSAPI
1762 ULONG
1763 FASTCALL
1764 RtlUlongByteSwap(IN ULONG Source);
1765
1766 NTSYSAPI
1767 ULONGLONG
1768 FASTCALL
1769 RtlUlonglongByteSwap(IN ULONGLONG Source);
1770 #endif
1771
1772 #endif
1773 #endif // NTOS_MODE_USER
1774
1775 //
1776 // Unicode->Ansi String Functions
1777 //
1778 NTSYSAPI
1779 ULONG
1780 NTAPI
1781 RtlxUnicodeStringToAnsiSize(IN PCUNICODE_STRING UnicodeString);
1782
1783 #ifdef NTOS_MODE_USER
1784
1785 #define RtlUnicodeStringToAnsiSize(STRING) ( \
1786 NLS_MB_CODE_PAGE_TAG ? \
1787 RtlxUnicodeStringToAnsiSize(STRING) : \
1788 ((STRING)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
1789 )
1790
1791 #endif
1792
1793 NTSYSAPI
1794 NTSTATUS
1795 NTAPI
1796 RtlUnicodeStringToAnsiString(
1797 PANSI_STRING DestinationString,
1798 PCUNICODE_STRING SourceString,
1799 BOOLEAN AllocateDestinationString
1800 );
1801
1802 //
1803 // Unicode->OEM String Functions
1804 //
1805 NTSYSAPI
1806 NTSTATUS
1807 NTAPI
1808 RtlUpcaseUnicodeStringToOemString(
1809 POEM_STRING DestinationString,
1810 PCUNICODE_STRING SourceString,
1811 BOOLEAN AllocateDestinationString
1812 );
1813
1814 _IRQL_requires_max_(PASSIVE_LEVEL)
1815 _Must_inspect_result_
1816 //_At_(DestinationString->Buffer, _Post_bytecount_(DestinationString->Length))
1817 NTSYSAPI
1818 NTSTATUS
1819 NTAPI
1820 RtlUpcaseUnicodeStringToCountedOemString(
1821 _When_(AllocateDestinationString, _Out_ _At_(DestinationString->Buffer, __drv_allocatesMem(Mem)))
1822 _When_(!AllocateDestinationString, _Inout_)
1823 POEM_STRING DestinationString,
1824 _In_ PCUNICODE_STRING SourceString,
1825 _In_ BOOLEAN AllocateDestinationString
1826 );
1827
1828 NTSYSAPI
1829 NTSTATUS
1830 NTAPI
1831 RtlUnicodeStringToOemString(
1832 POEM_STRING DestinationString,
1833 PCUNICODE_STRING SourceString,
1834 BOOLEAN AllocateDestinationString
1835 );
1836
1837 NTSYSAPI
1838 NTSTATUS
1839 NTAPI
1840 RtlUpcaseUnicodeToOemN(
1841 PCHAR OemString,
1842 ULONG OemSize,
1843 PULONG ResultSize,
1844 PCWCH UnicodeString,
1845 ULONG UnicodeSize
1846 );
1847
1848 NTSYSAPI
1849 ULONG
1850 NTAPI
1851 RtlxUnicodeStringToOemSize(IN PCUNICODE_STRING UnicodeString);
1852
1853 #ifdef NTOS_MODE_USER
1854
1855 #define RtlUnicodeStringToOemSize(STRING) ( \
1856 NLS_MB_OEM_CODE_PAGE_TAG ? \
1857 RtlxUnicodeStringToOemSize(STRING) : \
1858 ((STRING)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
1859 )
1860
1861 #define RtlUnicodeStringToCountedOemSize(STRING) ( \
1862 (ULONG)(RtlUnicodeStringToOemSize(STRING) - sizeof(ANSI_NULL)) \
1863 )
1864
1865 #endif
1866
1867 NTSYSAPI
1868 NTSTATUS
1869 NTAPI
1870 RtlUnicodeToOemN(
1871 PCHAR OemString,
1872 ULONG OemSize,
1873 PULONG ResultSize,
1874 PCWCH UnicodeString,
1875 ULONG UnicodeSize
1876 );
1877
1878 //
1879 // Unicode->MultiByte String Functions
1880 //
1881 NTSYSAPI
1882 NTSTATUS
1883 NTAPI
1884 RtlUnicodeToMultiByteN(
1885 PCHAR MbString,
1886 ULONG MbSize,
1887 PULONG ResultSize,
1888 PCWCH UnicodeString,
1889 ULONG UnicodeSize
1890 );
1891
1892 NTSYSAPI
1893 NTSTATUS
1894 NTAPI
1895 RtlUpcaseUnicodeToMultiByteN(
1896 PCHAR MbString,
1897 ULONG MbSize,
1898 PULONG ResultSize,
1899 PCWCH UnicodeString,
1900 ULONG UnicodeSize
1901 );
1902
1903 NTSYSAPI
1904 NTSTATUS
1905 NTAPI
1906 RtlUnicodeToMultiByteSize(
1907 PULONG MbSize,
1908 PCWCH UnicodeString,
1909 ULONG UnicodeSize
1910 );
1911
1912 NTSYSAPI
1913 ULONG
1914 NTAPI
1915 RtlxOemStringToUnicodeSize(IN PCOEM_STRING OemString);
1916
1917 //
1918 // OEM to Unicode Functions
1919 //
1920 NTSYSAPI
1921 NTSTATUS
1922 NTAPI
1923 RtlOemStringToUnicodeString(
1924 PUNICODE_STRING DestinationString,
1925 PCOEM_STRING SourceString,
1926 BOOLEAN AllocateDestinationString
1927 );
1928
1929 _IRQL_requires_max_(PASSIVE_LEVEL)
1930 NTSYSAPI
1931 NTSTATUS
1932 NTAPI
1933 RtlOemToUnicodeN(
1934 _Out_writes_bytes_to_(MaxBytesInUnicodeString, *BytesInUnicodeString) PWCH UnicodeString,
1935 _In_ ULONG MaxBytesInUnicodeString,
1936 _Out_opt_ PULONG BytesInUnicodeString,
1937 _In_reads_bytes_(BytesInOemString) PCCH OemString,
1938 _In_ ULONG BytesInOemString
1939 );
1940
1941 #ifdef NTOS_MODE_USER
1942
1943 #define RtlOemStringToUnicodeSize(STRING) ( \
1944 NLS_MB_OEM_CODE_PAGE_TAG ? \
1945 RtlxOemStringToUnicodeSize(STRING) : \
1946 ((STRING)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
1947 )
1948
1949 #define RtlOemStringToCountedUnicodeSize(STRING) ( \
1950 (ULONG)(RtlOemStringToUnicodeSize(STRING) - sizeof(UNICODE_NULL)) \
1951 )
1952
1953 #endif
1954
1955 //
1956 // Ansi->Unicode String Functions
1957 //
1958 NTSYSAPI
1959 ULONG
1960 NTAPI
1961 RtlxAnsiStringToUnicodeSize(
1962 PCANSI_STRING AnsiString
1963 );
1964
1965 NTSYSAPI
1966 NTSTATUS
1967 NTAPI
1968 RtlAnsiStringToUnicodeString(
1969 PUNICODE_STRING DestinationString,
1970 PCANSI_STRING SourceString,
1971 BOOLEAN AllocateDestinationString
1972 );
1973
1974 #ifdef NTOS_MODE_USER
1975
1976 #define RtlAnsiStringToUnicodeSize(STRING) ( \
1977 NLS_MB_CODE_PAGE_TAG ? \
1978 RtlxAnsiStringToUnicodeSize(STRING) : \
1979 ((STRING)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
1980 )
1981
1982 #endif
1983
1984 NTSYSAPI
1985 BOOLEAN
1986 NTAPI
1987 RtlCreateUnicodeStringFromAsciiz(
1988 _Out_ PUNICODE_STRING Destination,
1989 _In_ PCSZ Source
1990 );
1991
1992 //
1993 // Unicode String Functions
1994 //
1995 NTSYSAPI
1996 NTSTATUS
1997 NTAPI
1998 RtlAppendUnicodeToString(
1999 PUNICODE_STRING Destination,
2000 PCWSTR Source
2001 );
2002
2003 NTSYSAPI
2004 NTSTATUS
2005 NTAPI
2006 RtlAppendUnicodeStringToString(
2007 PUNICODE_STRING Destination,
2008 PCUNICODE_STRING Source
2009 );
2010
2011 NTSYSAPI
2012 LONG
2013 NTAPI
2014 RtlCompareUnicodeString(
2015 PCUNICODE_STRING String1,
2016 PCUNICODE_STRING String2,
2017 BOOLEAN CaseInsensitive
2018 );
2019
2020 NTSYSAPI
2021 VOID
2022 NTAPI
2023 RtlCopyUnicodeString(
2024 PUNICODE_STRING DestinationString,
2025 PCUNICODE_STRING SourceString
2026 );
2027
2028 NTSYSAPI
2029 BOOLEAN
2030 NTAPI
2031 RtlCreateUnicodeString(
2032 PUNICODE_STRING DestinationString,
2033 PCWSTR SourceString
2034 );
2035
2036 #ifdef NTOS_MODE_USER
2037
2038 NTSYSAPI
2039 NTSTATUS
2040 NTAPI
2041 RtlDowncaseUnicodeString(
2042 _Inout_ PUNICODE_STRING UniDest,
2043 _In_ PCUNICODE_STRING UniSource,
2044 _In_ BOOLEAN AllocateDestinationString
2045 );
2046
2047 NTSYSAPI
2048 NTSTATUS
2049 NTAPI
2050 RtlDuplicateUnicodeString(
2051 _In_ ULONG Flags,
2052 _In_ PCUNICODE_STRING SourceString,
2053 _Out_ PUNICODE_STRING DestinationString
2054 );
2055
2056 //
2057 // Memory Functions
2058 //
2059 NTSYSAPI
2060 VOID
2061 NTAPI
2062 RtlFillMemoryUlong(
2063 _In_ PVOID Destination,
2064 _In_ SIZE_T Length,
2065 _In_ ULONG Fill
2066 );
2067
2068 NTSYSAPI
2069 VOID
2070 NTAPI
2071 RtlFillMemoryUlonglong(
2072 _Out_ PVOID Destination,
2073 _In_ SIZE_T Length,
2074 _In_ ULONGLONG Pattern
2075 );
2076
2077
2078 NTSYSAPI
2079 SIZE_T
2080 NTAPI
2081 RtlCompareMemoryUlong(
2082 _In_ PVOID Source,
2083 _In_ SIZE_T Length,
2084 _In_ ULONG Pattern
2085 );
2086
2087 #ifndef RtlEqualMemory
2088 #define RtlEqualMemory(Destination, Source, Length) \
2089 (!memcmp(Destination, Source, Length))
2090 #endif
2091
2092 #define RtlCopyBytes RtlCopyMemory
2093 #define RtlFillBytes RtlFillMemory
2094 #define RtlZeroBytes RtlZeroMemory
2095
2096 #endif
2097
2098 NTSYSAPI
2099 BOOLEAN
2100 NTAPI
2101 RtlEqualUnicodeString(
2102 PCUNICODE_STRING String1,
2103 PCUNICODE_STRING String2,
2104 BOOLEAN CaseInsensitive
2105 );
2106
2107 NTSYSAPI
2108 NTSTATUS
2109 NTAPI
2110 RtlFindCharInUnicodeString(
2111 _In_ ULONG Flags,
2112 _In_ PCUNICODE_STRING SearchString,
2113 _In_ PCUNICODE_STRING MatchString,
2114 _Out_ PUSHORT Position
2115 );
2116
2117 _IRQL_requires_max_(PASSIVE_LEVEL)
2118 NTSYSAPI
2119 VOID
2120 NTAPI
2121 RtlFreeUnicodeString(
2122 _Inout_ _At_(UnicodeString->Buffer, __drv_freesMem(Mem))
2123 PUNICODE_STRING UnicodeString
2124 );
2125
2126 NTSYSAPI
2127 VOID
2128 NTAPI
2129 RtlEraseUnicodeString(
2130 _Inout_ PUNICODE_STRING String
2131 );
2132
2133 NTSYSAPI
2134 NTSTATUS
2135 NTAPI
2136 RtlHashUnicodeString(
2137 _In_ CONST UNICODE_STRING *String,
2138 _In_ BOOLEAN CaseInSensitive,
2139 _In_ ULONG HashAlgorithm,
2140 _Out_ PULONG HashValue
2141 );
2142
2143 _IRQL_requires_max_(DISPATCH_LEVEL)
2144 _At_(DestinationString->Buffer, _Post_equal_to_(SourceString))
2145 _When_(SourceString != NULL,
2146 _At_(DestinationString->Length, _Post_equal_to_(_String_length_(SourceString) * sizeof(WCHAR)))
2147 _At_(DestinationString->MaximumLength, _Post_equal_to_(DestinationString->Length + sizeof(WCHAR))))
2148 _When_(SourceString == NULL,
2149 _At_(DestinationString->Length, _Post_equal_to_(0))
2150 _At_(DestinationString->MaximumLength, _Post_equal_to_(0)))
2151 NTSYSAPI
2152 VOID
2153 NTAPI
2154 RtlInitUnicodeString(
2155 _Out_ PUNICODE_STRING DestinationString,
2156 _In_opt_z_ __drv_aliasesMem PCWSTR SourceString
2157 );
2158
2159 _IRQL_requires_max_(DISPATCH_LEVEL)
2160 NTSYSAPI
2161 NTSTATUS
2162 NTAPI
2163 RtlInitUnicodeStringEx(
2164 _Out_ PUNICODE_STRING DestinationString,
2165 _In_opt_z_ __drv_aliasesMem PCWSTR SourceString
2166 );
2167
2168 NTSYSAPI
2169 BOOLEAN
2170 NTAPI
2171 RtlIsTextUnicode(
2172 PVOID Buffer,
2173 INT Length,
2174 INT *Flags
2175 );
2176
2177 _IRQL_requires_max_(PASSIVE_LEVEL)
2178 _Must_inspect_result_
2179 NTSYSAPI
2180 BOOLEAN
2181 NTAPI
2182 RtlPrefixString(
2183 _In_ const STRING *String1,
2184 _In_ const STRING *String2,
2185 _In_ BOOLEAN CaseInsensitive
2186 );
2187
2188 _IRQL_requires_max_(PASSIVE_LEVEL)
2189 _Must_inspect_result_
2190 NTSYSAPI
2191 BOOLEAN
2192 NTAPI
2193 RtlPrefixUnicodeString(
2194 _In_ PCUNICODE_STRING String1,
2195 _In_ PCUNICODE_STRING String2,
2196 _In_ BOOLEAN CaseInsensitive
2197 );
2198
2199 _IRQL_requires_max_(PASSIVE_LEVEL)
2200 NTSYSAPI
2201 VOID
2202 NTAPI
2203 RtlUpperString(
2204 _Inout_ PSTRING DestinationString,
2205 _In_ const STRING *SourceString
2206 );
2207
2208 _IRQL_requires_max_(PASSIVE_LEVEL)
2209 _Must_inspect_result_
2210 NTSYSAPI
2211 LONG
2212 NTAPI
2213 RtlCompareString(
2214 _In_ const STRING *String1,
2215 _In_ const STRING *String2,
2216 _In_ BOOLEAN CaseInSensitive
2217 );
2218
2219 NTSYSAPI
2220 VOID
2221 NTAPI
2222 RtlCopyString(
2223 _Out_ PSTRING DestinationString,
2224 _In_opt_ const STRING *SourceString
2225 );
2226
2227 _IRQL_requires_max_(PASSIVE_LEVEL)
2228 _Must_inspect_result_
2229 NTSYSAPI
2230 BOOLEAN
2231 NTAPI
2232 RtlEqualString(
2233 _In_ const STRING *String1,
2234 _In_ const STRING *String2,
2235 _In_ BOOLEAN CaseInSensitive
2236 );
2237
2238 _IRQL_requires_max_(APC_LEVEL)
2239 NTSYSAPI
2240 NTSTATUS
2241 NTAPI
2242 RtlAppendStringToString(
2243 _Inout_ PSTRING Destination,
2244 _In_ const STRING *Source
2245 );
2246
2247 _IRQL_requires_max_(PASSIVE_LEVEL)
2248 _When_(AllocateDestinationString, _Must_inspect_result_)
2249 NTSYSAPI
2250 NTSTATUS
2251 NTAPI
2252 RtlUpcaseUnicodeString(
2253 _When_(AllocateDestinationString, _Out_ _At_(DestinationString->Buffer, __drv_allocatesMem(Mem)))
2254 _When_(!AllocateDestinationString, _Inout_)
2255 PUNICODE_STRING DestinationString,
2256 _In_ PCUNICODE_STRING SourceString,
2257 _In_ BOOLEAN AllocateDestinationString
2258 );
2259
2260 _IRQL_requires_max_(PASSIVE_LEVEL)
2261 NTSYSAPI
2262 NTSTATUS
2263 NTAPI
2264 RtlUnicodeStringToInteger(
2265 _In_ PCUNICODE_STRING String,
2266 _In_opt_ ULONG Base,
2267 _Out_ PULONG Value
2268 );
2269
2270 NTSYSAPI
2271 NTSTATUS
2272 NTAPI
2273 RtlValidateUnicodeString(
2274 _In_ ULONG Flags,
2275 _In_ PCUNICODE_STRING String
2276 );
2277
2278 //
2279 // Ansi String Functions
2280 //
2281 _IRQL_requires_max_(PASSIVE_LEVEL)
2282 NTSYSAPI
2283 VOID
2284 NTAPI
2285 RtlFreeAnsiString(
2286 _Inout_ _At_(AnsiString->Buffer, __drv_freesMem(Mem))
2287 PANSI_STRING AnsiString
2288 );
2289
2290 _IRQL_requires_max_(DISPATCH_LEVEL)
2291 NTSYSAPI
2292 VOID
2293 NTAPI
2294 RtlInitAnsiString(
2295 _Out_ PANSI_STRING DestinationString,
2296 _In_opt_z_ __drv_aliasesMem PCSZ SourceString
2297 );
2298
2299 _IRQL_requires_max_(DISPATCH_LEVEL)
2300 NTSYSAPI
2301 NTSTATUS
2302 NTAPI
2303 RtlInitAnsiStringEx(
2304 _Out_ PANSI_STRING DestinationString,
2305 _In_opt_z_ __drv_aliasesMem PCSZ SourceString
2306 );
2307
2308 //
2309 // OEM String Functions
2310 //
2311 _IRQL_requires_max_(PASSIVE_LEVEL)
2312 NTSYSAPI
2313 VOID
2314 NTAPI
2315 RtlFreeOemString(
2316 _Inout_ _At_(OemString->Buffer, __drv_freesMem(Mem))
2317 POEM_STRING OemString
2318 );
2319
2320 //
2321 // MultiByte->Unicode String Functions
2322 //
2323 _IRQL_requires_max_(PASSIVE_LEVEL)
2324 NTSYSAPI
2325 NTSTATUS
2326 NTAPI
2327 RtlMultiByteToUnicodeN(
2328 _Out_writes_bytes_to_(MaxBytesInUnicodeString, *BytesInUnicodeString) PWCH UnicodeString,
2329 _In_ ULONG MaxBytesInUnicodeString,
2330 _Out_opt_ PULONG BytesInUnicodeString,
2331 _In_reads_bytes_(BytesInMultiByteString) const CHAR *MultiByteString,
2332 _In_ ULONG BytesInMultiByteString
2333 );
2334
2335 _IRQL_requires_max_(PASSIVE_LEVEL)
2336 NTSYSAPI
2337 NTSTATUS
2338 NTAPI
2339 RtlMultiByteToUnicodeSize(
2340 _Out_ PULONG BytesInUnicodeString,
2341 _In_reads_bytes_(BytesInMultiByteString) const CHAR *MultiByteString,
2342 _In_ ULONG BytesInMultiByteString
2343 );
2344
2345 //
2346 // Atom Functions
2347 //
2348 NTSYSAPI
2349 NTSTATUS
2350 NTAPI
2351 RtlAddAtomToAtomTable(
2352 _In_ PRTL_ATOM_TABLE AtomTable,
2353 _In_ PWSTR AtomName,
2354 _Out_ PRTL_ATOM Atom
2355 );
2356
2357 NTSYSAPI
2358 NTSTATUS
2359 NTAPI
2360 RtlCreateAtomTable(
2361 _In_ ULONG TableSize,
2362 _Inout_ PRTL_ATOM_TABLE *AtomTable
2363 );
2364
2365 NTSYSAPI
2366 NTSTATUS
2367 NTAPI
2368 RtlDeleteAtomFromAtomTable(
2369 _In_ PRTL_ATOM_TABLE AtomTable,
2370 _In_ RTL_ATOM Atom
2371 );
2372
2373 NTSYSAPI
2374 NTSTATUS
2375 NTAPI
2376 RtlDestroyAtomTable(IN PRTL_ATOM_TABLE AtomTable);
2377
2378 NTSYSAPI
2379 NTSTATUS
2380 NTAPI
2381 RtlQueryAtomInAtomTable(
2382 _In_ PRTL_ATOM_TABLE AtomTable,
2383 _In_ RTL_ATOM Atom,
2384 _Out_opt_ PULONG RefCount,
2385 _Out_opt_ PULONG PinCount,
2386 _Out_opt_z_bytecap_(*NameLength) PWSTR AtomName,
2387 _Inout_opt_ PULONG NameLength
2388 );
2389
2390 NTSYSAPI
2391 NTSTATUS
2392 NTAPI
2393 RtlPinAtomInAtomTable(
2394 _In_ PRTL_ATOM_TABLE AtomTable,
2395 _In_ RTL_ATOM Atom
2396 );
2397
2398 NTSYSAPI
2399 NTSTATUS
2400 NTAPI
2401 RtlLookupAtomInAtomTable(
2402 _In_ PRTL_ATOM_TABLE AtomTable,
2403 _In_ PWSTR AtomName,
2404 _Out_ PRTL_ATOM Atom
2405 );
2406
2407 //
2408 // Process Management Functions
2409 //
2410 NTSYSAPI
2411 PPEB
2412 NTAPI
2413 RtlGetCurrentPeb(
2414 VOID
2415 );
2416
2417 NTSYSAPI
2418 VOID
2419 NTAPI
2420 RtlAcquirePebLock(VOID);
2421
2422 NTSYSAPI
2423 NTSTATUS
2424 NTAPI
2425 RtlCreateProcessParameters (
2426 _Out_ PRTL_USER_PROCESS_PARAMETERS *ProcessParameters,
2427 _In_ PUNICODE_STRING ImagePathName,
2428 _In_opt_ PUNICODE_STRING DllPath,
2429 _In_opt_ PUNICODE_STRING CurrentDirectory,
2430 _In_opt_ PUNICODE_STRING CommandLine,
2431 _In_opt_ PWSTR Environment,
2432 _In_opt_ PUNICODE_STRING WindowTitle,
2433 _In_opt_ PUNICODE_STRING DesktopInfo,
2434 _In_opt_ PUNICODE_STRING ShellInfo,
2435 _In_opt_ PUNICODE_STRING RuntimeInfo
2436 );
2437
2438 NTSYSAPI
2439 NTSTATUS
2440 NTAPI
2441 RtlCreateUserProcess(
2442 _In_ PUNICODE_STRING ImageFileName,
2443 _In_ ULONG Attributes,
2444 _In_ PRTL_USER_PROCESS_PARAMETERS ProcessParameters,
2445 _In_opt_ PSECURITY_DESCRIPTOR ProcessSecutityDescriptor,
2446 _In_opt_ PSECURITY_DESCRIPTOR ThreadSecurityDescriptor,
2447 _In_opt_ HANDLE ParentProcess,
2448 _In_ BOOLEAN CurrentDirectory,
2449 _In_opt_ HANDLE DebugPort,
2450 _In_opt_ HANDLE ExceptionPort,
2451 _Out_ PRTL_USER_PROCESS_INFORMATION ProcessInfo
2452 );
2453
2454 #if (NTDDI_VERSION >= NTDDI_WIN7)
2455 NTSYSAPI
2456 NTSTATUS
2457 NTAPI
2458 RtlCreateUserThread(
2459 _In_ PVOID ThreadContext,
2460 _Out_ HANDLE *OutThreadHandle,
2461 _Reserved_ PVOID Reserved1,
2462 _Reserved_ PVOID Reserved2,
2463 _Reserved_ PVOID Reserved3,
2464 _Reserved_ PVOID Reserved4,
2465 _Reserved_ PVOID Reserved5,
2466 _Reserved_ PVOID Reserved6,
2467 _Reserved_ PVOID Reserved7,
2468 _Reserved_ PVOID Reserved8
2469 );
2470 #else
2471 NTSYSAPI
2472 NTSTATUS
2473 NTAPI
2474 RtlCreateUserThread(
2475 _In_ HANDLE ProcessHandle,
2476 _In_opt_ PSECURITY_DESCRIPTOR SecurityDescriptor,
2477 _In_ BOOLEAN CreateSuspended,
2478 _In_ ULONG StackZeroBits,
2479 _In_ SIZE_T StackReserve,
2480 _In_ SIZE_T StackCommit,
2481 _In_ PTHREAD_START_ROUTINE StartAddress,
2482 _In_ PVOID Parameter,
2483 _Out_opt_ PHANDLE ThreadHandle,
2484 _Out_opt_ PCLIENT_ID ClientId
2485 );
2486 #endif
2487
2488 NTSYSAPI
2489 PRTL_USER_PROCESS_PARAMETERS
2490 NTAPI
2491 RtlDeNormalizeProcessParams(
2492 _In_ PRTL_USER_PROCESS_PARAMETERS ProcessParameters);
2493
2494 NTSYSAPI
2495 NTSTATUS
2496 NTAPI
2497 RtlDestroyProcessParameters(
2498 _In_ PRTL_USER_PROCESS_PARAMETERS ProcessParameters);
2499
2500 NTSYSAPI
2501 VOID
2502 NTAPI
2503 RtlExitUserThread(
2504 _In_ NTSTATUS Status);
2505
2506 NTSYSAPI
2507 VOID
2508 NTAPI
2509 RtlInitializeContext(
2510 _In_ HANDLE ProcessHandle,
2511 _Out_ PCONTEXT ThreadContext,
2512 _In_opt_ PVOID ThreadStartParam,
2513 _In_ PTHREAD_START_ROUTINE ThreadStartAddress,
2514 _In_ PINITIAL_TEB InitialTeb
2515 );
2516
2517 #ifdef _M_AMD64
2518 typedef struct _WOW64_CONTEXT *PWOW64_CONTEXT;
2519
2520 NTSYSAPI
2521 NTSTATUS
2522 NTAPI
2523 RtlWow64GetThreadContext(
2524 _In_ HANDLE ThreadHandle,
2525 _Inout_ PWOW64_CONTEXT ThreadContext
2526 );
2527
2528
2529 NTSYSAPI
2530 NTSTATUS
2531 NTAPI
2532 RtlWow64SetThreadContext(
2533 _In_ HANDLE ThreadHandle,
2534 _In_ PWOW64_CONTEXT ThreadContext
2535 );
2536 #endif
2537
2538 NTSYSAPI
2539 BOOLEAN
2540 NTAPI
2541 RtlIsThreadWithinLoaderCallout(VOID);
2542
2543 NTSYSAPI
2544 PRTL_USER_PROCESS_PARAMETERS
2545 NTAPI
2546 RtlNormalizeProcessParams(
2547 _In_ PRTL_USER_PROCESS_PARAMETERS ProcessParameters);
2548
2549 NTSYSAPI
2550 VOID
2551 NTAPI
2552 RtlReleasePebLock(VOID);
2553
2554 NTSYSAPI
2555 NTSTATUS
2556 NTAPI
2557 RtlRemoteCall(
2558 _In_ HANDLE Process,
2559 _In_ HANDLE Thread,
2560 _In_ PVOID CallSite,
2561 _In_ ULONG ArgumentCount,
2562 _In_ PULONG Arguments,
2563 _In_ BOOLEAN PassContext,
2564 _In_ BOOLEAN AlreadySuspended
2565 );
2566
2567 NTSYSAPI
2568 NTSTATUS
2569 __cdecl
2570 RtlSetProcessIsCritical(
2571 _In_ BOOLEAN NewValue,
2572 _Out_opt_ PBOOLEAN OldValue,
2573 _In_ BOOLEAN NeedBreaks
2574 );
2575
2576 NTSYSAPI
2577 NTSTATUS
2578 __cdecl
2579 RtlSetThreadIsCritical(
2580 _In_ BOOLEAN NewValue,
2581 _Out_opt_ PBOOLEAN OldValue,
2582 _In_ BOOLEAN NeedBreaks
2583 );
2584
2585 NTSYSAPI
2586 ULONG
2587 NTAPI
2588 RtlGetCurrentProcessorNumber(
2589 VOID
2590 );
2591
2592 #define NtCurrentPeb() (NtCurrentTeb()->ProcessEnvironmentBlock)
2593
2594 //
2595 // Thread Pool Functions
2596 //
2597 //
2598 NTSTATUS
2599 NTAPI
2600 RtlSetThreadPoolStartFunc(
2601 _In_ PRTL_START_POOL_THREAD StartPoolThread,
2602 _In_ PRTL_EXIT_POOL_THREAD ExitPoolThread
2603 );
2604
2605 NTSYSAPI
2606 NTSTATUS
2607 NTAPI
2608 RtlDeregisterWaitEx(
2609 _In_ HANDLE hWaitHandle,
2610 _In_opt_ HANDLE hCompletionEvent
2611 );
2612
2613 NTSYSAPI
2614 NTSTATUS
2615 NTAPI
2616 RtlDeregisterWait(
2617 _In_ HANDLE hWaitHandle
2618 );
2619
2620 NTSYSAPI
2621 NTSTATUS
2622 NTAPI
2623 RtlQueueWorkItem(
2624 _In_ WORKERCALLBACKFUNC Function,
2625 _In_opt_ PVOID Context,
2626 _In_ ULONG Flags
2627 );
2628
2629 NTSYSAPI
2630 NTSTATUS
2631 NTAPI
2632 RtlSetIoCompletionCallback(
2633 _In_ HANDLE FileHandle,
2634 _In_ PIO_APC_ROUTINE Callback,
2635 _In_ ULONG Flags
2636 );
2637
2638 NTSYSAPI
2639 NTSTATUS
2640 NTAPI
2641 RtlRegisterWait(
2642 _In_ PHANDLE phNewWaitObject,
2643 _In_ HANDLE hObject,
2644 _In_ WAITORTIMERCALLBACKFUNC Callback,
2645 _In_ PVOID pvContext,
2646 _In_ ULONG ulMilliseconds,
2647 _In_ ULONG ulFlags
2648 );
2649
2650 //
2651 // Environment/Path Functions
2652 //
2653 NTSYSAPI
2654 NTSTATUS
2655 NTAPI
2656 RtlCreateEnvironment(
2657 _In_ BOOLEAN Inherit,
2658 _Out_ PWSTR *Environment
2659 );
2660
2661 NTSYSAPI
2662 NTSTATUS
2663 NTAPI
2664 RtlComputePrivatizedDllName_U(
2665 _In_ PUNICODE_STRING DllName,
2666 _Out_ PUNICODE_STRING RealName,
2667 _Out_ PUNICODE_STRING LocalName
2668 );
2669
2670 NTSYSAPI
2671 VOID
2672 NTAPI
2673 RtlDestroyEnvironment(
2674 _In_ PWSTR Environment
2675 );
2676
2677 NTSYSAPI
2678 BOOLEAN
2679 NTAPI
2680 RtlDoesFileExists_U(
2681 _In_ PCWSTR FileName
2682 );
2683
2684 NTSYSAPI
2685 RTL_PATH_TYPE
2686 NTAPI
2687 RtlDetermineDosPathNameType_U(
2688 _In_ PCWSTR Path
2689 );
2690
2691 NTSYSAPI
2692 ULONG
2693 NTAPI
2694 RtlDosSearchPath_U(
2695 _In_ PCWSTR Path,
2696 _In_ PCWSTR FileName,
2697 _In_ PCWSTR Extension,
2698 _In_ ULONG BufferSize,
2699 _Out_ PWSTR Buffer,
2700 _Out_ PWSTR *PartName
2701 );
2702
2703 NTSYSAPI
2704 NTSTATUS
2705 NTAPI
2706 RtlDosSearchPath_Ustr(
2707 _In_ ULONG Flags,
2708 _In_ PUNICODE_STRING PathString,
2709 _In_ PUNICODE_STRING FileNameString,
2710 _In_ PUNICODE_STRING ExtensionString,
2711 _In_ PUNICODE_STRING CallerBuffer,
2712 _Inout_opt_ PUNICODE_STRING DynamicString,
2713 _Out_opt_ PUNICODE_STRING* FullNameOut,
2714 _Out_opt_ PSIZE_T FilePartSize,
2715 _Out_opt_ PSIZE_T LengthNeeded
2716 );
2717
2718 NTSYSAPI
2719 BOOLEAN
2720 NTAPI
2721 RtlDosPathNameToNtPathName_U(
2722 _In_opt_z_ PCWSTR DosPathName,
2723 _Out_ PUNICODE_STRING NtPathName,
2724 _Out_opt_ PCWSTR *NtFileNamePart,
2725 _Out_opt_ PRTL_RELATIVE_NAME_U DirectoryInfo
2726 );
2727
2728 NTSYSAPI
2729 BOOLEAN
2730 NTAPI
2731 RtlDosPathNameToRelativeNtPathName_U(
2732 _In_ PCWSTR DosName,
2733 _Out_ PUNICODE_STRING NtName,
2734 _Out_ PCWSTR *PartName,
2735 _Out_ PRTL_RELATIVE_NAME_U RelativeName
2736 );
2737
2738 _At_(Destination->Buffer, _Out_bytecap_(Destination->MaximumLength))
2739 NTSYSAPI
2740 NTSTATUS
2741 NTAPI
2742 RtlExpandEnvironmentStrings_U(
2743 _In_z_ PWSTR Environment,
2744 _In_ PUNICODE_STRING Source,
2745 _Inout_ PUNICODE_STRING Destination,
2746 _Out_ PULONG Length
2747 );
2748
2749 NTSYSAPI
2750 ULONG
2751 NTAPI
2752 RtlGetCurrentDirectory_U(
2753 _In_ ULONG MaximumLength,
2754 _Out_bytecap_(MaximumLength) PWSTR Buffer
2755 );
2756
2757 NTSYSAPI
2758 ULONG
2759 NTAPI
2760 RtlGetFullPathName_U(
2761 _In_ PCWSTR FileName,
2762 _In_ ULONG Size,
2763 _Out_z_bytecap_(Size) PWSTR Buffer,
2764 _Out_opt_ PWSTR *ShortName
2765 );
2766
2767 #if (NTDDI_VERSION >= NTDDI_WIN7)
2768 NTSYSAPI
2769 NTSTATUS
2770 NTAPI
2771 RtlGetFullPathName_UEx(
2772 _In_ PWSTR FileName,
2773 _In_ ULONG BufferLength,
2774 _Out_ PWSTR Buffer,
2775 _Out_opt_ PWSTR *FilePart,
2776 _Out_opt_ RTL_PATH_TYPE *InputPathType
2777 );
2778 #endif
2779
2780 NTSTATUS
2781 NTAPI
2782 RtlGetFullPathName_UstrEx(
2783 _In_ PUNICODE_STRING FileName,
2784 _In_opt_ PUNICODE_STRING StaticString,
2785 _In_opt_ PUNICODE_STRING DynamicString,
2786 _Out_opt_ PUNICODE_STRING *StringUsed,
2787 _Out_opt_ PSIZE_T FilePartSize,
2788 _Out_opt_ PBOOLEAN NameInvalid,
2789 _Out_ RTL_PATH_TYPE* PathType,
2790 _Out_opt_ PSIZE_T LengthNeeded
2791 );
2792
2793 NTSYSAPI
2794 NTSTATUS
2795 NTAPI
2796 RtlGetLengthWithoutTrailingPathSeperators(
2797 _Reserved_ ULONG Flags,
2798 _In_ PCUNICODE_STRING PathString,
2799 _Out_ PULONG Length
2800 );
2801
2802 NTSYSAPI
2803 ULONG
2804 NTAPI
2805 RtlGetLongestNtPathLength(
2806 VOID
2807 );
2808
2809 NTSYSAPI
2810 ULONG
2811 NTAPI
2812 RtlIsDosDeviceName_U(
2813 _In_ PCWSTR Name
2814 );
2815
2816 NTSYSAPI
2817 ULONG
2818 NTAPI
2819 RtlIsDosDeviceName_Ustr(
2820 _In_ PCUNICODE_STRING Name
2821 );
2822
2823 _IRQL_requires_max_(PASSIVE_LEVEL)
2824 _Must_inspect_result_
2825 NTSYSAPI
2826 BOOLEAN
2827 NTAPI
2828 RtlIsNameLegalDOS8Dot3(
2829 _In_ PCUNICODE_STRING Name,
2830 _Inout_opt_ POEM_STRING OemName,
2831 _Out_opt_ PBOOLEAN NameContainsSpaces
2832 );
2833
2834 NTSYSAPI
2835 NTSTATUS
2836 NTAPI
2837 RtlQueryEnvironmentVariable_U(
2838 _In_opt_ PWSTR Environment,
2839 _In_ PUNICODE_STRING Name,
2840 _Out_ PUNICODE_STRING Value
2841 );
2842
2843 VOID
2844 NTAPI
2845 RtlReleaseRelativeName(
2846 _In_ PRTL_RELATIVE_NAME_U RelativeName
2847 );
2848
2849 NTSYSAPI
2850 NTSTATUS
2851 NTAPI
2852 RtlSetCurrentDirectory_U(
2853 _In_ PUNICODE_STRING name
2854 );
2855
2856 NTSYSAPI
2857 NTSTATUS
2858 NTAPI
2859 RtlSetEnvironmentVariable(
2860 _In_z_ PWSTR *Environment,
2861 _In_ PUNICODE_STRING Name,
2862 _In_ PUNICODE_STRING Value
2863 );
2864
2865 //
2866 // Critical Section/Resource Functions
2867 //
2868 NTSYSAPI
2869 NTSTATUS
2870 NTAPI
2871 RtlDeleteCriticalSection (
2872 _In_ PRTL_CRITICAL_SECTION CriticalSection
2873 );
2874
2875 NTSYSAPI
2876 NTSTATUS
2877 NTAPI
2878 RtlEnterCriticalSection(
2879 _In_ PRTL_CRITICAL_SECTION CriticalSection
2880 );
2881
2882 NTSYSAPI
2883 NTSTATUS
2884 NTAPI
2885 RtlInitializeCriticalSection(
2886 _In_ PRTL_CRITICAL_SECTION CriticalSection
2887 );
2888
2889 NTSYSAPI
2890 NTSTATUS
2891 NTAPI
2892 RtlInitializeCriticalSectionAndSpinCount(
2893 _In_ PRTL_CRITICAL_SECTION CriticalSection,
2894 _In_ ULONG SpinCount
2895 );
2896
2897 NTSYSAPI
2898 NTSTATUS
2899 NTAPI
2900 RtlLeaveCriticalSection(
2901 _In_ PRTL_CRITICAL_SECTION CriticalSection
2902 );
2903
2904 NTSYSAPI
2905 BOOLEAN
2906 NTAPI
2907 RtlTryEnterCriticalSection(
2908 _In_ PRTL_CRITICAL_SECTION CriticalSection
2909 );
2910
2911 NTSYSAPI
2912 VOID
2913 NTAPI
2914 RtlpUnWaitCriticalSection(
2915 _In_ PRTL_CRITICAL_SECTION CriticalSection
2916 );
2917
2918 NTSYSAPI
2919 NTSTATUS
2920 NTAPI
2921 RtlpWaitForCriticalSection(
2922 _In_ PRTL_CRITICAL_SECTION CriticalSection
2923 );
2924
2925 NTSYSAPI
2926 BOOLEAN
2927 NTAPI
2928 RtlAcquireResourceExclusive(
2929 _In_ PRTL_RESOURCE Resource,
2930 _In_ BOOLEAN Wait
2931 );
2932
2933 NTSYSAPI
2934 BOOLEAN
2935 NTAPI
2936 RtlAcquireResourceShared(
2937 _In_ PRTL_RESOURCE Resource,
2938 _In_ BOOLEAN Wait
2939 );
2940
2941 NTSYSAPI
2942 VOID
2943 NTAPI
2944 RtlConvertExclusiveToShared(
2945 _In_ PRTL_RESOURCE Resource
2946 );
2947
2948 NTSYSAPI
2949 VOID
2950 NTAPI
2951 RtlConvertSharedToExclusive(
2952 _In_ PRTL_RESOURCE Resource
2953 );
2954
2955 NTSYSAPI
2956 VOID
2957 NTAPI
2958 RtlDeleteResource(
2959 _In_ PRTL_RESOURCE Resource
2960 );
2961
2962 NTSYSAPI
2963 VOID
2964 NTAPI
2965 RtlDumpResource(
2966 _In_ PRTL_RESOURCE Resource
2967 );
2968
2969 NTSYSAPI
2970 VOID
2971 NTAPI
2972 RtlInitializeResource(
2973 _In_ PRTL_RESOURCE Resource
2974 );
2975
2976 NTSYSAPI
2977 VOID
2978 NTAPI
2979 RtlReleaseResource(
2980 _In_ PRTL_RESOURCE Resource
2981 );
2982
2983 //
2984 // Compression Functions
2985 //
2986 NTSYSAPI //NT_RTL_COMPRESS_API
2987 NTSTATUS
2988 NTAPI
2989 RtlCompressBuffer(
2990 _In_ USHORT CompressionFormatAndEngine,
2991 _In_reads_bytes_(UncompressedBufferSize) PUCHAR UncompressedBuffer,
2992 _In_ ULONG UncompressedBufferSize,
2993 _Out_writes_bytes_to_(CompressedBufferSize, *FinalCompressedSize) PUCHAR CompressedBuffer,
2994 _In_ ULONG CompressedBufferSize,
2995 _In_ ULONG UncompressedChunkSize,
2996 _Out_ PULONG FinalCompressedSize,
2997 _In_ PVOID WorkSpace
2998 );
2999
3000 _IRQL_requires_max_(APC_LEVEL)
3001 NTSYSAPI //NT_RTL_COMPRESS_API
3002 NTSTATUS
3003 NTAPI
3004 RtlDecompressBuffer(
3005 _In_ USHORT CompressionFormat,
3006 _Out_writes_bytes_to_(UncompressedBufferSize, *FinalUncompressedSize) PUCHAR UncompressedBuffer,
3007 _In_ ULONG UncompressedBufferSize,
3008 _In_reads_bytes_(CompressedBufferSize) PUCHAR CompressedBuffer,
3009 _In_ ULONG CompressedBufferSize,
3010 _Out_ PULONG FinalUncompressedSize
3011 );
3012
3013 NTSYSAPI
3014 NTSTATUS
3015 NTAPI
3016 RtlGetCompressionWorkSpaceSize(
3017 _In_ USHORT CompressionFormatAndEngine,
3018 _Out_ PULONG CompressBufferWorkSpaceSize,
3019 _Out_ PULONG CompressFragmentWorkSpaceSize
3020 );
3021
3022 //
3023 // Debug Info Functions
3024 //
3025 NTSYSAPI
3026 PRTL_DEBUG_INFORMATION
3027 NTAPI
3028 RtlCreateQueryDebugBuffer(
3029 _In_ ULONG Size,
3030 _In_ BOOLEAN EventPair
3031 );
3032
3033 NTSYSAPI
3034 NTSTATUS
3035 NTAPI
3036 RtlDestroyQueryDebugBuffer(IN PRTL_DEBUG_INFORMATION DebugBuffer);
3037
3038 NTSYSAPI
3039 NTSTATUS
3040 NTAPI
3041 RtlQueryProcessDebugInformation(
3042 _In_ ULONG ProcessId,
3043 _In_ ULONG DebugInfoClassMask,
3044 _Inout_ PRTL_DEBUG_INFORMATION DebugBuffer
3045 );
3046
3047 //
3048 // Bitmap Functions
3049 //
3050 NTSYSAPI
3051 BOOLEAN
3052 NTAPI
3053 RtlAreBitsClear(
3054 _In_ PRTL_BITMAP BitMapHeader,
3055 _In_ ULONG StartingIndex,
3056 _In_ ULONG Length
3057 );
3058
3059 NTSYSAPI
3060 BOOLEAN
3061 NTAPI
3062 RtlAreBitsSet(
3063 _In_ PRTL_BITMAP BitMapHeader,
3064 _In_ ULONG StartingIndex,
3065 _In_ ULONG Length
3066 );
3067
3068 NTSYSAPI
3069 VOID
3070 NTAPI
3071 RtlClearAllBits(
3072 _In_ PRTL_BITMAP BitMapHeader
3073 );
3074
3075 NTSYSAPI
3076 VOID
3077 NTAPI
3078 RtlClearBits(
3079 _In_ PRTL_BITMAP BitMapHeader,
3080 _In_range_(0, BitMapHeader->SizeOfBitMap - NumberToClear) ULONG StartingIndex,
3081 _In_range_(0, BitMapHeader->SizeOfBitMap - StartingIndex) ULONG NumberToClear
3082 );
3083
3084 NTSYSAPI
3085 ULONG
3086 NTAPI
3087 RtlFindClearBits(
3088 _In_ PRTL_BITMAP BitMapHeader,
3089 _In_ ULONG NumberToFind,
3090 _In_ ULONG HintIndex
3091 );
3092
3093 NTSYSAPI
3094 ULONG
3095 NTAPI
3096 RtlFindClearBitsAndSet(
3097 _In_ PRTL_BITMAP BitMapHeader,
3098 _In_ ULONG NumberToFind,
3099 _In_ ULONG HintIndex
3100 );
3101
3102 NTSYSAPI
3103 CCHAR
3104 NTAPI
3105 RtlFindLeastSignificantBit(
3106 _In_ ULONGLONG Value
3107 );
3108
3109 NTSYSAPI
3110 CCHAR
3111 NTAPI
3112 RtlFindMostSignificantBit(
3113 _In_ ULONGLONG Value
3114 );
3115
3116 NTSYSAPI
3117 ULONG
3118 NTAPI
3119 RtlFindNextForwardRunClear(
3120 _In_ PRTL_BITMAP BitMapHeader,
3121 _In_ ULONG FromIndex,
3122 _Out_ PULONG StartingRunIndex
3123 );
3124
3125 NTSYSAPI
3126 ULONG
3127 NTAPI
3128 RtlFindNextForwardRunSet(
3129 _In_ PRTL_BITMAP BitMapHeader,
3130 _In_ ULONG FromIndex,
3131 _Out_ PULONG StartingRunIndex
3132 );
3133
3134 NTSYSAPI
3135 ULONG
3136 NTAPI
3137 RtlFindSetBits(
3138 _In_ PRTL_BITMAP BitMapHeader,
3139 _In_ ULONG NumberToFind,
3140 _In_ ULONG HintIndex
3141 );
3142
3143 NTSYSAPI
3144 ULONG
3145 NTAPI
3146 RtlFindSetBitsAndClear(
3147 _In_ PRTL_BITMAP BitMapHeader,
3148 _In_ ULONG NumberToFind,
3149 _In_ ULONG HintIndex
3150 );
3151
3152 #ifdef _REACTOS_ // ReactOS improvement
3153 _At_(BitMapHeader->SizeOfBitMap, _Post_equal_to_(SizeOfBitMap))
3154 _At_(BitMapHeader->Buffer, _Post_equal_to_(BitMapBuffer))
3155 #endif
3156 NTSYSAPI
3157 VOID
3158 NTAPI
3159 RtlInitializeBitMap(
3160 _Out_ PRTL_BITMAP BitMapHeader,
3161 _In_opt_ __drv_aliasesMem PULONG BitMapBuffer,
3162 _In_opt_ ULONG SizeOfBitMap
3163 );
3164
3165 NTSYSAPI
3166 ULONG
3167 NTAPI
3168 RtlNumberOfClearBits(
3169 _In_ PRTL_BITMAP BitMapHeader
3170 );
3171
3172 NTSYSAPI
3173 ULONG
3174 NTAPI
3175 RtlNumberOfSetBits(
3176 _In_ PRTL_BITMAP BitMapHeader
3177 );
3178
3179 NTSYSAPI
3180 VOID
3181 NTAPI
3182 RtlSetBit(
3183 _In_ PRTL_BITMAP BitMapHeader,
3184 _In_range_(<, BitMapHeader->SizeOfBitMap) ULONG BitNumber
3185 );
3186
3187 NTSYSAPI
3188 VOID
3189 NTAPI
3190 RtlSetBits(
3191 _In_ PRTL_BITMAP BitMapHeader,
3192 _In_range_(0, BitMapHeader->SizeOfBitMap - NumberToSet) ULONG StartingIndex,
3193 _In_range_(0, BitMapHeader->SizeOfBitMap - StartingIndex) ULONG NumberToSet
3194 );
3195
3196 NTSYSAPI
3197 VOID
3198 NTAPI
3199 RtlSetAllBits(
3200 _In_ PRTL_BITMAP BitMapHeader
3201 );
3202
3203 _Must_inspect_result_
3204 NTSYSAPI
3205 BOOLEAN
3206 NTAPI
3207 RtlTestBit(
3208 _In_ PRTL_BITMAP BitMapHeader,
3209 _In_range_(<, BitMapHeader->SizeOfBitMap) ULONG BitNumber
3210 );
3211
3212 //
3213 // Timer Functions
3214 //
3215 NTSYSAPI
3216 NTSTATUS
3217 NTAPI
3218 RtlCreateTimer(
3219 _In_ HANDLE TimerQueue,
3220 _In_ PHANDLE phNewTimer,
3221 _In_ WAITORTIMERCALLBACKFUNC Callback,
3222 _In_ PVOID Parameter,
3223 _In_ ULONG DueTime,
3224 _In_ ULONG Period,
3225 _In_ ULONG Flags
3226 );
3227
3228 NTSYSAPI
3229 NTSTATUS
3230 NTAPI
3231 RtlCreateTimerQueue(PHANDLE TimerQueue);
3232
3233 NTSYSAPI
3234 NTSTATUS
3235 NTAPI
3236 RtlDeleteTimer(
3237 _In_ HANDLE TimerQueue,
3238 _In_ HANDLE Timer,
3239 _In_ HANDLE CompletionEvent
3240 );
3241
3242 NTSYSAPI
3243 NTSTATUS
3244 NTAPI
3245 RtlUpdateTimer(
3246 _In_ HANDLE TimerQueue,
3247 _In_ HANDLE Timer,
3248 _In_ ULONG DueTime,
3249 _In_ ULONG Period
3250 );
3251
3252 NTSYSAPI
3253 NTSTATUS
3254 NTAPI
3255 RtlDeleteTimerQueueEx(
3256 _In_ HANDLE TimerQueue,
3257 _In_opt_ HANDLE CompletionEvent
3258 );
3259
3260 NTSYSAPI
3261 NTSTATUS
3262 NTAPI
3263 RtlDeleteTimerQueue(HANDLE TimerQueue);
3264
3265 //
3266 // SList functions
3267 //
3268 PSLIST_ENTRY
3269 FASTCALL
3270 InterlockedPushListSList(
3271 _Inout_ PSLIST_HEADER ListHead,
3272 _Inout_ __drv_aliasesMem PSLIST_ENTRY List,
3273 _Inout_ PSLIST_ENTRY ListEnd,
3274 _In_ ULONG Count
3275 );
3276
3277 //
3278 // Range List functions
3279 //
3280 NTSYSAPI
3281 VOID
3282 NTAPI
3283 RtlInitializeRangeList(
3284 _Inout_ PRTL_RANGE_LIST RangeList
3285 );
3286
3287 NTSYSAPI
3288 VOID
3289 NTAPI
3290 RtlFreeRangeList(
3291 _In_ PRTL_RANGE_LIST RangeList
3292 );
3293
3294 NTSYSAPI
3295 NTSTATUS
3296 NTAPI
3297 RtlAddRange(
3298 _Inout_ PRTL_RANGE_LIST RangeList,
3299 _In_ ULONGLONG Start,
3300 _In_ ULONGLONG End,
3301 _In_ UCHAR Attributes,
3302 _In_ ULONG Flags,
3303 _In_opt_ PVOID UserData,
3304 _In_opt_ PVOID Owner
3305 );
3306
3307 //
3308 // Debug Functions
3309 //
3310 ULONG
3311 __cdecl
3312 DbgPrint(
3313 _In_z_ _Printf_format_string_ PCSTR Format,
3314 ...
3315 );
3316
3317 NTSYSAPI
3318 ULONG
3319 __cdecl
3320 DbgPrintEx(
3321 _In_ ULONG ComponentId,
3322 _In_ ULONG Level,
3323 _In_z_ _Printf_format_string_ PCSTR Format,
3324 ...
3325 );
3326
3327 NTSYSAPI
3328 ULONG
3329 NTAPI
3330 DbgPrompt(
3331 _In_z_ PCCH Prompt,
3332 _Out_writes_bytes_(MaximumResponseLength) PCH Response,
3333 _In_ ULONG MaximumResponseLength
3334 );
3335
3336 #undef DbgBreakPoint
3337 VOID
3338 NTAPI
3339 DbgBreakPoint(
3340 VOID
3341 );
3342
3343 VOID
3344 NTAPI
3345 DbgLoadImageSymbols(
3346 _In_ PSTRING Name,
3347 _In_ PVOID Base,
3348 _In_ ULONG_PTR ProcessId
3349 );
3350
3351 VOID
3352 NTAPI
3353 DbgUnLoadImageSymbols(
3354 _In_ PSTRING Name,
3355 _In_ PVOID Base,
3356 _In_ ULONG_PTR ProcessId
3357 );
3358
3359 VOID
3360 NTAPI
3361 DbgCommandString(
3362 _In_ PCCH Name,
3363 _In_ PCCH Command
3364 );
3365
3366 //
3367 // Generic Table Functions
3368 //
3369 #if defined(NTOS_MODE_USER) || defined(_NTIFS_)
3370 NTSYSAPI
3371 PVOID
3372 NTAPI
3373 RtlInsertElementGenericTable(
3374 _In_ PRTL_GENERIC_TABLE Table,
3375 _In_reads_bytes_(BufferSize) PVOID Buffer,
3376 _In_ CLONG BufferSize,
3377 _Out_opt_ PBOOLEAN NewElement
3378 );
3379
3380 NTSYSAPI
3381 PVOID
3382 NTAPI
3383 RtlInsertElementGenericTableFull(
3384 _In_ PRTL_GENERIC_TABLE Table,
3385 _In_reads_bytes_(BufferSize) PVOID Buffer,
3386 _In_ CLONG BufferSize,
3387 _Out_opt_ PBOOLEAN NewElement,
3388 _In_ PVOID NodeOrParent,
3389 _In_ TABLE_SEARCH_RESULT SearchResult
3390 );
3391
3392 NTSYSAPI
3393 BOOLEAN
3394 NTAPI
3395 RtlIsGenericTableEmpty(
3396 _In_ PRTL_GENERIC_TABLE Table
3397 );
3398
3399 NTSYSAPI
3400 PVOID
3401 NTAPI
3402 RtlLookupElementGenericTableFull(
3403 _In_ PRTL_GENERIC_TABLE Table,
3404 _In_ PVOID Buffer,
3405 _Out_ PVOID *NodeOrParent,
3406 _Out_ TABLE_SEARCH_RESULT *SearchResult
3407 );
3408 #endif
3409
3410 //
3411 // Handle Table Functions
3412 //
3413 NTSYSAPI
3414 PRTL_HANDLE_TABLE_ENTRY
3415 NTAPI
3416 RtlAllocateHandle(
3417 _In_ PRTL_HANDLE_TABLE HandleTable,
3418 _Inout_ PULONG Index
3419 );
3420
3421 NTSYSAPI
3422 VOID
3423 NTAPI
3424 RtlDestroyHandleTable(
3425 _Inout_ PRTL_HANDLE_TABLE HandleTable);
3426
3427 NTSYSAPI
3428 BOOLEAN
3429 NTAPI
3430 RtlFreeHandle(
3431 _In_ PRTL_HANDLE_TABLE HandleTable,
3432 _In_ PRTL_HANDLE_TABLE_ENTRY Handle
3433 );
3434
3435 NTSYSAPI
3436 VOID
3437 NTAPI
3438 RtlInitializeHandleTable(
3439 _In_ ULONG TableSize,
3440 _In_ ULONG HandleSize,
3441 _In_ PRTL_HANDLE_TABLE HandleTable
3442 );
3443
3444 NTSYSAPI
3445 BOOLEAN
3446 NTAPI
3447 RtlIsValidHandle(
3448 _In_ PRTL_HANDLE_TABLE HandleTable,
3449 _In_ PRTL_HANDLE_TABLE_ENTRY Handle
3450 );
3451
3452 _Success_(return!=FALSE)
3453 NTSYSAPI
3454 BOOLEAN
3455 NTAPI
3456 RtlIsValidIndexHandle(
3457 _In_ PRTL_HANDLE_TABLE HandleTable,
3458 _In_ ULONG Index,
3459 _Out_ PRTL_HANDLE_TABLE_ENTRY *Handle
3460 );
3461
3462 //
3463 // PE Functions
3464 //
3465 NTSYSAPI
3466 NTSTATUS
3467 NTAPI
3468 RtlFindMessage(
3469 _In_ PVOID BaseAddress,
3470 _In_ ULONG Type,
3471 _In_ ULONG Language,
3472 _In_ ULONG MessageId,
3473 _Out_ PMESSAGE_RESOURCE_ENTRY *MessageResourceEntry
3474 );
3475
3476 NTSYSAPI
3477 ULONG
3478 NTAPI
3479 RtlGetNtGlobalFlags(VOID);
3480
3481 _Success_(return!=NULL)
3482 NTSYSAPI
3483 PVOID
3484 NTAPI
3485 RtlImageDirectoryEntryToData(
3486 _In_ PVOID BaseAddress,
3487 _In_ BOOLEAN MappedAsImage,
3488 _In_ USHORT Directory,
3489 _Out_ PULONG Size
3490 );
3491
3492 NTSYSAPI
3493 PVOID
3494 NTAPI
3495 RtlImageRvaToVa(
3496 _In_ PIMAGE_NT_HEADERS NtHeader,
3497 _In_ PVOID BaseAddress,
3498 _In_ ULONG Rva,
3499 _Inout_opt_ PIMAGE_SECTION_HEADER *SectionHeader
3500 );
3501
3502 NTSYSAPI
3503 PIMAGE_NT_HEADERS
3504 NTAPI
3505 RtlImageNtHeader(
3506 _In_ PVOID BaseAddress);
3507
3508 NTSYSAPI
3509 NTSTATUS
3510 NTAPI
3511 RtlImageNtHeaderEx(
3512 _In_ ULONG Flags,
3513 _In_ PVOID BaseAddress,
3514 _In_ ULONGLONG Size,
3515 _Out_ PIMAGE_NT_HEADERS *NtHeader
3516 );
3517
3518 NTSYSAPI
3519 PIMAGE_SECTION_HEADER
3520 NTAPI
3521 RtlImageRvaToSection(
3522 _In_ PIMAGE_NT_HEADERS NtHeader,
3523 _In_ PVOID BaseAddress,
3524 _In_ ULONG Rva
3525 );
3526
3527 NTSYSAPI
3528 ULONG
3529 NTAPI
3530 LdrRelocateImageWithBias(
3531 _In_ PVOID NewAddress,
3532 _In_ LONGLONG AdditionalBias,
3533 _In_ PCCH LoaderName,
3534 _In_ ULONG Success,
3535 _In_ ULONG Conflict,
3536 _In_ ULONG Invalid
3537 );
3538
3539 //
3540 // Activation Context Functions
3541 //
3542 #ifdef NTOS_MODE_USER
3543 NTSYSAPI
3544 NTSTATUS
3545 NTAPI
3546 RtlActivateActivationContextEx(
3547 _In_ ULONG Flags,
3548 _In_ PTEB Teb,
3549 _In_ PVOID Context,
3550 _Out_ PULONG_PTR Cookie
3551 );
3552
3553 NTSYSAPI
3554 NTSTATUS
3555 NTAPI
3556 RtlActivateActivationContext(
3557 _In_ ULONG Flags,
3558 _In_ HANDLE Handle,
3559 _Out_ PULONG_PTR Cookie
3560 );
3561
3562 NTSYSAPI
3563 VOID
3564 NTAPI
3565 RtlAddRefActivationContext(
3566 _In_ PVOID Context
3567 );
3568
3569 NTSYSAPI
3570 PRTL_ACTIVATION_CONTEXT_STACK_FRAME
3571 FASTCALL
3572 RtlActivateActivationContextUnsafeFast(
3573 _In_ PRTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED Frame,
3574 _In_ PVOID Context
3575 );
3576
3577 NTSYSAPI
3578 NTSTATUS
3579 NTAPI
3580 RtlAllocateActivationContextStack(
3581 _In_ PACTIVATION_CONTEXT_STACK *Stack
3582 );
3583
3584 NTSYSAPI
3585 NTSTATUS
3586 NTAPI
3587 RtlCreateActivationContext(
3588 _In_ ULONG Flags,
3589 _In_ PACTIVATION_CONTEXT_DATA ActivationContextData,
3590 _In_ ULONG ExtraBytes,
3591 _In_ PVOID NotificationRoutine,
3592 _In_ PVOID NotificationContext,
3593 _Out_ PACTIVATION_CONTEXT *ActCtx
3594 );
3595
3596 NTSYSAPI
3597 NTSTATUS
3598 NTAPI
3599 RtlGetActiveActivationContext(
3600 _In_ PVOID *Context
3601 );
3602
3603 NTSYSAPI
3604 VOID
3605 NTAPI
3606 RtlReleaseActivationContext(
3607 _In_ HANDLE handle
3608 );
3609
3610 NTSYSAPI
3611 NTSTATUS
3612 NTAPI
3613 RtlDeactivateActivationContext(
3614 _In_ ULONG dwFlags,
3615 _In_ ULONG_PTR ulCookie
3616 );
3617
3618 NTSYSAPI
3619 VOID
3620 NTAPI
3621 RtlFreeActivationContextStack(
3622 _In_ PACTIVATION_CONTEXT_STACK Stack
3623 );
3624
3625 NTSYSAPI
3626 VOID
3627 NTAPI
3628 RtlFreeThreadActivationContextStack(VOID);
3629
3630 NTSYSAPI
3631 PRTL_ACTIVATION_CONTEXT_STACK_FRAME
3632 FASTCALL
3633 RtlDeactivateActivationContextUnsafeFast(
3634 _In_ PRTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED Frame
3635 );
3636
3637 NTSYSAPI
3638 NTSTATUS
3639 NTAPI
3640 RtlDosApplyFileIsolationRedirection_Ustr(
3641 _In_ ULONG Flags,
3642 _In_ PUNICODE_STRING OriginalName,
3643 _In_ PUNICODE_STRING Extension,
3644 _Inout_ PUNICODE_STRING StaticString,
3645 _Inout_ PUNICODE_STRING DynamicString,
3646 _Inout_ PUNICODE_STRING *NewName,
3647 _In_ PULONG NewFlags,
3648 _In_ PSIZE_T FileNameSize,
3649 _In_ PSIZE_T RequiredLength
3650 );
3651
3652 NTSYSAPI
3653 NTSTATUS
3654 NTAPI
3655 RtlFindActivationContextSectionString(
3656 _In_ ULONG dwFlags,
3657 _In_ const GUID *ExtensionGuid,
3658 _In_ ULONG SectionType,
3659 _In_ const UNICODE_STRING *SectionName,
3660 _Inout_ PVOID ReturnedData
3661 );
3662
3663 NTSYSAPI
3664 NTSTATUS
3665 NTAPI
3666 RtlQueryInformationActivationContext(
3667 _In_ DWORD dwFlags,
3668 _In_opt_ PVOID Context,
3669 _In_opt_ PVOID pvSubInstance,
3670 _In_ ULONG ulInfoClass,
3671 _Out_bytecap_(cbBuffer) PVOID pvBuffer,
3672 _In_opt_ SIZE_T cbBuffer,
3673 _Out_opt_ SIZE_T *pcbWrittenOrRequired
3674 );
3675
3676 NTSYSAPI
3677 NTSTATUS
3678 NTAPI
3679 RtlQueryInformationActiveActivationContext(
3680 _In_ ULONG ulInfoClass,
3681 _Out_bytecap_(cbBuffer) PVOID pvBuffer,
3682 _In_opt_ SIZE_T cbBuffer,
3683 _Out_opt_ SIZE_T *pcbWrittenOrRequired
3684 );
3685
3686 NTSYSAPI
3687 NTSTATUS
3688 NTAPI
3689 RtlZombifyActivationContext(
3690 PVOID Context
3691 );
3692
3693 //
3694 // WOW64 Functions
3695 //
3696 NTSYSAPI
3697 NTSTATUS
3698 NTAPI
3699 RtlWow64EnableFsRedirection(
3700 _In_ BOOLEAN Wow64FsEnableRedirection
3701 );
3702
3703 NTSYSAPI
3704 NTSTATUS
3705 NTAPI
3706 RtlWow64EnableFsRedirectionEx(
3707 _In_ PVOID Wow64FsEnableRedirection,
3708 _Out_ PVOID *OldFsRedirectionLevel
3709 );
3710
3711 #endif
3712
3713 //
3714 // Registry Functions
3715 //
3716 _IRQL_requires_max_(PASSIVE_LEVEL)
3717 _Must_inspect_result_
3718 NTSYSAPI
3719 NTSTATUS
3720 NTAPI
3721 RtlCheckRegistryKey(
3722 _In_ ULONG RelativeTo,
3723 _In_ PWSTR Path
3724 );
3725
3726 NTSYSAPI
3727 NTSTATUS
3728 NTAPI
3729 RtlCreateRegistryKey(
3730 _In_ ULONG RelativeTo,
3731 _In_ PWSTR Path
3732 );
3733
3734 NTSYSAPI
3735 NTSTATUS
3736 NTAPI
3737 RtlFormatCurrentUserKeyPath(
3738 _Out_ _At_(KeyPath->Buffer, __drv_allocatesMem(Mem) _Post_bytecap_(KeyPath->MaximumLength) _Post_bytecount_(KeyPath->Length))
3739 PUNICODE_STRING KeyPath
3740 );
3741
3742 NTSYSAPI
3743 NTSTATUS
3744 NTAPI
3745 RtlOpenCurrentUser(
3746 _In_ ACCESS_MASK DesiredAccess,
3747 _Out_ PHANDLE KeyHandle
3748 );
3749
3750 _IRQL_requires_max_(PASSIVE_LEVEL)
3751 NTSYSAPI
3752 NTSTATUS
3753 NTAPI
3754 RtlQueryRegistryValues(
3755 _In_ ULONG RelativeTo,
3756 _In_ PCWSTR Path,
3757 _Inout_ _At_(*(*QueryTable).EntryContext, _Pre_unknown_)
3758 PRTL_QUERY_REGISTRY_TABLE QueryTable,
3759 _In_opt_ PVOID Context,
3760 _In_opt_ PVOID Environment
3761 );
3762
3763 _IRQL_requires_max_(PASSIVE_LEVEL)
3764 NTSYSAPI
3765 NTSTATUS
3766 NTAPI
3767 RtlWriteRegistryValue(
3768 _In_ ULONG RelativeTo,
3769 _In_ PCWSTR Path,
3770 _In_z_ PCWSTR ValueName,
3771 _In_ ULONG ValueType,
3772 _In_reads_bytes_opt_(ValueLength) PVOID ValueData,
3773 _In_ ULONG ValueLength
3774 );
3775
3776 #ifdef NTOS_MODE_USER
3777 NTSYSAPI
3778 NTSTATUS
3779 NTAPI
3780 RtlpNtCreateKey(
3781 _Out_ HANDLE KeyHandle,
3782 _In_ ACCESS_MASK DesiredAccess,
3783 _In_ POBJECT_ATTRIBUTES ObjectAttributes,
3784 _In_ ULONG TitleIndex,
3785 _In_ PUNICODE_STRING Class,
3786 _Out_ PULONG Disposition
3787 );
3788
3789 NTSYSAPI
3790 NTSTATUS
3791 NTAPI
3792 RtlpNtEnumerateSubKey(
3793 _In_ HANDLE KeyHandle,
3794 _Inout_ PUNICODE_STRING SubKeyName,
3795 _In_ ULONG Index,
3796 _In_ ULONG Unused
3797 );
3798
3799 NTSYSAPI
3800 NTSTATUS
3801 NTAPI
3802 RtlpNtMakeTemporaryKey(
3803 _In_ HANDLE KeyHandle
3804 );
3805
3806 NTSYSAPI
3807 NTSTATUS
3808 NTAPI
3809 RtlpNtOpenKey(
3810 _Out_ HANDLE KeyHandle,
3811 _In_ ACCESS_MASK DesiredAccess,
3812 _In_ POBJECT_ATTRIBUTES ObjectAttributes,
3813 _In_ ULONG Unused
3814 );
3815
3816 NTSYSAPI
3817 NTSTATUS
3818 NTAPI
3819 RtlpNtQueryValueKey(
3820 _In_ HANDLE KeyHandle,
3821 _Out_opt_ PULONG Type,
3822 _Out_opt_ PVOID Data,
3823 _Inout_opt_ PULONG DataLength,
3824 _In_ ULONG Unused
3825 );
3826
3827 NTSYSAPI
3828 NTSTATUS
3829 NTAPI
3830 RtlpNtSetValueKey(
3831 _In_ HANDLE KeyHandle,
3832 _In_ ULONG Type,
3833 _In_ PVOID Data,
3834 _In_ ULONG DataLength
3835 );
3836 #endif
3837
3838 //
3839 // NLS Functions
3840 //
3841 NTSYSAPI
3842 VOID
3843 NTAPI
3844 RtlGetDefaultCodePage(
3845 _Out_ PUSHORT AnsiCodePage,
3846 _Out_ PUSHORT OemCodePage
3847 );
3848
3849 NTSYSAPI
3850 VOID
3851 NTAPI
3852 RtlInitNlsTables(
3853 _In_ PUSHORT AnsiTableBase,
3854 _In_ PUSHORT OemTableBase,
3855 _In_ PUSHORT CaseTableBase,
3856 _Out_ PNLSTABLEINFO NlsTable
3857 );
3858
3859 _IRQL_requires_max_(PASSIVE_LEVEL)
3860 NTSYSAPI
3861 VOID
3862 NTAPI
3863 RtlInitCodePageTable(
3864 _In_ PUSHORT TableBase,
3865 _Out_ PCPTABLEINFO CodePageTable
3866 );
3867
3868 NTSYSAPI
3869 VOID
3870 NTAPI
3871 RtlResetRtlTranslations(
3872 _In_ PNLSTABLEINFO NlsTable);
3873
3874 #if defined(NTOS_MODE_USER) && !defined(NO_RTL_INLINES)
3875
3876 //
3877 // Misc conversion functions
3878 //
3879 static __inline
3880 LARGE_INTEGER
3881 NTAPI_INLINE
3882 RtlConvertLongToLargeInteger(
3883 _In_ LONG SignedInteger
3884 )
3885 {
3886 LARGE_INTEGER Result;
3887
3888 Result.QuadPart = SignedInteger;
3889 return Result;
3890 }
3891
3892 static __inline
3893 LARGE_INTEGER
3894 NTAPI_INLINE
3895 RtlEnlargedIntegerMultiply(
3896 _In_ LONG Multiplicand,
3897 _In_ LONG Multiplier
3898 )
3899 {
3900 LARGE_INTEGER Product;
3901
3902 Product.QuadPart = (LONGLONG)Multiplicand * (ULONGLONG)Multiplier;
3903 return Product;
3904 }
3905
3906 static __inline
3907 ULONG
3908 NTAPI_INLINE
3909 RtlEnlargedUnsignedDivide(
3910 _In_ ULARGE_INTEGER Dividend,
3911 _In_ ULONG Divisor,
3912 _In_opt_ PULONG Remainder
3913 )
3914 {
3915 ULONG Quotient;
3916
3917 Quotient = (ULONG)(Dividend.QuadPart / Divisor);
3918 if (Remainder) {
3919 *Remainder = (ULONG)(Dividend.QuadPart % Divisor);
3920 }
3921
3922 return Quotient;
3923 }
3924
3925 static __inline
3926 LARGE_INTEGER
3927 NTAPI_INLINE
3928 RtlEnlargedUnsignedMultiply(
3929 _In_ ULONG Multiplicand,
3930 _In_ ULONG Multiplier
3931 )
3932 {
3933 LARGE_INTEGER Product;
3934
3935 Product.QuadPart = (ULONGLONG)Multiplicand * (ULONGLONG)Multiplier;
3936 return Product;
3937 }
3938
3939 #if defined(_AMD64_) || defined(_IA64_)
3940 static __inline
3941 LARGE_INTEGER
3942 NTAPI_INLINE
3943 RtlExtendedLargeIntegerDivide(
3944 _In_ LARGE_INTEGER Dividend,
3945 _In_ ULONG Divisor,
3946 _Out_opt_ PULONG Remainder)
3947 {
3948 LARGE_INTEGER ret;
3949 ret.QuadPart = (ULONG64)Dividend.QuadPart / Divisor;
3950 if (Remainder)
3951 *Remainder = (ULONG)(Dividend.QuadPart % Divisor);
3952 return ret;
3953 }
3954
3955 #else
3956 NTSYSAPI
3957 LARGE_INTEGER
3958 NTAPI
3959 RtlExtendedLargeIntegerDivide(
3960 _In_ LARGE_INTEGER Dividend,
3961 _In_ ULONG Divisor,
3962 _Out_opt_ PULONG Remainder
3963 );
3964
3965 #endif /* defined(_AMD64_) || defined(_IA64_) */
3966
3967 #endif
3968
3969
3970 NTSYSAPI
3971 ULONG
3972 NTAPI
3973 RtlUniform(
3974 _In_ PULONG Seed
3975 );
3976
3977 NTSYSAPI
3978 ULONG
3979 NTAPI
3980 RtlRandom(
3981 _Inout_ PULONG Seed
3982 );
3983
3984 NTSYSAPI
3985 ULONG
3986 NTAPI
3987 RtlComputeCrc32(
3988 _In_ ULONG InitialCrc,
3989 _In_ PUCHAR Buffer,
3990 _In_ ULONG Length
3991 );
3992
3993 //
3994 // Network Functions
3995 //
3996 NTSYSAPI
3997 NTSTATUS
3998 NTAPI
3999 RtlIpv4StringToAddressA(
4000 _In_ PCSTR String,
4001 _In_ BOOLEAN Strict,
4002 _Out_ PCSTR *Terminator,
4003 _Out_ struct in_addr *Addr
4004 );
4005
4006 NTSYSAPI
4007 NTSTATUS
4008 NTAPI
4009 RtlIpv4StringToAddressW(
4010 _In_ PCWSTR String,
4011 _In_ BOOLEAN Strict,
4012 _Out_ PCWSTR *Terminator,
4013 _Out_ struct in_addr *Addr
4014 );
4015
4016 NTSYSAPI
4017 NTSTATUS
4018 NTAPI
4019 RtlIpv4StringToAddressExA(
4020 _In_ PCSTR AddressString,
4021 _In_ BOOLEAN Strict,
4022 _Out_ struct in_addr *Address,
4023 _Out_ PUSHORT Port
4024 );
4025
4026 NTSYSAPI
4027 NTSTATUS
4028 NTAPI
4029 RtlIpv4StringToAddressExW(
4030 _In_ PCWSTR AddressString,
4031 _In_ BOOLEAN Strict,
4032 _Out_ struct in_addr *Address,
4033 _Out_ PUSHORT Port
4034 );
4035
4036 NTSYSAPI
4037 NTSTATUS
4038 NTAPI
4039 RtlIpv6StringToAddressA(
4040 _In_ PCHAR Name,
4041 _Out_ PCHAR *Terminator,
4042 _Out_ struct in6_addr *Addr
4043 );
4044
4045 NTSYSAPI
4046 NTSTATUS
4047 NTAPI
4048 RtlIpv6StringToAddressW(
4049 _In_ PWCHAR Name,
4050 _Out_ PCHAR *Terminator,
4051 _Out_ struct in6_addr *Addr
4052 );
4053
4054 NTSYSAPI
4055 NTSTATUS
4056 NTAPI
4057 RtlIpv6StringToAddressExA(
4058 _In_ PCHAR AddressString,
4059 _In_ struct in6_addr *Address,
4060 _In_ PULONG ScopeId,
4061 _In_ PUSHORT Port
4062 );
4063
4064 NTSYSAPI
4065 NTSTATUS
4066 NTAPI
4067 RtlIpv6StringToAddressExW(
4068 _In_ PWCHAR AddressName,
4069 _In_ struct in6_addr *Address,
4070 _In_ PULONG ScopeId,
4071 _In_ PUSHORT Port
4072 );
4073
4074
4075 //
4076 // Time Functions
4077 //
4078 NTSYSAPI
4079 NTSTATUS
4080 NTAPI
4081 RtlQueryTimeZoneInformation(
4082 _Out_ PRTL_TIME_ZONE_INFORMATION TimeZoneInformation);
4083
4084 NTSYSAPI
4085 VOID
4086 NTAPI
4087 RtlSecondsSince1970ToTime(
4088 _In_ ULONG SecondsSince1970,
4089 _Out_ PLARGE_INTEGER Time
4090 );
4091
4092 NTSYSAPI
4093 NTSTATUS
4094 NTAPI
4095 RtlSetTimeZoneInformation(
4096 _In_ PRTL_TIME_ZONE_INFORMATION TimeZoneInformation);
4097
4098 _Success_(return!=FALSE)
4099 _Must_inspect_result_
4100 NTSYSAPI
4101 BOOLEAN
4102 NTAPI
4103 RtlTimeFieldsToTime(
4104 _In_ PTIME_FIELDS TimeFields,
4105 _Out_ PLARGE_INTEGER Time
4106 );
4107
4108 _Success_(return != 0)
4109 _Must_inspect_result_
4110 NTSYSAPI
4111 BOOLEAN
4112 NTAPI
4113 RtlTimeToSecondsSince1970(
4114 _In_ PLARGE_INTEGER Time,
4115 _Out_ PULONG ElapsedSeconds
4116 );
4117
4118 NTSYSAPI
4119 VOID
4120 NTAPI
4121 RtlTimeToTimeFields(
4122 PLARGE_INTEGER Time,
4123 PTIME_FIELDS TimeFields
4124 );
4125
4126 NTSYSAPI
4127 NTSTATUS
4128 NTAPI
4129 RtlSystemTimeToLocalTime(
4130 _In_ PLARGE_INTEGER SystemTime,
4131 _Out_ PLARGE_INTEGER LocalTime
4132 );
4133
4134 //
4135 // Version Functions
4136 //
4137 _IRQL_requires_max_(PASSIVE_LEVEL)
4138 _Must_inspect_result_
4139 NTSYSAPI
4140 NTSTATUS
4141 NTAPI
4142 RtlVerifyVersionInfo(
4143 _In_ PRTL_OSVERSIONINFOEXW VersionInfo,
4144 _In_ ULONG TypeMask,
4145 _In_ ULONGLONG ConditionMask
4146 );
4147
4148 _IRQL_requires_max_(PASSIVE_LEVEL)
4149 NTSYSAPI
4150 NTSTATUS
4151 NTAPI
4152 RtlGetVersion(
4153 _Out_
4154 _At_(lpVersionInformation->dwOSVersionInfoSize, _Pre_ _Valid_)
4155 _When_(lpVersionInformation->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOEXW),
4156 _At_((PRTL_OSVERSIONINFOEXW)lpVersionInformation, _Out_))
4157 PRTL_OSVERSIONINFOW lpVersionInformation
4158 );
4159
4160 NTSYSAPI
4161 BOOLEAN
4162 NTAPI
4163 RtlGetNtProductType(OUT PNT_PRODUCT_TYPE ProductType);
4164
4165 //
4166 // Secure Memory Functions
4167 //
4168 #ifdef NTOS_MODE_USER
4169 NTSYSAPI
4170 NTSTATUS
4171 NTAPI
4172 RtlRegisterSecureMemoryCacheCallback(
4173 _In_ PRTL_SECURE_MEMORY_CACHE_CALLBACK Callback);
4174
4175 NTSYSAPI
4176 BOOLEAN
4177 NTAPI
4178 RtlFlushSecureMemoryCache(
4179 _In_ PVOID MemoryCache,
4180 _In_opt_ SIZE_T MemoryLength
4181 );
4182 #endif
4183
4184 //
4185 // Boot Status Data Functions
4186 //
4187 #ifdef NTOS_MODE_USER
4188 NTSYSAPI
4189 NTSTATUS
4190 NTAPI
4191 RtlCreateBootStatusDataFile(
4192 VOID
4193 );
4194
4195 NTSYSAPI
4196 NTSTATUS
4197 NTAPI
4198 RtlGetSetBootStatusData(
4199 _In_ HANDLE FileHandle,
4200 _In_ BOOLEAN WriteMode,
4201 _In_ RTL_BSD_ITEM_TYPE DataClass,
4202 _In_ PVOID Buffer,
4203 _In_ ULONG BufferSize,
4204 _Out_opt_ PULONG ReturnLength
4205 );
4206
4207 NTSYSAPI
4208 NTSTATUS
4209 NTAPI
4210 RtlLockBootStatusData(
4211 _Out_ PHANDLE FileHandle
4212 );
4213
4214 NTSYSAPI
4215 NTSTATUS
4216 NTAPI
4217 RtlUnlockBootStatusData(
4218 _In_ HANDLE FileHandle
4219 );
4220 #endif
4221
4222 #ifdef NTOS_MODE_USER
4223 _Must_inspect_result_
4224 NTSYSAPI
4225 NTSTATUS
4226 NTAPI
4227 RtlGUIDFromString(
4228 _In_ PUNICODE_STRING GuidString,
4229 _Out_ GUID *Guid);
4230
4231 _Must_inspect_result_
4232 NTSYSAPI
4233 NTSTATUS
4234 NTAPI
4235 RtlStringFromGUID(
4236 _In_ REFGUID Guid,
4237 _Out_ _At_(GuidString->Buffer, __drv_allocatesMem(Mem))
4238 PUNICODE_STRING GuidString);
4239
4240 NTSYSAPI
4241 NTSTATUS
4242 NTAPI
4243 RtlComputeImportTableHash(
4244 _In_ HANDLE hFile,
4245 _Out_ PCHAR Hash,
4246 _In_ ULONG ImportTableHashRevision
4247 );
4248 #endif
4249
4250 //
4251 // MemoryStream functions
4252 //
4253 #ifdef NTOS_MODE_USER
4254
4255 NTSYSAPI
4256 VOID
4257 NTAPI
4258 RtlInitMemoryStream(
4259 _Out_ PRTL_MEMORY_STREAM Stream
4260 );
4261
4262 NTSYSAPI
4263 VOID
4264 NTAPI
4265 RtlInitOutOfProcessMemoryStream(
4266 _Out_ PRTL_MEMORY_STREAM Stream
4267 );
4268
4269 NTSYSAPI
4270 VOID
4271 NTAPI
4272 RtlFinalReleaseOutOfProcessMemoryStream(
4273 _In_ PRTL_MEMORY_STREAM Stream
4274 );
4275
4276 NTSYSAPI
4277 HRESULT
4278 NTAPI
4279 RtlQueryInterfaceMemoryStream(
4280 _In_ struct IStream *This,
4281 _In_ REFIID RequestedIid,
4282 _Outptr_ PVOID *ResultObject
4283 );
4284
4285 NTSYSAPI
4286 ULONG
4287 NTAPI
4288 RtlAddRefMemoryStream(
4289 _In_ struct IStream *This
4290 );
4291
4292 NTSYSAPI
4293 ULONG
4294 NTAPI
4295 RtlReleaseMemoryStream(
4296 _In_ struct IStream *This
4297 );
4298
4299 NTSYSAPI
4300 HRESULT
4301 NTAPI
4302 RtlReadMemoryStream(
4303 _In_ struct IStream *This,
4304 _Out_writes_bytes_(Length) PVOID Buffer,
4305 _In_ ULONG Length,
4306 _Out_opt_ PULONG BytesRead
4307 );
4308
4309 NTSYSAPI
4310 HRESULT
4311 NTAPI
4312 RtlReadOutOfProcessMemoryStream(
4313 _In_ struct IStream *This,
4314 _Out_writes_bytes_(Length) PVOID Buffer,
4315 _In_ ULONG Length,
4316 _Out_opt_ PULONG BytesRead
4317 );
4318
4319 NTSYSAPI
4320 HRESULT
4321 NTAPI
4322 RtlSeekMemoryStream(
4323 _In_ struct IStream *This,
4324 _In_ LARGE_INTEGER RelativeOffset,
4325 _In_ ULONG Origin,
4326 _Out_opt_ PULARGE_INTEGER ResultOffset
4327 );
4328
4329 NTSYSAPI
4330 HRESULT
4331 NTAPI
4332 RtlCopyMemoryStreamTo(
4333 _In_ struct IStream *This,
4334 _In_ struct IStream *Target,
4335 _In_ ULARGE_INTEGER Length,
4336 _Out_opt_ PULARGE_INTEGER BytesRead,
4337 _Out_opt_ PULARGE_INTEGER BytesWritten
4338 );
4339
4340 NTSYSAPI
4341 HRESULT
4342 NTAPI
4343 RtlCopyOutOfProcessMemoryStreamTo(
4344 _In_ struct IStream *This,
4345 _In_ struct IStream *Target,
4346 _In_ ULARGE_INTEGER Length,
4347 _Out_opt_ PULARGE_INTEGER BytesRead,
4348 _Out_opt_ PULARGE_INTEGER BytesWritten
4349 );
4350
4351 NTSYSAPI
4352 HRESULT
4353 NTAPI
4354 RtlStatMemoryStream(
4355 _In_ struct IStream *This,
4356 _Out_ struct tagSTATSTG *Stats,
4357 _In_ ULONG Flags
4358 );
4359
4360 // Dummy functions
4361 NTSYSAPI
4362 HRESULT
4363 NTAPI
4364 RtlWriteMemoryStream(
4365 _In_ struct IStream *This,
4366 _In_reads_bytes_(Length) CONST VOID *Buffer,
4367 _In_ ULONG Length,
4368 _Out_opt_ PULONG BytesWritten
4369 );
4370
4371 NTSYSAPI
4372 HRESULT
4373 NTAPI
4374 RtlSetMemoryStreamSize(
4375 _In_ struct IStream *This,
4376 _In_ ULARGE_INTEGER NewSize
4377 );
4378
4379 NTSYSAPI
4380 HRESULT
4381 NTAPI
4382 RtlCommitMemoryStream(
4383 _In_ struct IStream *This,
4384 _In_ ULONG CommitFlags
4385 );
4386
4387 NTSYSAPI
4388 HRESULT
4389 NTAPI
4390 RtlRevertMemoryStream(
4391 _In_ struct IStream *This
4392 );
4393
4394 NTSYSAPI
4395 HRESULT
4396 NTAPI
4397 RtlLockMemoryStreamRegion(
4398 _In_ struct IStream *This,
4399 _In_ ULARGE_INTEGER Offset,
4400 _In_ ULARGE_INTEGER Length,
4401 _In_ ULONG LockType
4402 );
4403
4404 NTSYSAPI
4405 HRESULT
4406 NTAPI
4407 RtlUnlockMemoryStreamRegion(
4408 _In_ struct IStream *This,
4409 _In_ ULARGE_INTEGER Offset,
4410 _In_ ULARGE_INTEGER Length,
4411 _In_ ULONG LockType
4412 );
4413
4414 NTSYSAPI
4415 HRESULT
4416 NTAPI
4417 RtlCloneMemoryStream(
4418 _In_ struct IStream *This,
4419 _Outptr_ struct IStream **ResultStream
4420 );
4421
4422 #endif // NTOS_MODE_USER
4423
4424 NTSYSAPI
4425 NTSTATUS
4426 NTAPI
4427 RtlFindActivationContextSectionGuid(
4428 ULONG flags,
4429 const GUID *extguid,
4430 ULONG section_kind,
4431 const GUID *guid,
4432 void *ptr
4433 );
4434
4435 #ifdef __cplusplus
4436 }
4437 #endif
4438
4439 #endif