[NDK] Add SAL 2 annotations, use dummy annotations, if no SAL is available
[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 #endif /* NTOS_MODE_USER */
612
613 //
614 // Error and Exception Functions
615 //
616 NTSYSAPI
617 PVOID
618 NTAPI
619 RtlAddVectoredExceptionHandler(
620 _In_ ULONG FirstHandler,
621 _In_ PVECTORED_EXCEPTION_HANDLER VectoredHandler
622 );
623
624 __analysis_noreturn
625 NTSYSAPI
626 VOID
627 NTAPI
628 RtlAssert(
629 _In_ PVOID FailedAssertion,
630 _In_ PVOID FileName,
631 _In_ ULONG LineNumber,
632 _In_opt_z_ PCHAR Message
633 );
634
635 NTSYSAPI
636 VOID
637 NTAPI
638 RtlSetUnhandledExceptionFilter(
639 _In_ PRTLP_UNHANDLED_EXCEPTION_FILTER TopLevelExceptionFilter
640 );
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 _Out_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_opt_ PVOID HeapInformation,
883 _In_opt_ SIZE_T HeapInformationLength,
884 _Out_opt_ PSIZE_T ReturnLength
885 );
886
887 _Ret_opt_z_
888 NTSYSAPI
889 PWSTR
890 NTAPI
891 RtlQueryTagHeap(
892 _In_ PVOID HeapHandle,
893 _In_ ULONG Flags,
894 _In_ USHORT TagIndex,
895 _In_ BOOLEAN ResetCounters,
896 _Out_ PRTL_HEAP_TAG_INFO HeapTagInfo
897 );
898
899 _Must_inspect_result_
900 _Ret_maybenull_
901 _Post_writable_byte_size_(Size)
902 NTSYSAPI
903 PVOID
904 NTAPI
905 RtlReAllocateHeap(
906 _In_ HANDLE Heap,
907 _In_opt_ ULONG Flags,
908 _In_ _Post_invalid_ PVOID Ptr,
909 _In_ SIZE_T Size
910 );
911
912 _Success_(return != 0)
913 NTSYSAPI
914 NTSTATUS
915 NTAPI
916 RtlSetHeapInformation (
917 _In_ PVOID HeapHandle,
918 _In_ HEAP_INFORMATION_CLASS HeapInformationClass,
919 _In_opt_ PVOID HeapInformation,
920 _In_opt_ 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_ 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 NTSYSAPI
1472 NTSTATUS
1473 NTAPI
1474 RtlSelfRelativeToAbsoluteSD(
1475 _In_ PSECURITY_DESCRIPTOR SelfRelativeSD,
1476 _Out_ PSECURITY_DESCRIPTOR AbsoluteSD,
1477 _In_ PULONG AbsoluteSDSize,
1478 _In_ PACL Dacl,
1479 _In_ PULONG DaclSize,
1480 _In_ PACL Sacl,
1481 _In_ PULONG SaclSize,
1482 _In_ PSID Owner,
1483 _In_ PULONG OwnerSize,
1484 _In_ PSID PrimaryGroup,
1485 _In_ PULONG PrimaryGroupSize
1486 );
1487
1488 NTSYSAPI
1489 NTSTATUS
1490 NTAPI
1491 RtlSelfRelativeToAbsoluteSD2(
1492 _Inout_ PSECURITY_DESCRIPTOR SelfRelativeSD,
1493 _Out_ PULONG BufferSize
1494 );
1495
1496 NTSYSAPI
1497 NTSTATUS
1498 NTAPI
1499 RtlSetAttributesSecurityDescriptor(
1500 _Inout_ PSECURITY_DESCRIPTOR SecurityDescriptor,
1501 _In_ SECURITY_DESCRIPTOR_CONTROL Control,
1502 _Out_ PULONG Revision
1503 );
1504
1505 NTSYSAPI
1506 NTSTATUS
1507 NTAPI
1508 RtlSetControlSecurityDescriptor(
1509 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,
1510 _In_ SECURITY_DESCRIPTOR_CONTROL ControlBitsOfInterest,
1511 _In_ SECURITY_DESCRIPTOR_CONTROL ControlBitsToSet
1512 );
1513
1514 _IRQL_requires_max_(APC_LEVEL)
1515 NTSYSAPI
1516 NTSTATUS
1517 NTAPI
1518 RtlSetDaclSecurityDescriptor(
1519 _Inout_ PSECURITY_DESCRIPTOR SecurityDescriptor,
1520 _In_ BOOLEAN DaclPresent,
1521 _In_opt_ PACL Dacl,
1522 _In_opt_ BOOLEAN DaclDefaulted
1523 );
1524
1525 NTSYSAPI
1526 NTSTATUS
1527 NTAPI
1528 RtlSetGroupSecurityDescriptor(
1529 _Inout_ PSECURITY_DESCRIPTOR SecurityDescriptor,
1530 _In_ PSID Group,
1531 _In_ BOOLEAN GroupDefaulted
1532 );
1533
1534 #ifdef NTOS_MODE_USER
1535
1536 NTSYSAPI
1537 NTSTATUS
1538 NTAPI
1539 RtlSetInformationAcl(
1540 PACL Acl,
1541 PVOID Information,
1542 ULONG InformationLength,
1543 ACL_INFORMATION_CLASS InformationClass
1544 );
1545
1546 #endif
1547
1548 _IRQL_requires_max_(APC_LEVEL)
1549 NTSYSAPI
1550 NTSTATUS
1551 NTAPI
1552 RtlSetOwnerSecurityDescriptor(
1553 _Inout_ PSECURITY_DESCRIPTOR SecurityDescriptor,
1554 _In_opt_ PSID Owner,
1555 _In_opt_ BOOLEAN OwnerDefaulted
1556 );
1557
1558 NTSYSAPI
1559 NTSTATUS
1560 NTAPI
1561 RtlSetSaclSecurityDescriptor(
1562 _Inout_ PSECURITY_DESCRIPTOR SecurityDescriptor,
1563 _In_ BOOLEAN SaclPresent,
1564 _In_ PACL Sacl,
1565 _In_ BOOLEAN SaclDefaulted
1566 );
1567
1568 NTSYSAPI
1569 VOID
1570 NTAPI
1571 RtlSetSecurityDescriptorRMControl(
1572 _Inout_ PSECURITY_DESCRIPTOR SecurityDescriptor,
1573 _In_ PUCHAR RMControl
1574 );
1575
1576 NTSYSAPI
1577 PUCHAR
1578 NTAPI
1579 RtlSubAuthorityCountSid(
1580 _In_ PSID Sid
1581 );
1582
1583 NTSYSAPI
1584 PULONG
1585 NTAPI
1586 RtlSubAuthoritySid(
1587 _In_ PSID Sid,
1588 _In_ ULONG SubAuthority
1589 );
1590
1591 _IRQL_requires_max_(APC_LEVEL)
1592 _Must_inspect_result_
1593 NTSYSAPI
1594 BOOLEAN
1595 NTAPI
1596 RtlValidRelativeSecurityDescriptor(
1597 _In_reads_bytes_(SecurityDescriptorLength) PSECURITY_DESCRIPTOR SecurityDescriptorInput,
1598 _In_ ULONG SecurityDescriptorLength,
1599 _In_ SECURITY_INFORMATION RequiredInformation
1600 );
1601
1602 NTSYSAPI
1603 BOOLEAN
1604 NTAPI
1605 RtlValidSecurityDescriptor(IN PSECURITY_DESCRIPTOR SecurityDescriptor);
1606
1607 NTSYSAPI
1608 BOOLEAN
1609 NTAPI
1610 RtlValidSid(IN PSID Sid);
1611
1612 NTSYSAPI
1613 BOOLEAN
1614 NTAPI
1615 RtlValidAcl(PACL Acl);
1616
1617 NTSYSAPI
1618 NTSTATUS
1619 NTAPI
1620 RtlDeleteSecurityObject(
1621 _In_ PSECURITY_DESCRIPTOR *ObjectDescriptor
1622 );
1623
1624 NTSYSAPI
1625 NTSTATUS
1626 NTAPI
1627 RtlNewSecurityObject(
1628 _In_ PSECURITY_DESCRIPTOR ParentDescriptor,
1629 _In_ PSECURITY_DESCRIPTOR CreatorDescriptor,
1630 _Out_ PSECURITY_DESCRIPTOR *NewDescriptor,
1631 _In_ BOOLEAN IsDirectoryObject,
1632 _In_ HANDLE Token,
1633 _In_ PGENERIC_MAPPING GenericMapping
1634 );
1635
1636 NTSYSAPI
1637 NTSTATUS
1638 NTAPI
1639 RtlQuerySecurityObject(
1640 _In_ PSECURITY_DESCRIPTOR ObjectDescriptor,
1641 _In_ SECURITY_INFORMATION SecurityInformation,
1642 _Out_ PSECURITY_DESCRIPTOR ResultantDescriptor,
1643 _In_ ULONG DescriptorLength,
1644 _Out_ PULONG ReturnLength
1645 );
1646
1647 NTSYSAPI
1648 NTSTATUS
1649 NTAPI
1650 RtlSetSecurityObject(
1651 _In_ SECURITY_INFORMATION SecurityInformation,
1652 _In_ PSECURITY_DESCRIPTOR ModificationDescriptor,
1653 _Out_ PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor,
1654 _In_ PGENERIC_MAPPING GenericMapping,
1655 _In_ HANDLE Token
1656 );
1657
1658 //
1659 // Single-Character Functions
1660 //
1661 NTSYSAPI
1662 NTSTATUS
1663 NTAPI
1664 RtlLargeIntegerToChar(
1665 _In_ PLARGE_INTEGER Value,
1666 _In_ ULONG Base,
1667 _In_ ULONG Length,
1668 _Inout_ PCHAR String
1669 );
1670
1671 NTSYSAPI
1672 CHAR
1673 NTAPI
1674 RtlUpperChar(CHAR Source);
1675
1676 NTSYSAPI
1677 WCHAR
1678 NTAPI
1679 RtlUpcaseUnicodeChar(WCHAR Source);
1680
1681 NTSYSAPI
1682 WCHAR
1683 NTAPI
1684 RtlDowncaseUnicodeChar(IN WCHAR Source);
1685
1686 NTSYSAPI
1687 NTSTATUS
1688 NTAPI
1689 RtlIntegerToChar(
1690 _In_ ULONG Value,
1691 _In_ ULONG Base,
1692 _In_ ULONG Length,
1693 _Inout_ PCHAR String
1694 );
1695
1696 NTSYSAPI
1697 NTSTATUS
1698 NTAPI
1699 RtlIntegerToUnicode(
1700 _In_ ULONG Value,
1701 _In_opt_ ULONG Base,
1702 _In_opt_ ULONG Length,
1703 _Inout_ LPWSTR String
1704 );
1705
1706 _IRQL_requires_max_(PASSIVE_LEVEL)
1707 _At_(String->MaximumLength, _Const_)
1708 NTSYSAPI
1709 NTSTATUS
1710 NTAPI
1711 RtlIntegerToUnicodeString(
1712 _In_ ULONG Value,
1713 _In_opt_ ULONG Base,
1714 _Inout_ PUNICODE_STRING String
1715 );
1716
1717 NTSYSAPI
1718 NTSTATUS
1719 NTAPI
1720 RtlCharToInteger(
1721 PCSZ String,
1722 ULONG Base,
1723 PULONG Value
1724 );
1725
1726 //
1727 // Byte Swap Functions
1728 //
1729 #ifdef NTOS_MODE_USER
1730
1731 #if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037)) || \
1732 ((defined(_M_AMD64) || \
1733 defined(_M_IA64)) && (_MSC_FULL_VER > 13009175))
1734
1735 unsigned short __cdecl _byteswap_ushort(unsigned short);
1736 unsigned long __cdecl _byteswap_ulong (unsigned long);
1737 unsigned __int64 __cdecl _byteswap_uint64(unsigned __int64);
1738 #pragma intrinsic(_byteswap_ushort)
1739 #pragma intrinsic(_byteswap_ulong)
1740 #pragma intrinsic(_byteswap_uint64)
1741 #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
1742 #define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
1743 #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
1744
1745 #elif defined (__GNUC__)
1746
1747 #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
1748 #define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
1749 #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
1750
1751 #else
1752
1753 #if (NTDDI_VERSION >= NTDDI_WIN2K)
1754 NTSYSAPI
1755 USHORT
1756 FASTCALL
1757 RtlUshortByteSwap(IN USHORT Source);
1758
1759 NTSYSAPI
1760 ULONG
1761 FASTCALL
1762 RtlUlongByteSwap(IN ULONG Source);
1763
1764 NTSYSAPI
1765 ULONGLONG
1766 FASTCALL
1767 RtlUlonglongByteSwap(IN ULONGLONG Source);
1768 #endif
1769
1770 #endif
1771 #endif // NTOS_MODE_USER
1772
1773 //
1774 // Unicode->Ansi String Functions
1775 //
1776 NTSYSAPI
1777 ULONG
1778 NTAPI
1779 RtlxUnicodeStringToAnsiSize(IN PCUNICODE_STRING UnicodeString);
1780
1781 #ifdef NTOS_MODE_USER
1782
1783 #define RtlUnicodeStringToAnsiSize(STRING) ( \
1784 NLS_MB_CODE_PAGE_TAG ? \
1785 RtlxUnicodeStringToAnsiSize(STRING) : \
1786 ((STRING)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
1787 )
1788
1789 #endif
1790
1791 NTSYSAPI
1792 NTSTATUS
1793 NTAPI
1794 RtlUnicodeStringToAnsiString(
1795 PANSI_STRING DestinationString,
1796 PCUNICODE_STRING SourceString,
1797 BOOLEAN AllocateDestinationString
1798 );
1799
1800 //
1801 // Unicode->OEM String Functions
1802 //
1803 NTSYSAPI
1804 NTSTATUS
1805 NTAPI
1806 RtlUpcaseUnicodeStringToOemString(
1807 POEM_STRING DestinationString,
1808 PCUNICODE_STRING SourceString,
1809 BOOLEAN AllocateDestinationString
1810 );
1811
1812 _IRQL_requires_max_(PASSIVE_LEVEL)
1813 _Must_inspect_result_
1814 NTSYSAPI
1815 NTSTATUS
1816 NTAPI
1817 RtlUpcaseUnicodeStringToCountedOemString(
1818 _When_(AllocateDestinationString, _Out_ _At_(DestinationString->Buffer, __drv_allocatesMem(Mem)))
1819 _When_(!AllocateDestinationString, _Inout_)
1820 POEM_STRING DestinationString,
1821 _In_ PCUNICODE_STRING SourceString,
1822 _In_ BOOLEAN AllocateDestinationString
1823 );
1824
1825 NTSYSAPI
1826 NTSTATUS
1827 NTAPI
1828 RtlUnicodeStringToOemString(
1829 POEM_STRING DestinationString,
1830 PCUNICODE_STRING SourceString,
1831 BOOLEAN AllocateDestinationString
1832 );
1833
1834 NTSYSAPI
1835 NTSTATUS
1836 NTAPI
1837 RtlUpcaseUnicodeToOemN(
1838 PCHAR OemString,
1839 ULONG OemSize,
1840 PULONG ResultSize,
1841 PCWCH UnicodeString,
1842 ULONG UnicodeSize
1843 );
1844
1845 NTSYSAPI
1846 ULONG
1847 NTAPI
1848 RtlxUnicodeStringToOemSize(IN PCUNICODE_STRING UnicodeString);
1849
1850 #ifdef NTOS_MODE_USER
1851
1852 #define RtlUnicodeStringToOemSize(STRING) ( \
1853 NLS_MB_OEM_CODE_PAGE_TAG ? \
1854 RtlxUnicodeStringToOemSize(STRING) : \
1855 ((STRING)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
1856 )
1857
1858 #define RtlUnicodeStringToCountedOemSize(STRING) ( \
1859 (ULONG)(RtlUnicodeStringToOemSize(STRING) - sizeof(ANSI_NULL)) \
1860 )
1861
1862 #endif
1863
1864 NTSYSAPI
1865 NTSTATUS
1866 NTAPI
1867 RtlUnicodeToOemN(
1868 PCHAR OemString,
1869 ULONG OemSize,
1870 PULONG ResultSize,
1871 PCWCH UnicodeString,
1872 ULONG UnicodeSize
1873 );
1874
1875 //
1876 // Unicode->MultiByte String Functions
1877 //
1878 NTSYSAPI
1879 NTSTATUS
1880 NTAPI
1881 RtlUnicodeToMultiByteN(
1882 PCHAR MbString,
1883 ULONG MbSize,
1884 PULONG ResultSize,
1885 PCWCH UnicodeString,
1886 ULONG UnicodeSize
1887 );
1888
1889 NTSYSAPI
1890 NTSTATUS
1891 NTAPI
1892 RtlUpcaseUnicodeToMultiByteN(
1893 PCHAR MbString,
1894 ULONG MbSize,
1895 PULONG ResultSize,
1896 PCWCH UnicodeString,
1897 ULONG UnicodeSize
1898 );
1899
1900 NTSYSAPI
1901 NTSTATUS
1902 NTAPI
1903 RtlUnicodeToMultiByteSize(
1904 PULONG MbSize,
1905 PCWCH UnicodeString,
1906 ULONG UnicodeSize
1907 );
1908
1909 NTSYSAPI
1910 ULONG
1911 NTAPI
1912 RtlxOemStringToUnicodeSize(IN PCOEM_STRING OemString);
1913
1914 //
1915 // OEM to Unicode Functions
1916 //
1917 NTSYSAPI
1918 NTSTATUS
1919 NTAPI
1920 RtlOemStringToUnicodeString(
1921 PUNICODE_STRING DestinationString,
1922 PCOEM_STRING SourceString,
1923 BOOLEAN AllocateDestinationString
1924 );
1925
1926 _IRQL_requires_max_(PASSIVE_LEVEL)
1927 NTSYSAPI
1928 NTSTATUS
1929 NTAPI
1930 RtlOemToUnicodeN(
1931 _Out_writes_bytes_to_(MaxBytesInUnicodeString, *BytesInUnicodeString) PWCH UnicodeString,
1932 _In_ ULONG MaxBytesInUnicodeString,
1933 _Out_opt_ PULONG BytesInUnicodeString,
1934 _In_reads_bytes_(BytesInOemString) PCCH OemString,
1935 _In_ ULONG BytesInOemString
1936 );
1937
1938 #ifdef NTOS_MODE_USER
1939
1940 #define RtlOemStringToUnicodeSize(STRING) ( \
1941 NLS_MB_OEM_CODE_PAGE_TAG ? \
1942 RtlxOemStringToUnicodeSize(STRING) : \
1943 ((STRING)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
1944 )
1945
1946 #define RtlOemStringToCountedUnicodeSize(STRING) ( \
1947 (ULONG)(RtlOemStringToUnicodeSize(STRING) - sizeof(UNICODE_NULL)) \
1948 )
1949
1950 #endif
1951
1952 //
1953 // Ansi->Unicode String Functions
1954 //
1955 NTSYSAPI
1956 ULONG
1957 NTAPI
1958 RtlxAnsiStringToUnicodeSize(
1959 PCANSI_STRING AnsiString
1960 );
1961
1962 NTSYSAPI
1963 NTSTATUS
1964 NTAPI
1965 RtlAnsiStringToUnicodeString(
1966 PUNICODE_STRING DestinationString,
1967 PCANSI_STRING SourceString,
1968 BOOLEAN AllocateDestinationString
1969 );
1970
1971 #ifdef NTOS_MODE_USER
1972
1973 #define RtlAnsiStringToUnicodeSize(STRING) ( \
1974 NLS_MB_CODE_PAGE_TAG ? \
1975 RtlxAnsiStringToUnicodeSize(STRING) : \
1976 ((STRING)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
1977 )
1978
1979 #endif
1980
1981 NTSYSAPI
1982 BOOLEAN
1983 NTAPI
1984 RtlCreateUnicodeStringFromAsciiz(
1985 _Out_ PUNICODE_STRING Destination,
1986 _In_ PCSZ Source
1987 );
1988
1989 //
1990 // Unicode String Functions
1991 //
1992 NTSYSAPI
1993 NTSTATUS
1994 NTAPI
1995 RtlAppendUnicodeToString(
1996 PUNICODE_STRING Destination,
1997 PCWSTR Source
1998 );
1999
2000 NTSYSAPI
2001 NTSTATUS
2002 NTAPI
2003 RtlAppendUnicodeStringToString(
2004 PUNICODE_STRING Destination,
2005 PCUNICODE_STRING Source
2006 );
2007
2008 NTSYSAPI
2009 LONG
2010 NTAPI
2011 RtlCompareUnicodeString(
2012 PCUNICODE_STRING String1,
2013 PCUNICODE_STRING String2,
2014 BOOLEAN CaseInsensitive
2015 );
2016
2017 NTSYSAPI
2018 VOID
2019 NTAPI
2020 RtlCopyUnicodeString(
2021 PUNICODE_STRING DestinationString,
2022 PCUNICODE_STRING SourceString
2023 );
2024
2025 NTSYSAPI
2026 BOOLEAN
2027 NTAPI
2028 RtlCreateUnicodeString(
2029 PUNICODE_STRING DestinationString,
2030 PCWSTR SourceString
2031 );
2032
2033 #ifdef NTOS_MODE_USER
2034
2035 NTSYSAPI
2036 NTSTATUS
2037 NTAPI
2038 RtlDowncaseUnicodeString(
2039 _Inout_ PUNICODE_STRING UniDest,
2040 _In_ PCUNICODE_STRING UniSource,
2041 _In_ BOOLEAN AllocateDestinationString
2042 );
2043
2044 NTSYSAPI
2045 NTSTATUS
2046 NTAPI
2047 RtlDuplicateUnicodeString(
2048 _In_ ULONG Flags,
2049 _In_ PCUNICODE_STRING SourceString,
2050 _Out_ PUNICODE_STRING DestinationString
2051 );
2052
2053 //
2054 // Memory Functions
2055 //
2056 NTSYSAPI
2057 VOID
2058 NTAPI
2059 RtlFillMemoryUlong(
2060 _In_ PVOID Destination,
2061 _In_ SIZE_T Length,
2062 _In_ ULONG Fill
2063 );
2064
2065 NTSYSAPI
2066 VOID
2067 NTAPI
2068 RtlFillMemoryUlonglong(
2069 _Out_ PVOID Destination,
2070 _In_ SIZE_T Length,
2071 _In_ ULONGLONG Pattern
2072 );
2073
2074
2075 NTSYSAPI
2076 SIZE_T
2077 NTAPI
2078 RtlCompareMemoryUlong(
2079 _In_ PVOID Source,
2080 _In_ SIZE_T Length,
2081 _In_ ULONG Pattern
2082 );
2083
2084 #define RtlEqualMemory(Destination, Source, Length) \
2085 (!memcmp(Destination, Source, Length))
2086
2087 #define RtlCopyBytes RtlCopyMemory
2088 #define RtlFillBytes RtlFillMemory
2089 #define RtlZeroBytes RtlZeroMemory
2090
2091 #endif
2092
2093 NTSYSAPI
2094 BOOLEAN
2095 NTAPI
2096 RtlEqualUnicodeString(
2097 PCUNICODE_STRING String1,
2098 PCUNICODE_STRING String2,
2099 BOOLEAN CaseInsensitive
2100 );
2101
2102 NTSYSAPI
2103 NTSTATUS
2104 NTAPI
2105 RtlFindCharInUnicodeString(
2106 _In_ ULONG Flags,
2107 _In_ PCUNICODE_STRING SearchString,
2108 _In_ PCUNICODE_STRING MatchString,
2109 _Out_ PUSHORT Position
2110 );
2111
2112 NTSYSAPI
2113 VOID
2114 NTAPI
2115 RtlFreeUnicodeString(IN PUNICODE_STRING UnicodeString);
2116
2117 NTSYSAPI
2118 NTSTATUS
2119 NTAPI
2120 RtlHashUnicodeString(
2121 _In_ CONST UNICODE_STRING *String,
2122 _In_ BOOLEAN CaseInSensitive,
2123 _In_ ULONG HashAlgorithm,
2124 _Out_ PULONG HashValue
2125 );
2126
2127 _IRQL_requires_max_(DISPATCH_LEVEL)
2128 _At_(DestinationString->Buffer, _Post_equal_to_(SourceString))
2129 _At_(DestinationString->Length, _Post_equal_to_(_String_length_(SourceString) * sizeof(WCHAR)))
2130 _At_(DestinationString->MaximumLength, _Post_equal_to_((_String_length_(SourceString)+1) * sizeof(WCHAR)))
2131 NTSYSAPI
2132 VOID
2133 NTAPI
2134 RtlInitUnicodeString(
2135 _Out_ PUNICODE_STRING DestinationString,
2136 _In_opt_z_ __drv_aliasesMem PCWSTR SourceString
2137 );
2138
2139 _IRQL_requires_max_(DISPATCH_LEVEL)
2140 NTSYSAPI
2141 NTSTATUS
2142 NTAPI
2143 RtlInitUnicodeStringEx(
2144 _Out_ PUNICODE_STRING DestinationString,
2145 _In_opt_z_ __drv_aliasesMem PCWSTR SourceString
2146 );
2147
2148 NTSYSAPI
2149 BOOLEAN
2150 NTAPI
2151 RtlIsTextUnicode(
2152 PVOID Buffer,
2153 INT Length,
2154 INT *Flags
2155 );
2156
2157 NTSYSAPI
2158 BOOLEAN
2159 NTAPI
2160 RtlPrefixString(
2161 PCANSI_STRING String1,
2162 PCANSI_STRING String2,
2163 BOOLEAN CaseInsensitive
2164 );
2165
2166 NTSYSAPI
2167 BOOLEAN
2168 NTAPI
2169 RtlPrefixUnicodeString(
2170 PCUNICODE_STRING String1,
2171 PCUNICODE_STRING String2,
2172 BOOLEAN CaseInsensitive
2173 );
2174
2175 _IRQL_requires_max_(PASSIVE_LEVEL)
2176 _When_(AllocateDestinationString, _Must_inspect_result_)
2177 NTSYSAPI
2178 NTSTATUS
2179 NTAPI
2180 RtlUpcaseUnicodeString(
2181 _When_(AllocateDestinationString, _Out_ _At_(DestinationString->Buffer, __drv_allocatesMem(Mem)))
2182 _When_(!AllocateDestinationString, _Inout_)
2183 PUNICODE_STRING DestinationString,
2184 _In_ PCUNICODE_STRING SourceString,
2185 _In_ BOOLEAN AllocateDestinationString
2186 );
2187
2188 _IRQL_requires_max_(PASSIVE_LEVEL)
2189 NTSYSAPI
2190 NTSTATUS
2191 NTAPI
2192 RtlUnicodeStringToInteger(
2193 _In_ PCUNICODE_STRING String,
2194 _In_opt_ ULONG Base,
2195 _Out_ PULONG Value
2196 );
2197
2198 NTSYSAPI
2199 NTSTATUS
2200 NTAPI
2201 RtlValidateUnicodeString(
2202 _In_ ULONG Flags,
2203 _In_ PCUNICODE_STRING String
2204 );
2205
2206 //
2207 // Ansi String Functions
2208 //
2209 _IRQL_requires_max_(PASSIVE_LEVEL)
2210 NTSYSAPI
2211 VOID
2212 NTAPI
2213 RtlFreeAnsiString(
2214 _Inout_ _At_(AnsiString->Buffer, __drv_freesMem(Mem))
2215 PANSI_STRING AnsiString
2216 );
2217
2218 NTSYSAPI
2219 VOID
2220 NTAPI
2221 RtlInitAnsiString(
2222 _Out_ PANSI_STRING DestinationString,
2223 _In_z_ PCSZ SourceString
2224 );
2225
2226 NTSYSAPI
2227 NTSTATUS
2228 NTAPI
2229 RtlInitAnsiStringEx(
2230 _Out_ PANSI_STRING DestinationString,
2231 _In_z_ PCSZ SourceString
2232 );
2233
2234 //
2235 // OEM String Functions
2236 //
2237 _IRQL_requires_max_(PASSIVE_LEVEL)
2238 NTSYSAPI
2239 VOID
2240 NTAPI
2241 RtlFreeOemString(
2242 _Inout_ _At_(OemString->Buffer, __drv_freesMem(Mem))
2243 POEM_STRING OemString
2244 );
2245
2246 //
2247 // MultiByte->Unicode String Functions
2248 //
2249 _IRQL_requires_max_(PASSIVE_LEVEL)
2250 NTSYSAPI
2251 NTSTATUS
2252 NTAPI
2253 RtlMultiByteToUnicodeN(
2254 _Out_writes_bytes_to_(MaxBytesInUnicodeString, *BytesInUnicodeString) PWCH UnicodeString,
2255 _In_ ULONG MaxBytesInUnicodeString,
2256 _Out_opt_ PULONG BytesInUnicodeString,
2257 _In_reads_bytes_(BytesInMultiByteString) const CHAR *MultiByteString,
2258 _In_ ULONG BytesInMultiByteString
2259 );
2260
2261 NTSYSAPI
2262 NTSTATUS
2263 NTAPI
2264 RtlMultiByteToUnicodeSize(
2265 _Out_ PULONG UnicodeSize,
2266 _In_z_ PCSTR MbString,
2267 _In_ ULONG MbSize
2268 );
2269
2270 //
2271 // Atom Functions
2272 //
2273 NTSYSAPI
2274 NTSTATUS
2275 NTAPI
2276 RtlAddAtomToAtomTable(
2277 _In_ PRTL_ATOM_TABLE AtomTable,
2278 _In_ PWSTR AtomName,
2279 _Out_ PRTL_ATOM Atom
2280 );
2281
2282 NTSYSAPI
2283 NTSTATUS
2284 NTAPI
2285 RtlCreateAtomTable(
2286 _In_ ULONG TableSize,
2287 _Inout_ PRTL_ATOM_TABLE *AtomTable
2288 );
2289
2290 NTSYSAPI
2291 NTSTATUS
2292 NTAPI
2293 RtlDeleteAtomFromAtomTable(
2294 _In_ PRTL_ATOM_TABLE AtomTable,
2295 _In_ RTL_ATOM Atom
2296 );
2297
2298 NTSYSAPI
2299 NTSTATUS
2300 NTAPI
2301 RtlDestroyAtomTable(IN PRTL_ATOM_TABLE AtomTable);
2302
2303 NTSYSAPI
2304 NTSTATUS
2305 NTAPI
2306 RtlQueryAtomInAtomTable(
2307 _In_ PRTL_ATOM_TABLE AtomTable,
2308 _In_ RTL_ATOM Atom,
2309 _Inout_opt_ PULONG RefCount,
2310 _Inout_opt_ PULONG PinCount,
2311 _Inout_opt_ PWSTR AtomName,
2312 _Inout_opt_ PULONG NameLength
2313 );
2314
2315 NTSYSAPI
2316 NTSTATUS
2317 NTAPI
2318 RtlPinAtomInAtomTable(
2319 _In_ PRTL_ATOM_TABLE AtomTable,
2320 _In_ RTL_ATOM Atom
2321 );
2322
2323 NTSYSAPI
2324 NTSTATUS
2325 NTAPI
2326 RtlLookupAtomInAtomTable(
2327 _In_ PRTL_ATOM_TABLE AtomTable,
2328 _In_ PWSTR AtomName,
2329 _Out_ PRTL_ATOM Atom
2330 );
2331
2332 //
2333 // Process Management Functions
2334 //
2335 NTSYSAPI
2336 PPEB
2337 NTAPI
2338 RtlGetCurrentPeb(
2339 VOID
2340 );
2341
2342 NTSYSAPI
2343 VOID
2344 NTAPI
2345 RtlAcquirePebLock(VOID);
2346
2347 NTSYSAPI
2348 NTSTATUS
2349 NTAPI
2350 RtlCreateProcessParameters (
2351 _Out_ PRTL_USER_PROCESS_PARAMETERS *ProcessParameters,
2352 _In_opt_ PUNICODE_STRING ImagePathName,
2353 _In_opt_ PUNICODE_STRING DllPath,
2354 _In_opt_ PUNICODE_STRING CurrentDirectory,
2355 _In_opt_ PUNICODE_STRING CommandLine,
2356 _In_opt_ PWSTR Environment,
2357 _In_opt_ PUNICODE_STRING WindowTitle,
2358 _In_opt_ PUNICODE_STRING DesktopInfo,
2359 _In_opt_ PUNICODE_STRING ShellInfo,
2360 _In_opt_ PUNICODE_STRING RuntimeInfo
2361 );
2362
2363 NTSYSAPI
2364 NTSTATUS
2365 NTAPI
2366 RtlCreateUserProcess(
2367 _In_ PUNICODE_STRING ImageFileName,
2368 _In_ ULONG Attributes,
2369 _In_ PRTL_USER_PROCESS_PARAMETERS ProcessParameters,
2370 _In_opt_ PSECURITY_DESCRIPTOR ProcessSecutityDescriptor,
2371 _In_opt_ PSECURITY_DESCRIPTOR ThreadSecurityDescriptor,
2372 _In_opt_ HANDLE ParentProcess,
2373 _In_ BOOLEAN CurrentDirectory,
2374 _In_opt_ HANDLE DebugPort,
2375 _In_opt_ HANDLE ExceptionPort,
2376 _Out_ PRTL_USER_PROCESS_INFORMATION ProcessInfo
2377 );
2378
2379 NTSYSAPI
2380 NTSTATUS
2381 NTAPI
2382 RtlCreateUserThread(
2383 _In_ HANDLE ProcessHandle,
2384 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,
2385 _In_ BOOLEAN CreateSuspended,
2386 _In_ ULONG StackZeroBits,
2387 _In_ SIZE_T StackReserve,
2388 _In_ SIZE_T StackCommit,
2389 _In_ PTHREAD_START_ROUTINE StartAddress,
2390 _In_ PVOID Parameter,
2391 _Inout_ PHANDLE ThreadHandle,
2392 _Inout_ PCLIENT_ID ClientId
2393 );
2394
2395 NTSYSAPI
2396 PRTL_USER_PROCESS_PARAMETERS
2397 NTAPI
2398 RtlDeNormalizeProcessParams(
2399 _In_ PRTL_USER_PROCESS_PARAMETERS ProcessParameters);
2400
2401 NTSYSAPI
2402 NTSTATUS
2403 NTAPI
2404 RtlDestroyProcessParameters(
2405 _In_ PRTL_USER_PROCESS_PARAMETERS ProcessParameters);
2406
2407 NTSYSAPI
2408 VOID
2409 NTAPI
2410 RtlExitUserThread(
2411 _In_ NTSTATUS Status);
2412
2413 NTSYSAPI
2414 VOID
2415 NTAPI
2416 RtlInitializeContext(
2417 _In_ HANDLE ProcessHandle,
2418 _Out_ PCONTEXT ThreadContext,
2419 _In_opt_ PVOID ThreadStartParam,
2420 _In_ PTHREAD_START_ROUTINE ThreadStartAddress,
2421 _In_ PINITIAL_TEB InitialTeb
2422 );
2423
2424 #ifdef _M_AMD64
2425 typedef struct _WOW64_CONTEXT *PWOW64_CONTEXT;
2426
2427 NTSYSAPI
2428 NTSTATUS
2429 NTAPI
2430 RtlWow64GetThreadContext(
2431 _In_ HANDLE ThreadHandle,
2432 _Inout_ PWOW64_CONTEXT ThreadContext
2433 );
2434
2435
2436 NTSYSAPI
2437 NTSTATUS
2438 NTAPI
2439 RtlWow64SetThreadContext(
2440 _In_ HANDLE ThreadHandle,
2441 _In_ PWOW64_CONTEXT ThreadContext
2442 );
2443 #endif
2444
2445 NTSYSAPI
2446 BOOLEAN
2447 NTAPI
2448 RtlIsThreadWithinLoaderCallout(VOID);
2449
2450 NTSYSAPI
2451 PRTL_USER_PROCESS_PARAMETERS
2452 NTAPI
2453 RtlNormalizeProcessParams(
2454 _In_ PRTL_USER_PROCESS_PARAMETERS ProcessParameters);
2455
2456 NTSYSAPI
2457 VOID
2458 NTAPI
2459 RtlReleasePebLock(VOID);
2460
2461 NTSYSAPI
2462 NTSTATUS
2463 NTAPI
2464 RtlRemoteCall(
2465 _In_ HANDLE Process,
2466 _In_ HANDLE Thread,
2467 _In_ PVOID CallSite,
2468 _In_ ULONG ArgumentCount,
2469 _In_ PULONG Arguments,
2470 _In_ BOOLEAN PassContext,
2471 _In_ BOOLEAN AlreadySuspended
2472 );
2473
2474 NTSYSAPI
2475 NTSTATUS
2476 NTAPI
2477 RtlSetProcessIsCritical(
2478 _In_ BOOLEAN NewValue,
2479 _Out_opt_ PBOOLEAN OldValue,
2480 _In_ BOOLEAN NeedBreaks
2481 );
2482
2483 NTSYSAPI
2484 NTSTATUS
2485 NTAPI
2486 RtlSetThreadIsCritical(
2487 _In_ BOOLEAN NewValue,
2488 _Out_opt_ PBOOLEAN OldValue,
2489 _In_ BOOLEAN NeedBreaks
2490 );
2491
2492 NTSYSAPI
2493 ULONG
2494 NTAPI
2495 RtlGetCurrentProcessorNumber(
2496 VOID
2497 );
2498
2499 #define NtCurrentPeb() (NtCurrentTeb()->ProcessEnvironmentBlock)
2500
2501 //
2502 // Thread Pool Functions
2503 //
2504 //
2505 NTSTATUS
2506 NTAPI
2507 RtlSetThreadPoolStartFunc(
2508 _In_ PRTL_START_POOL_THREAD StartPoolThread,
2509 _In_ PRTL_EXIT_POOL_THREAD ExitPoolThread
2510 );
2511
2512 NTSYSAPI
2513 NTSTATUS
2514 NTAPI
2515 RtlDeregisterWaitEx(
2516 _In_ HANDLE hWaitHandle,
2517 _In_ HANDLE hCompletionEvent
2518 );
2519
2520 NTSYSAPI
2521 NTSTATUS
2522 NTAPI
2523 RtlDeregisterWait(
2524 _In_ HANDLE hWaitHandle
2525 );
2526
2527 NTSYSAPI
2528 NTSTATUS
2529 NTAPI
2530 RtlQueueWorkItem(
2531 _In_ WORKERCALLBACKFUNC Function,
2532 _In_opt_ PVOID Context,
2533 _In_ ULONG Flags
2534 );
2535
2536 NTSYSAPI
2537 NTSTATUS
2538 NTAPI
2539 RtlSetIoCompletionCallback(
2540 _In_ HANDLE FileHandle,
2541 _In_ PIO_APC_ROUTINE Callback,
2542 _In_ ULONG Flags
2543 );
2544
2545 NTSYSAPI
2546 NTSTATUS
2547 NTAPI
2548 RtlRegisterWait(
2549 _In_ PHANDLE phNewWaitObject,
2550 _In_ HANDLE hObject,
2551 _In_ WAITORTIMERCALLBACKFUNC Callback,
2552 _In_ PVOID pvContext,
2553 _In_ ULONG ulMilliseconds,
2554 _In_ ULONG ulFlags
2555 );
2556
2557 //
2558 // Environment/Path Functions
2559 //
2560 NTSYSAPI
2561 NTSTATUS
2562 NTAPI
2563 RtlCreateEnvironment(
2564 _In_ BOOLEAN Inherit,
2565 _Out_ PWSTR *Environment
2566 );
2567
2568 NTSYSAPI
2569 NTSTATUS
2570 NTAPI
2571 RtlComputePrivatizedDllName_U(
2572 _In_ PUNICODE_STRING DllName,
2573 _Out_ PUNICODE_STRING RealName,
2574 _Out_ PUNICODE_STRING LocalName
2575 );
2576
2577 NTSYSAPI
2578 VOID
2579 NTAPI
2580 RtlDestroyEnvironment(
2581 _In_ PWSTR Environment
2582 );
2583
2584 NTSYSAPI
2585 BOOLEAN
2586 NTAPI
2587 RtlDoesFileExists_U(
2588 _In_ PCWSTR FileName
2589 );
2590
2591 NTSYSAPI
2592 ULONG
2593 NTAPI
2594 RtlDetermineDosPathNameType_U(
2595 _In_ PCWSTR Path
2596 );
2597
2598 NTSYSAPI
2599 ULONG
2600 NTAPI
2601 RtlDosSearchPath_U(
2602 _In_ PCWSTR Path,
2603 _In_ PCWSTR FileName,
2604 _In_ PCWSTR Extension,
2605 _In_ ULONG BufferSize,
2606 _Out_ PWSTR Buffer,
2607 _Out_ PWSTR *PartName
2608 );
2609
2610 NTSYSAPI
2611 NTSTATUS
2612 NTAPI
2613 RtlDosSearchPath_Ustr(
2614 _In_ ULONG Flags,
2615 _In_ PUNICODE_STRING PathString,
2616 _In_ PUNICODE_STRING FileNameString,
2617 _In_ PUNICODE_STRING ExtensionString,
2618 _In_ PUNICODE_STRING CallerBuffer,
2619 _Inout_opt_ PUNICODE_STRING DynamicString,
2620 _Out_opt_ PUNICODE_STRING* FullNameOut,
2621 _Out_opt_ PSIZE_T FilePartSize,
2622 _Out_opt_ PSIZE_T LengthNeeded
2623 );
2624
2625 NTSYSAPI
2626 BOOLEAN
2627 NTAPI
2628 RtlDosPathNameToNtPathName_U(
2629 _In_ PCWSTR DosPathName,
2630 _Out_ PUNICODE_STRING NtPathName,
2631 _Out_ PCWSTR *NtFileNamePart,
2632 _Out_ PRTL_RELATIVE_NAME_U DirectoryInfo
2633 );
2634
2635 NTSYSAPI
2636 BOOLEAN
2637 NTAPI
2638 RtlDosPathNameToRelativeNtPathName_U(
2639 _In_ PCWSTR DosName,
2640 _Out_ PUNICODE_STRING NtName,
2641 _Out_ PCWSTR *PartName,
2642 _Out_ PRTL_RELATIVE_NAME_U RelativeName
2643 );
2644
2645 NTSYSAPI
2646 NTSTATUS
2647 NTAPI
2648 RtlExpandEnvironmentStrings_U(
2649 _In_z_ PWSTR Environment,
2650 _In_ PUNICODE_STRING Source,
2651 _Out_ PUNICODE_STRING Destination,
2652 _Out_ PULONG Length
2653 );
2654
2655 NTSYSAPI
2656 ULONG
2657 NTAPI
2658 RtlGetCurrentDirectory_U(
2659 _In_ ULONG MaximumLength,
2660 _Out_z_bytecap_(MaximumLength) PWSTR Buffer
2661 );
2662
2663 NTSYSAPI
2664 ULONG
2665 NTAPI
2666 RtlGetFullPathName_U(
2667 _In_ PCWSTR FileName,
2668 _In_ ULONG Size,
2669 _In_ PWSTR Buffer,
2670 _Out_ PWSTR *ShortName
2671 );
2672
2673 #if (NTDDI_VERSION >= NTDDI_WIN7)
2674 NTSYSAPI
2675 NTSTATUS
2676 NTAPI
2677 RtlGetFullPathName_UEx(
2678 _In_ PWSTR FileName,
2679 _In_ ULONG BufferLength,
2680 _Out_ PWSTR Buffer,
2681 _Out_opt_ PWSTR *FilePart,
2682 _Out_opt_ RTL_PATH_TYPE *InputPathType
2683 );
2684 #endif
2685
2686 NTSTATUS
2687 NTAPI
2688 RtlGetFullPathName_UstrEx(
2689 _In_ PUNICODE_STRING FileName,
2690 _In_ PUNICODE_STRING StaticString,
2691 _In_ PUNICODE_STRING DynamicString,
2692 _In_ PUNICODE_STRING *StringUsed,
2693 _In_ PSIZE_T FilePartSize,
2694 _Out_ PBOOLEAN NameInvalid,
2695 _Out_ RTL_PATH_TYPE* PathType,
2696 _Out_ PSIZE_T LengthNeeded
2697 );
2698
2699 NTSYSAPI
2700 ULONG
2701 NTAPI
2702 RtlGetLongestNtPathLength(
2703 VOID
2704 );
2705
2706 NTSYSAPI
2707 ULONG
2708 NTAPI
2709 RtlIsDosDeviceName_U(
2710 _In_ PCWSTR Name
2711 );
2712
2713 NTSYSAPI
2714 ULONG
2715 NTAPI
2716 RtlIsDosDeviceName_Ustr(
2717 _In_ PCUNICODE_STRING Name
2718 );
2719
2720
2721 _IRQL_requires_max_(PASSIVE_LEVEL)
2722 _Must_inspect_result_
2723 NTSYSAPI
2724 BOOLEAN
2725 NTAPI
2726 RtlIsNameLegalDOS8Dot3(
2727 _In_ PCUNICODE_STRING Name,
2728 _Inout_opt_ POEM_STRING OemName,
2729 _Out_opt_ PBOOLEAN NameContainsSpaces
2730 );
2731
2732 NTSYSAPI
2733 NTSTATUS
2734 NTAPI
2735 RtlQueryEnvironmentVariable_U(
2736 _In_opt_ PWSTR Environment,
2737 _In_ PUNICODE_STRING Name,
2738 _Out_ PUNICODE_STRING Value
2739 );
2740
2741 VOID
2742 NTAPI
2743 RtlReleaseRelativeName(
2744 _In_ PRTL_RELATIVE_NAME_U RelativeName
2745 );
2746
2747 NTSYSAPI
2748 NTSTATUS
2749 NTAPI
2750 RtlSetCurrentDirectory_U(
2751 _In_ PUNICODE_STRING name
2752 );
2753
2754 NTSYSAPI
2755 NTSTATUS
2756 NTAPI
2757 RtlSetEnvironmentVariable(
2758 _In_z_ PWSTR *Environment,
2759 _In_ PUNICODE_STRING Name,
2760 _In_ PUNICODE_STRING Value
2761 );
2762
2763 //
2764 // Critical Section/Resource Functions
2765 //
2766 NTSYSAPI
2767 NTSTATUS
2768 NTAPI
2769 RtlDeleteCriticalSection (
2770 _In_ PRTL_CRITICAL_SECTION CriticalSection
2771 );
2772
2773 NTSYSAPI
2774 NTSTATUS
2775 NTAPI
2776 RtlEnterCriticalSection(
2777 _In_ PRTL_CRITICAL_SECTION CriticalSection
2778 );
2779
2780 NTSYSAPI
2781 NTSTATUS
2782 NTAPI
2783 RtlInitializeCriticalSection(
2784 _In_ PRTL_CRITICAL_SECTION CriticalSection
2785 );
2786
2787 NTSYSAPI
2788 NTSTATUS
2789 NTAPI
2790 RtlInitializeCriticalSectionAndSpinCount(
2791 _In_ PRTL_CRITICAL_SECTION CriticalSection,
2792 _In_ ULONG SpinCount
2793 );
2794
2795 NTSYSAPI
2796 NTSTATUS
2797 NTAPI
2798 RtlLeaveCriticalSection(
2799 _In_ PRTL_CRITICAL_SECTION CriticalSection
2800 );
2801
2802 NTSYSAPI
2803 BOOLEAN
2804 NTAPI
2805 RtlTryEnterCriticalSection(
2806 _In_ PRTL_CRITICAL_SECTION CriticalSection
2807 );
2808
2809 NTSYSAPI
2810 VOID
2811 NTAPI
2812 RtlpUnWaitCriticalSection(
2813 _In_ PRTL_CRITICAL_SECTION CriticalSection
2814 );
2815
2816 NTSYSAPI
2817 NTSTATUS
2818 NTAPI
2819 RtlpWaitForCriticalSection(
2820 _In_ PRTL_CRITICAL_SECTION CriticalSection
2821 );
2822
2823 NTSYSAPI
2824 BOOLEAN
2825 NTAPI
2826 RtlAcquireResourceExclusive(
2827 _In_ PRTL_RESOURCE Resource,
2828 _In_ BOOLEAN Wait
2829 );
2830
2831 NTSYSAPI
2832 BOOLEAN
2833 NTAPI
2834 RtlAcquireResourceShared(
2835 _In_ PRTL_RESOURCE Resource,
2836 _In_ BOOLEAN Wait
2837 );
2838
2839 NTSYSAPI
2840 VOID
2841 NTAPI
2842 RtlConvertExclusiveToShared(
2843 _In_ PRTL_RESOURCE Resource
2844 );
2845
2846 NTSYSAPI
2847 VOID
2848 NTAPI
2849 RtlConvertSharedToExclusive(
2850 _In_ PRTL_RESOURCE Resource
2851 );
2852
2853 NTSYSAPI
2854 VOID
2855 NTAPI
2856 RtlDeleteResource(
2857 _In_ PRTL_RESOURCE Resource
2858 );
2859
2860 NTSYSAPI
2861 VOID
2862 NTAPI
2863 RtlDumpResource(
2864 _In_ PRTL_RESOURCE Resource
2865 );
2866
2867 NTSYSAPI
2868 VOID
2869 NTAPI
2870 RtlInitializeResource(
2871 _In_ PRTL_RESOURCE Resource
2872 );
2873
2874 NTSYSAPI
2875 VOID
2876 NTAPI
2877 RtlReleaseResource(
2878 _In_ PRTL_RESOURCE Resource
2879 );
2880
2881 //
2882 // Compression Functions
2883 //
2884 NTSYSAPI //NT_RTL_COMPRESS_API
2885 NTSTATUS
2886 NTAPI
2887 RtlCompressBuffer(
2888 _In_ USHORT CompressionFormatAndEngine,
2889 _In_reads_bytes_(UncompressedBufferSize) PUCHAR UncompressedBuffer,
2890 _In_ ULONG UncompressedBufferSize,
2891 _Out_writes_bytes_to_(CompressedBufferSize, *FinalCompressedSize) PUCHAR CompressedBuffer,
2892 _In_ ULONG CompressedBufferSize,
2893 _In_ ULONG UncompressedChunkSize,
2894 _Out_ PULONG FinalCompressedSize,
2895 _In_ PVOID WorkSpace
2896 );
2897
2898 _IRQL_requires_max_(APC_LEVEL)
2899 NTSYSAPI //NT_RTL_COMPRESS_API
2900 NTSTATUS
2901 NTAPI
2902 RtlDecompressBuffer(
2903 _In_ USHORT CompressionFormat,
2904 _Out_writes_bytes_to_(UncompressedBufferSize, *FinalUncompressedSize) PUCHAR UncompressedBuffer,
2905 _In_ ULONG UncompressedBufferSize,
2906 _In_reads_bytes_(CompressedBufferSize) PUCHAR CompressedBuffer,
2907 _In_ ULONG CompressedBufferSize,
2908 _Out_ PULONG FinalUncompressedSize
2909 );
2910
2911 NTSYSAPI
2912 NTSTATUS
2913 NTAPI
2914 RtlGetCompressionWorkSpaceSize(
2915 _In_ USHORT CompressionFormatAndEngine,
2916 _Out_ PULONG CompressBufferWorkSpaceSize,
2917 _Out_ PULONG CompressFragmentWorkSpaceSize
2918 );
2919
2920 //
2921 // Debug Info Functions
2922 //
2923 NTSYSAPI
2924 PRTL_DEBUG_INFORMATION
2925 NTAPI
2926 RtlCreateQueryDebugBuffer(
2927 _In_ ULONG Size,
2928 _In_ BOOLEAN EventPair
2929 );
2930
2931 NTSYSAPI
2932 NTSTATUS
2933 NTAPI
2934 RtlDestroyQueryDebugBuffer(IN PRTL_DEBUG_INFORMATION DebugBuffer);
2935
2936 NTSYSAPI
2937 NTSTATUS
2938 NTAPI
2939 RtlQueryProcessDebugInformation(
2940 _In_ ULONG ProcessId,
2941 _In_ ULONG DebugInfoClassMask,
2942 _Inout_ PRTL_DEBUG_INFORMATION DebugBuffer
2943 );
2944
2945 //
2946 // Bitmap Functions
2947 //
2948 NTSYSAPI
2949 BOOLEAN
2950 NTAPI
2951 RtlAreBitsClear(
2952 _In_ PRTL_BITMAP BitMapHeader,
2953 _In_ ULONG StartingIndex,
2954 _In_ ULONG Length
2955 );
2956
2957 NTSYSAPI
2958 BOOLEAN
2959 NTAPI
2960 RtlAreBitsSet(
2961 _In_ PRTL_BITMAP BitMapHeader,
2962 _In_ ULONG StartingIndex,
2963 _In_ ULONG Length
2964 );
2965
2966 NTSYSAPI
2967 VOID
2968 NTAPI
2969 RtlClearAllBits(
2970 _In_ PRTL_BITMAP BitMapHeader
2971 );
2972
2973 NTSYSAPI
2974 VOID
2975 NTAPI
2976 RtlClearBits(
2977 _In_ PRTL_BITMAP BitMapHeader,
2978 _In_range_(0, BitMapHeader->SizeOfBitMap - NumberToClear) ULONG StartingIndex,
2979 _In_range_(0, BitMapHeader->SizeOfBitMap - StartingIndex) ULONG NumberToClear
2980 );
2981
2982 NTSYSAPI
2983 ULONG
2984 NTAPI
2985 RtlFindClearBits(
2986 _In_ PRTL_BITMAP BitMapHeader,
2987 _In_ ULONG NumberToFind,
2988 _In_ ULONG HintIndex
2989 );
2990
2991 NTSYSAPI
2992 ULONG
2993 NTAPI
2994 RtlFindClearBitsAndSet(
2995 _In_ PRTL_BITMAP BitMapHeader,
2996 _In_ ULONG NumberToFind,
2997 _In_ ULONG HintIndex
2998 );
2999
3000 NTSYSAPI
3001 CCHAR
3002 NTAPI
3003 RtlFindLeastSignificantBit(
3004 _In_ ULONGLONG Value
3005 );
3006
3007 NTSYSAPI
3008 CCHAR
3009 NTAPI
3010 RtlFindMostSignificantBit(
3011 _In_ ULONGLONG Value
3012 );
3013
3014 NTSYSAPI
3015 ULONG
3016 NTAPI
3017 RtlFindNextForwardRunClear(
3018 _In_ PRTL_BITMAP BitMapHeader,
3019 _In_ ULONG FromIndex,
3020 _Out_ PULONG StartingRunIndex
3021 );
3022
3023 NTSYSAPI
3024 ULONG
3025 NTAPI
3026 RtlFindNextForwardRunSet(
3027 _In_ PRTL_BITMAP BitMapHeader,
3028 _In_ ULONG FromIndex,
3029 _In_ PULONG StartingRunIndex
3030 );
3031
3032 NTSYSAPI
3033 ULONG
3034 NTAPI
3035 RtlFindSetBits(
3036 _In_ PRTL_BITMAP BitMapHeader,
3037 _In_ ULONG NumberToFind,
3038 _In_ ULONG HintIndex
3039 );
3040
3041 NTSYSAPI
3042 ULONG
3043 NTAPI
3044 RtlFindSetBitsAndClear(
3045 _In_ PRTL_BITMAP BitMapHeader,
3046 _In_ ULONG NumberToFind,
3047 _In_ ULONG HintIndex
3048 );
3049
3050 #ifdef _REACTOS_ // ReactOS improvement
3051 _At_(BitMapHeader->SizeOfBitMap, _Post_equal_to_(SizeOfBitMap))
3052 _At_(BitMapHeader->Buffer, _Post_equal_to_(BitMapBuffer))
3053 #endif
3054 NTSYSAPI
3055 VOID
3056 NTAPI
3057 RtlInitializeBitMap(
3058 _Out_ PRTL_BITMAP BitMapHeader,
3059 _In_opt_ __drv_aliasesMem PULONG BitMapBuffer,
3060 _In_opt_ ULONG SizeOfBitMap
3061 );
3062
3063 NTSYSAPI
3064 ULONG
3065 NTAPI
3066 RtlNumberOfClearBits(
3067 _In_ PRTL_BITMAP BitMapHeader
3068 );
3069
3070 NTSYSAPI
3071 ULONG
3072 NTAPI
3073 RtlNumberOfSetBits(
3074 _In_ PRTL_BITMAP BitMapHeader
3075 );
3076
3077 NTSYSAPI
3078 VOID
3079 NTAPI
3080 RtlSetBit(
3081 _In_ PRTL_BITMAP BitMapHeader,
3082 _In_range_(<, BitMapHeader->SizeOfBitMap) ULONG BitNumber
3083 );
3084
3085 NTSYSAPI
3086 VOID
3087 NTAPI
3088 RtlSetBits(
3089 _In_ PRTL_BITMAP BitMapHeader,
3090 _In_range_(0, BitMapHeader->SizeOfBitMap - NumberToSet) ULONG StartingIndex,
3091 _In_range_(0, BitMapHeader->SizeOfBitMap - StartingIndex) ULONG NumberToSet
3092 );
3093
3094 NTSYSAPI
3095 VOID
3096 NTAPI
3097 RtlSetAllBits(
3098 _In_ PRTL_BITMAP BitMapHeader
3099 );
3100
3101 _Must_inspect_result_
3102 NTSYSAPI
3103 BOOLEAN
3104 NTAPI
3105 RtlTestBit(
3106 _In_ PRTL_BITMAP BitMapHeader,
3107 _In_range_(<, BitMapHeader->SizeOfBitMap) ULONG BitNumber
3108 );
3109
3110 //
3111 // Timer Functions
3112 //
3113 NTSYSAPI
3114 NTSTATUS
3115 NTAPI
3116 RtlCreateTimer(
3117 _In_ HANDLE TimerQueue,
3118 _In_ PHANDLE phNewTimer,
3119 _In_ WAITORTIMERCALLBACKFUNC Callback,
3120 _In_ PVOID Parameter,
3121 _In_ ULONG DueTime,
3122 _In_ ULONG Period,
3123 _In_ ULONG Flags
3124 );
3125
3126 NTSYSAPI
3127 NTSTATUS
3128 NTAPI
3129 RtlCreateTimerQueue(PHANDLE TimerQueue);
3130
3131 NTSYSAPI
3132 NTSTATUS
3133 NTAPI
3134 RtlDeleteTimer(
3135 _In_ HANDLE TimerQueue,
3136 _In_ HANDLE Timer,
3137 _In_ HANDLE CompletionEvent
3138 );
3139
3140 NTSYSAPI
3141 NTSTATUS
3142 NTAPI
3143 RtlUpdateTimer(
3144 _In_ HANDLE TimerQueue,
3145 _In_ HANDLE Timer,
3146 _In_ ULONG DueTime,
3147 _In_ ULONG Period
3148 );
3149
3150 NTSYSAPI
3151 NTSTATUS
3152 NTAPI
3153 RtlDeleteTimerQueueEx(
3154 _In_ HANDLE TimerQueue,
3155 _In_ HANDLE CompletionEvent
3156 );
3157
3158 NTSYSAPI
3159 NTSTATUS
3160 NTAPI
3161 RtlDeleteTimerQueue(HANDLE TimerQueue);
3162
3163 //
3164 // SList functions
3165 //
3166 PSLIST_ENTRY
3167 FASTCALL
3168 InterlockedPushListSList(
3169 _Inout_ PSLIST_HEADER ListHead,
3170 _Inout_ __drv_aliasesMem PSLIST_ENTRY List,
3171 _Inout_ PSLIST_ENTRY ListEnd,
3172 _In_ ULONG Count
3173 );
3174
3175 //
3176 // Range List functions
3177 //
3178 NTSYSAPI
3179 VOID
3180 NTAPI
3181 RtlInitializeRangeList(
3182 _Inout_ PRTL_RANGE_LIST RangeList
3183 );
3184
3185 NTSYSAPI
3186 VOID
3187 NTAPI
3188 RtlFreeRangeList(
3189 _In_ PRTL_RANGE_LIST RangeList
3190 );
3191
3192 NTSYSAPI
3193 NTSTATUS
3194 NTAPI
3195 RtlAddRange(
3196 _Inout_ PRTL_RANGE_LIST RangeList,
3197 _In_ ULONGLONG Start,
3198 _In_ ULONGLONG End,
3199 _In_ UCHAR Attributes,
3200 _In_ ULONG Flags,
3201 _In_opt_ PVOID UserData,
3202 _In_opt_ PVOID Owner
3203 );
3204
3205 //
3206 // Debug Functions
3207 //
3208 ULONG
3209 __cdecl
3210 DbgPrint(
3211 _In_z_ _Printf_format_string_ PCSTR Format,
3212 ...
3213 );
3214
3215 NTSYSAPI
3216 ULONG
3217 __cdecl
3218 DbgPrintEx(
3219 _In_ ULONG ComponentId,
3220 _In_ ULONG Level,
3221 _In_z_ _Printf_format_string_ PCSTR Format,
3222 ...
3223 );
3224
3225 NTSYSAPI
3226 ULONG
3227 NTAPI
3228 DbgPrompt(
3229 _In_z_ PCCH Prompt,
3230 _Out_writes_bytes_(Length) PCH Response,
3231 _In_ ULONG Length
3232 );
3233
3234 VOID
3235 NTAPI
3236 DbgBreakPoint(
3237 VOID
3238 );
3239
3240 VOID
3241 NTAPI
3242 DbgLoadImageSymbols(
3243 _In_ PSTRING Name,
3244 _In_ PVOID Base,
3245 _In_ ULONG_PTR ProcessId
3246 );
3247
3248 VOID
3249 NTAPI
3250 DbgUnLoadImageSymbols(
3251 _In_ PSTRING Name,
3252 _In_ PVOID Base,
3253 _In_ ULONG_PTR ProcessId
3254 );
3255
3256 VOID
3257 NTAPI
3258 DbgCommandString(
3259 _In_ PCCH Name,
3260 _In_ PCCH Command
3261 );
3262
3263 //
3264 // Generic Table Functions
3265 //
3266 #if defined(NTOS_MODE_USER) || defined(_NTIFS_)
3267 NTSYSAPI
3268 PVOID
3269 NTAPI
3270 RtlInsertElementGenericTable(
3271 _In_ PRTL_GENERIC_TABLE Table,
3272 _In_reads_bytes_(BufferSize) PVOID Buffer,
3273 _In_ CLONG BufferSize,
3274 _Out_opt_ PBOOLEAN NewElement
3275 );
3276
3277 NTSYSAPI
3278 PVOID
3279 NTAPI
3280 RtlInsertElementGenericTableFull(
3281 _In_ PRTL_GENERIC_TABLE Table,
3282 _In_reads_bytes_(BufferSize) PVOID Buffer,
3283 _In_ CLONG BufferSize,
3284 _Out_opt_ PBOOLEAN NewElement,
3285 _In_ PVOID NodeOrParent,
3286 _In_ TABLE_SEARCH_RESULT SearchResult
3287 );
3288
3289 NTSYSAPI
3290 BOOLEAN
3291 NTAPI
3292 RtlIsGenericTableEmpty(
3293 _In_ PRTL_GENERIC_TABLE Table
3294 );
3295
3296 NTSYSAPI
3297 PVOID
3298 NTAPI
3299 RtlLookupElementGenericTableFull(
3300 _In_ PRTL_GENERIC_TABLE Table,
3301 _In_ PVOID Buffer,
3302 _Out_ PVOID *NodeOrParent,
3303 _Out_ TABLE_SEARCH_RESULT *SearchResult
3304 );
3305 #endif
3306
3307 //
3308 // Handle Table Functions
3309 //
3310 NTSYSAPI
3311 PRTL_HANDLE_TABLE_ENTRY
3312 NTAPI
3313 RtlAllocateHandle(
3314 _In_ PRTL_HANDLE_TABLE HandleTable,
3315 _Inout_ PULONG Index
3316 );
3317
3318 NTSYSAPI
3319 VOID
3320 NTAPI
3321 RtlDestroyHandleTable(
3322 _Inout_ PRTL_HANDLE_TABLE HandleTable);
3323
3324 NTSYSAPI
3325 BOOLEAN
3326 NTAPI
3327 RtlFreeHandle(
3328 _In_ PRTL_HANDLE_TABLE HandleTable,
3329 _In_ PRTL_HANDLE_TABLE_ENTRY Handle
3330 );
3331
3332 NTSYSAPI
3333 VOID
3334 NTAPI
3335 RtlInitializeHandleTable(
3336 _In_ ULONG TableSize,
3337 _In_ ULONG HandleSize,
3338 _In_ PRTL_HANDLE_TABLE HandleTable
3339 );
3340
3341 NTSYSAPI
3342 BOOLEAN
3343 NTAPI
3344 RtlIsValidHandle(
3345 _In_ PRTL_HANDLE_TABLE HandleTable,
3346 _In_ PRTL_HANDLE_TABLE_ENTRY Handle
3347 );
3348
3349 NTSYSAPI
3350 BOOLEAN
3351 NTAPI
3352 RtlIsValidIndexHandle(
3353 _In_ PRTL_HANDLE_TABLE HandleTable,
3354 _In_ ULONG Index,
3355 _Out_ PRTL_HANDLE_TABLE_ENTRY *Handle
3356 );
3357
3358 //
3359 // PE Functions
3360 //
3361 NTSYSAPI
3362 NTSTATUS
3363 NTAPI
3364 RtlFindMessage(
3365 _In_ PVOID BaseAddress,
3366 _In_ ULONG Type,
3367 _In_ ULONG Language,
3368 _In_ ULONG MessageId,
3369 _Out_ PMESSAGE_RESOURCE_ENTRY *MessageResourceEntry
3370 );
3371
3372 NTSYSAPI
3373 ULONG
3374 NTAPI
3375 RtlGetNtGlobalFlags(VOID);
3376
3377 NTSYSAPI
3378 PVOID
3379 NTAPI
3380 RtlImageDirectoryEntryToData(
3381 _In_ PVOID BaseAddress,
3382 _In_ BOOLEAN MappedAsImage,
3383 _In_ USHORT Directory,
3384 _Out_ PULONG Size
3385 );
3386
3387 NTSYSAPI
3388 PVOID
3389 NTAPI
3390 RtlImageRvaToVa(
3391 _In_ PIMAGE_NT_HEADERS NtHeader,
3392 _In_ PVOID BaseAddress,
3393 _In_ ULONG Rva,
3394 _Out_ PIMAGE_SECTION_HEADER *SectionHeader
3395 );
3396
3397 NTSYSAPI
3398 PIMAGE_NT_HEADERS
3399 NTAPI
3400 RtlImageNtHeader(
3401 _In_ PVOID BaseAddress);
3402
3403 NTSYSAPI
3404 NTSTATUS
3405 NTAPI
3406 RtlImageNtHeaderEx(
3407 _In_ ULONG Flags,
3408 _In_ PVOID BaseAddress,
3409 _In_ ULONGLONG Size,
3410 _In_ PIMAGE_NT_HEADERS *NtHeader
3411 );
3412
3413 NTSYSAPI
3414 PIMAGE_SECTION_HEADER
3415 NTAPI
3416 RtlImageRvaToSection(
3417 _In_ PIMAGE_NT_HEADERS NtHeader,
3418 _In_ PVOID BaseAddress,
3419 _In_ ULONG Rva
3420 );
3421
3422 NTSYSAPI
3423 ULONG
3424 NTAPI
3425 LdrRelocateImageWithBias(
3426 _In_ PVOID NewAddress,
3427 _In_ LONGLONG AdditionalBias,
3428 _In_ PCCH LoaderName,
3429 _In_ ULONG Success,
3430 _In_ ULONG Conflict,
3431 _In_ ULONG Invalid
3432 );
3433
3434 //
3435 // Activation Context Functions
3436 //
3437 #ifdef NTOS_MODE_USER
3438 NTSYSAPI
3439 NTSTATUS
3440 NTAPI
3441 RtlActivateActivationContextEx(
3442 _In_ ULONG Flags,
3443 _In_ PTEB Teb,
3444 _In_ PVOID Context,
3445 _In_ PULONG_PTR Cookie
3446 );
3447
3448 NTSYSAPI
3449 NTSTATUS
3450 NTAPI
3451 RtlActivateActivationContext(
3452 _In_ ULONG Flags,
3453 _In_ HANDLE Handle,
3454 _Out_ PULONG_PTR Cookie
3455 );
3456
3457 NTSYSAPI
3458 VOID
3459 NTAPI
3460 RtlAddRefActivationContext(
3461 _In_ PVOID Context
3462 );
3463
3464 NTSYSAPI
3465 PRTL_ACTIVATION_CONTEXT_STACK_FRAME
3466 FASTCALL
3467 RtlActivateActivationContextUnsafeFast(
3468 _In_ PRTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED Frame,
3469 _In_ PVOID Context
3470 );
3471
3472 NTSYSAPI
3473 NTSTATUS
3474 NTAPI
3475 RtlAllocateActivationContextStack(
3476 _In_ PVOID *Context
3477 );
3478
3479 NTSYSAPI
3480 NTSTATUS
3481 NTAPI
3482 RtlCreateActivationContext(
3483 _Out_ PHANDLE Handle,
3484 _Inout_ PVOID ReturnedData
3485 );
3486
3487 NTSYSAPI
3488 NTSTATUS
3489 NTAPI
3490 RtlGetActiveActivationContext(
3491 _In_ PVOID *Context
3492 );
3493
3494 NTSYSAPI
3495 VOID
3496 NTAPI
3497 RtlReleaseActivationContext(
3498 _In_ HANDLE handle
3499 );
3500
3501 NTSYSAPI
3502 NTSTATUS
3503 NTAPI
3504 RtlDeactivateActivationContext(
3505 _In_ ULONG dwFlags,
3506 _In_ ULONG_PTR ulCookie
3507 );
3508
3509 NTSYSAPI
3510 VOID
3511 NTAPI
3512 RtlFreeThreadActivationContextStack(void);
3513
3514 NTSYSAPI
3515 PRTL_ACTIVATION_CONTEXT_STACK_FRAME
3516 FASTCALL
3517 RtlDeactivateActivationContextUnsafeFast(
3518 _In_ PRTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED Frame
3519 );
3520
3521 NTSYSAPI
3522 NTSTATUS
3523 NTAPI
3524 RtlDosApplyFileIsolationRedirection_Ustr(
3525 _In_ ULONG Flags,
3526 _In_ PUNICODE_STRING OriginalName,
3527 _In_ PUNICODE_STRING Extension,
3528 _Inout_ PUNICODE_STRING StaticString,
3529 _Inout_ PUNICODE_STRING DynamicString,
3530 _Inout_ PUNICODE_STRING *NewName,
3531 _In_ PULONG NewFlags,
3532 _In_ PSIZE_T FileNameSize,
3533 _In_ PSIZE_T RequiredLength
3534 );
3535
3536 NTSYSAPI
3537 NTSTATUS
3538 NTAPI
3539 RtlFindActivationContextSectionString(
3540 _In_ ULONG dwFlags,
3541 _In_ const GUID *ExtensionGuid,
3542 _In_ ULONG SectionType,
3543 _In_ PUNICODE_STRING SectionName,
3544 _Inout_ PVOID ReturnedData
3545 );
3546
3547 NTSYSAPI
3548 NTSTATUS
3549 NTAPI
3550 RtlQueryInformationActivationContext(
3551 _In_ DWORD dwFlags,
3552 _In_ PVOID Context,
3553 _In_ PVOID pvSubInstance,
3554 _In_ ULONG ulInfoClass,
3555 _Out_bytecap_(cbBufer) PVOID pvBuffer,
3556 _In_opt_ SIZE_T cbBuffer,
3557 _Out_opt_ SIZE_T *pcbWrittenOrRequired
3558 );
3559
3560 NTSYSAPI
3561 NTSTATUS
3562 NTAPI
3563 RtlZombifyActivationContext(
3564 PVOID Context
3565 );
3566
3567 //
3568 // WOW64 Functions
3569 //
3570 NTSYSAPI
3571 NTSTATUS
3572 NTAPI
3573 RtlWow64EnableFsRedirection(
3574 _In_ BOOLEAN Wow64FsEnableRedirection
3575 );
3576
3577 NTSYSAPI
3578 NTSTATUS
3579 NTAPI
3580 RtlWow64EnableFsRedirectionEx(
3581 _In_ PVOID Wow64FsEnableRedirection,
3582 _Out_ PVOID *OldFsRedirectionLevel
3583 );
3584
3585 #endif
3586
3587 //
3588 // Registry Functions
3589 //
3590 NTSYSAPI
3591 NTSTATUS
3592 NTAPI
3593 RtlCheckRegistryKey(
3594 _In_ ULONG RelativeTo,
3595 _In_z_ PWSTR Path
3596 );
3597
3598 NTSYSAPI
3599 NTSTATUS
3600 NTAPI
3601 RtlCreateRegistryKey(
3602 _In_ ULONG RelativeTo,
3603 _In_ PWSTR Path
3604 );
3605
3606 NTSYSAPI
3607 NTSTATUS
3608 NTAPI
3609 RtlFormatCurrentUserKeyPath(
3610 _Inout_ PUNICODE_STRING KeyPath
3611 );
3612
3613 NTSYSAPI
3614 NTSTATUS
3615 NTAPI
3616 RtlOpenCurrentUser(
3617 _In_ ACCESS_MASK DesiredAccess,
3618 _Out_ PHANDLE KeyHandle
3619 );
3620
3621 _IRQL_requires_max_(PASSIVE_LEVEL)
3622 NTSYSAPI
3623 NTSTATUS
3624 NTAPI
3625 RtlQueryRegistryValues(
3626 _In_ ULONG RelativeTo,
3627 _In_ PCWSTR Path,
3628 _Inout_ _At_(*(*QueryTable).EntryContext, _Pre_unknown_)
3629 PRTL_QUERY_REGISTRY_TABLE QueryTable,
3630 _In_opt_ PVOID Context,
3631 _In_opt_ PVOID Environment
3632 );
3633
3634 _IRQL_requires_max_(PASSIVE_LEVEL)
3635 NTSYSAPI
3636 NTSTATUS
3637 NTAPI
3638 RtlWriteRegistryValue(
3639 _In_ ULONG RelativeTo,
3640 _In_ PCWSTR Path,
3641 _In_z_ PCWSTR ValueName,
3642 _In_ ULONG ValueType,
3643 _In_reads_bytes_opt_(ValueLength) PVOID ValueData,
3644 _In_ ULONG ValueLength
3645 );
3646
3647 #ifdef NTOS_MODE_USER
3648 NTSYSAPI
3649 NTSTATUS
3650 NTAPI
3651 RtlpNtCreateKey(
3652 _Out_ HANDLE KeyHandle,
3653 _In_ ACCESS_MASK DesiredAccess,
3654 _In_ POBJECT_ATTRIBUTES ObjectAttributes,
3655 _In_ ULONG TitleIndex,
3656 _In_ PUNICODE_STRING Class,
3657 _Out_ PULONG Disposition
3658 );
3659
3660 NTSYSAPI
3661 NTSTATUS
3662 NTAPI
3663 RtlpNtEnumerateSubKey(
3664 _In_ HANDLE KeyHandle,
3665 _Out_ PUNICODE_STRING SubKeyName,
3666 _In_ ULONG Index,
3667 _In_ ULONG Unused
3668 );
3669
3670 NTSYSAPI
3671 NTSTATUS
3672 NTAPI
3673 RtlpNtMakeTemporaryKey(
3674 _In_ HANDLE KeyHandle
3675 );
3676
3677 NTSYSAPI
3678 NTSTATUS
3679 NTAPI
3680 RtlpNtOpenKey(
3681 _Out_ HANDLE KeyHandle,
3682 _In_ ACCESS_MASK DesiredAccess,
3683 _In_ POBJECT_ATTRIBUTES ObjectAttributes,
3684 _In_ ULONG Unused
3685 );
3686
3687 NTSYSAPI
3688 NTSTATUS
3689 NTAPI
3690 RtlpNtQueryValueKey(
3691 _In_ HANDLE KeyHandle,
3692 _Out_opt_ PULONG Type,
3693 _Out_opt_ PVOID Data,
3694 _Inout_opt_ PULONG DataLength,
3695 _In_ ULONG Unused
3696 );
3697
3698 NTSYSAPI
3699 NTSTATUS
3700 NTAPI
3701 RtlpNtSetValueKey(
3702 _In_ HANDLE KeyHandle,
3703 _In_ ULONG Type,
3704 _In_ PVOID Data,
3705 _In_ ULONG DataLength
3706 );
3707 #endif
3708
3709 //
3710 // NLS Functions
3711 //
3712 NTSYSAPI
3713 VOID
3714 NTAPI
3715 RtlGetDefaultCodePage(
3716 _Out_ PUSHORT AnsiCodePage,
3717 _Out_ PUSHORT OemCodePage
3718 );
3719
3720 NTSYSAPI
3721 VOID
3722 NTAPI
3723 RtlInitNlsTables(
3724 _In_ PUSHORT AnsiTableBase,
3725 _In_ PUSHORT OemTableBase,
3726 _In_ PUSHORT CaseTableBase,
3727 _Out_ PNLSTABLEINFO NlsTable
3728 );
3729
3730 _IRQL_requires_max_(PASSIVE_LEVEL)
3731 NTSYSAPI
3732 VOID
3733 NTAPI
3734 RtlInitCodePageTable(
3735 _In_ PUSHORT TableBase,
3736 _Inout_ PCPTABLEINFO CodePageTable
3737 );
3738
3739 NTSYSAPI
3740 VOID
3741 NTAPI
3742 RtlResetRtlTranslations(
3743 _In_ PNLSTABLEINFO NlsTable);
3744
3745 #if defined(NTOS_MODE_USER) && !defined(NO_RTL_INLINES)
3746
3747 //
3748 // Misc conversion functions
3749 //
3750 static __inline
3751 LARGE_INTEGER
3752 NTAPI_INLINE
3753 RtlConvertLongToLargeInteger(
3754 _In_ LONG SignedInteger
3755 )
3756 {
3757 LARGE_INTEGER Result;
3758
3759 Result.QuadPart = SignedInteger;
3760 return Result;
3761 }
3762
3763 static __inline
3764 LARGE_INTEGER
3765 NTAPI_INLINE
3766 RtlEnlargedIntegerMultiply(
3767 _In_ LONG Multiplicand,
3768 _In_ LONG Multiplier
3769 )
3770 {
3771 LARGE_INTEGER Product;
3772
3773 Product.QuadPart = (LONGLONG)Multiplicand * (ULONGLONG)Multiplier;
3774 return Product;
3775 }
3776
3777 static __inline
3778 ULONG
3779 NTAPI_INLINE
3780 RtlEnlargedUnsignedDivide(
3781 _In_ ULARGE_INTEGER Dividend,
3782 _In_ ULONG Divisor,
3783 _In_opt_ PULONG Remainder
3784 )
3785 {
3786 ULONG Quotient;
3787
3788 Quotient = (ULONG)(Dividend.QuadPart / Divisor);
3789 if (Remainder) {
3790 *Remainder = (ULONG)(Dividend.QuadPart % Divisor);
3791 }
3792
3793 return Quotient;
3794 }
3795
3796 static __inline
3797 LARGE_INTEGER
3798 NTAPI_INLINE
3799 RtlEnlargedUnsignedMultiply(
3800 _In_ ULONG Multiplicand,
3801 _In_ ULONG Multiplier
3802 )
3803 {
3804 LARGE_INTEGER Product;
3805
3806 Product.QuadPart = (ULONGLONG)Multiplicand * (ULONGLONG)Multiplier;
3807 return Product;
3808 }
3809
3810 #if defined(_AMD64_) || defined(_IA64_)
3811 static __inline
3812 LARGE_INTEGER
3813 NTAPI_INLINE
3814 RtlExtendedLargeIntegerDivide(
3815 _In_ LARGE_INTEGER Dividend,
3816 _In_ ULONG Divisor,
3817 _Out_opt_ PULONG Remainder)
3818 {
3819 LARGE_INTEGER ret;
3820 ret.QuadPart = (ULONG64)Dividend.QuadPart / Divisor;
3821 if (Remainder)
3822 *Remainder = (ULONG)(Dividend.QuadPart % Divisor);
3823 return ret;
3824 }
3825
3826 #else
3827 NTSYSAPI
3828 LARGE_INTEGER
3829 NTAPI
3830 RtlExtendedLargeIntegerDivide(
3831 _In_ LARGE_INTEGER Dividend,
3832 _In_ ULONG Divisor,
3833 _Out_opt_ PULONG Remainder
3834 );
3835
3836 #endif /* defined(_AMD64_) || defined(_IA64_) */
3837
3838 #endif
3839
3840
3841 NTSYSAPI
3842 ULONG
3843 NTAPI
3844 RtlUniform(
3845 _In_ PULONG Seed
3846 );
3847
3848 NTSYSAPI
3849 ULONG
3850 NTAPI
3851 RtlRandom(
3852 _Inout_ PULONG Seed
3853 );
3854
3855 NTSYSAPI
3856 ULONG
3857 NTAPI
3858 RtlComputeCrc32(
3859 _In_ ULONG InitialCrc,
3860 _In_ PUCHAR Buffer,
3861 _In_ ULONG Length
3862 );
3863
3864 //
3865 // Network Functions
3866 //
3867 NTSYSAPI
3868 NTSTATUS
3869 NTAPI
3870 RtlIpv4StringToAddressW(
3871 _In_ PCWSTR String,
3872 _In_ BOOLEAN Strict,
3873 _Out_ LPWSTR *Terminator,
3874 _Out_ struct in_addr *Addr
3875 );
3876
3877 NTSYSAPI
3878 NTSTATUS
3879 NTAPI
3880 RtlIpv6StringToAddressA(
3881 _In_ PCHAR Name,
3882 _Out_ PCHAR *Terminator,
3883 _Out_ struct in6_addr *Addr
3884 );
3885
3886 NTSYSAPI
3887 NTSTATUS
3888 NTAPI
3889 RtlIpv6StringToAddressW(
3890 _In_ PWCHAR Name,
3891 _Out_ PCHAR *Terminator,
3892 _Out_ struct in6_addr *Addr
3893 );
3894
3895 NTSYSAPI
3896 NTSTATUS
3897 NTAPI
3898 RtlIpv6StringToAddressExA(
3899 _In_ PCHAR AddressString,
3900 _In_ struct in6_addr *Address,
3901 _In_ PULONG ScopeId,
3902 _In_ PUSHORT Port
3903 );
3904
3905 NTSYSAPI
3906 NTSTATUS
3907 NTAPI
3908 RtlIpv6StringToAddressExW(
3909 _In_ PWCHAR AddressName,
3910 _In_ struct in6_addr *Address,
3911 _In_ PULONG ScopeId,
3912 _In_ PUSHORT Port
3913 );
3914
3915
3916 //
3917 // Time Functions
3918 //
3919 NTSYSAPI
3920 NTSTATUS
3921 NTAPI
3922 RtlQueryTimeZoneInformation(
3923 _Out_ PRTL_TIME_ZONE_INFORMATION TimeZoneInformation);
3924
3925 NTSYSAPI
3926 VOID
3927 NTAPI
3928 RtlSecondsSince1970ToTime(
3929 _In_ ULONG SecondsSince1970,
3930 _Out_ PLARGE_INTEGER Time
3931 );
3932
3933 NTSYSAPI
3934 NTSTATUS
3935 NTAPI
3936 RtlSetTimeZoneInformation(
3937 _In_ PRTL_TIME_ZONE_INFORMATION TimeZoneInformation);
3938
3939 NTSYSAPI
3940 BOOLEAN
3941 NTAPI
3942 RtlTimeFieldsToTime(
3943 _In_ PTIME_FIELDS TimeFields,
3944 _Out_ PLARGE_INTEGER Time
3945 );
3946
3947 NTSYSAPI
3948 BOOLEAN
3949 NTAPI
3950 RtlTimeToSecondsSince1970(
3951 PLARGE_INTEGER Time,
3952 _Out_ PULONG SecondsSince1970
3953 );
3954
3955 NTSYSAPI
3956 VOID
3957 NTAPI
3958 RtlTimeToTimeFields(
3959 PLARGE_INTEGER Time,
3960 PTIME_FIELDS TimeFields
3961 );
3962
3963 NTSYSAPI
3964 NTSTATUS
3965 NTAPI
3966 RtlSystemTimeToLocalTime(
3967 _In_ PLARGE_INTEGER SystemTime,
3968 _Out_ PLARGE_INTEGER LocalTime
3969 );
3970
3971 //
3972 // Version Functions
3973 //
3974 _IRQL_requires_max_(PASSIVE_LEVEL)
3975 _Must_inspect_result_
3976 NTSYSAPI
3977 NTSTATUS
3978 NTAPI
3979 RtlVerifyVersionInfo(
3980 _In_ PRTL_OSVERSIONINFOEXW VersionInfo,
3981 _In_ ULONG TypeMask,
3982 _In_ ULONGLONG ConditionMask
3983 );
3984
3985 _IRQL_requires_max_(PASSIVE_LEVEL)
3986 NTSYSAPI
3987 NTSTATUS
3988 NTAPI
3989 RtlGetVersion(
3990 _Out_
3991 _At_(lpVersionInformation->dwOSVersionInfoSize, _Pre_ _Valid_)
3992 _When_(lpVersionInformation->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOEXW),
3993 _At_((PRTL_OSVERSIONINFOEXW)lpVersionInformation, _Out_))
3994 PRTL_OSVERSIONINFOW lpVersionInformation
3995 );
3996
3997 NTSYSAPI
3998 BOOLEAN
3999 NTAPI
4000 RtlGetNtProductType(OUT PNT_PRODUCT_TYPE ProductType);
4001
4002 //
4003 // Secure Memory Functions
4004 //
4005 #ifdef NTOS_MODE_USER
4006 NTSYSAPI
4007 NTSTATUS
4008 NTAPI
4009 RtlRegisterSecureMemoryCacheCallback(
4010 _In_ PRTL_SECURE_MEMORY_CACHE_CALLBACK Callback);
4011
4012 NTSYSAPI
4013 BOOLEAN
4014 NTAPI
4015 RtlFlushSecureMemoryCache(
4016 _In_ PVOID MemoryCache,
4017 _In_opt_ SIZE_T MemoryLength
4018 );
4019 #endif
4020
4021 //
4022 // Boot Status Data Functions
4023 //
4024 #ifdef NTOS_MODE_USER
4025 NTSYSAPI
4026 NTSTATUS
4027 NTAPI
4028 RtlCreateBootStatusDataFile(
4029 VOID
4030 );
4031
4032 NTSYSAPI
4033 NTSTATUS
4034 NTAPI
4035 RtlGetSetBootStatusData(
4036 _In_ HANDLE FileHandle,
4037 _In_ BOOLEAN WriteMode,
4038 _In_ RTL_BSD_ITEM_TYPE DataClass,
4039 _In_ PVOID Buffer,
4040 _In_ ULONG BufferSize,
4041 _Out_opt_ PULONG ReturnLength
4042 );
4043
4044 NTSYSAPI
4045 NTSTATUS
4046 NTAPI
4047 RtlLockBootStatusData(
4048 _Out_ PHANDLE FileHandle
4049 );
4050
4051 NTSYSAPI
4052 NTSTATUS
4053 NTAPI
4054 RtlUnlockBootStatusData(
4055 _In_ HANDLE FileHandle
4056 );
4057 #endif
4058
4059 #ifdef NTOS_MODE_USER
4060 NTSYSAPI
4061 NTSTATUS
4062 NTAPI
4063 RtlGUIDFromString(
4064 _In_ PUNICODE_STRING GuidString,
4065 _Out_ GUID *Guid);
4066
4067 NTSYSAPI
4068 NTSTATUS
4069 NTAPI
4070 RtlComputeImportTableHash(
4071 _In_ HANDLE hFile,
4072 _Out_ PCHAR Hash,
4073 _In_ ULONG ImportTableHashRevision
4074 );
4075 #endif
4076
4077 #ifdef __cplusplus
4078 }
4079 #endif
4080
4081 #endif