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
InitializeListHead(_Out_ PLIST_ENTRY ListHead)44 InitializeListHead(
45 _Out_ PLIST_ENTRY ListHead
46 )
47 {
48 ListHead->Flink = ListHead->Blink = ListHead;
49 }
50
51 FORCEINLINE
52 VOID
InsertHeadList(_Inout_ PLIST_ENTRY ListHead,_Inout_ PLIST_ENTRY Entry)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
InsertTailList(_Inout_ PLIST_ENTRY ListHead,_Inout_ PLIST_ENTRY Entry)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
IsListEmpty(_In_ const LIST_ENTRY * ListHead)84 IsListEmpty(
85 _In_ const LIST_ENTRY * ListHead
86 )
87 {
88 return (BOOLEAN)(ListHead->Flink == ListHead);
89 }
90
91 FORCEINLINE
92 PSINGLE_LIST_ENTRY
PopEntryList(_Inout_ PSINGLE_LIST_ENTRY ListHead)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
PushEntryList(_Inout_ PSINGLE_LIST_ENTRY ListHead,_Inout_ PSINGLE_LIST_ENTRY Entry)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
RemoveEntryList(_In_ PLIST_ENTRY Entry)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
RemoveHeadList(_Inout_ PLIST_ENTRY ListHead)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
RemoveTailList(_Inout_ PLIST_ENTRY ListHead)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
RtlConvertUlongToLuid(_In_ ULONG Ulong)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 _Must_inspect_result_
214 NTSYSAPI
215 NTSTATUS
216 NTAPI
217 RtlUTF8ToUnicodeN(
218 _Out_writes_bytes_to_(UnicodeStringMaxByteCount, *UnicodeStringActualByteCount)
219 PWSTR UnicodeStringDestination,
220 _In_ ULONG UnicodeStringMaxByteCount,
221 _Out_ PULONG UnicodeStringActualByteCount,
222 _In_reads_bytes_(UTF8StringByteCount) PCCH UTF8StringSource,
223 _In_ ULONG UTF8StringByteCount);
224
225 //
226 // ASSERT Macros
227 //
228 #ifndef ASSERT
229 #if DBG
230
231 #define ASSERT( exp ) \
232 ((void)((!(exp)) ? \
233 (RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, NULL ),FALSE) : \
234 TRUE))
235
236 #define ASSERTMSG( msg, exp ) \
237 ((void)((!(exp)) ? \
238 (RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, (PCHAR)msg ),FALSE) : \
239 TRUE))
240
241 #else
242
243 #define ASSERT( exp ) ((void) 0)
244 #define ASSERTMSG( msg, exp ) ((void) 0)
245
246 #endif
247 #endif
248
249 #ifdef NTOS_KERNEL_RUNTIME
250
251 //
252 // Executing RTL functions at DISPATCH_LEVEL or higher will result in a
253 // bugcheck.
254 //
255 #define RTL_PAGED_CODE PAGED_CODE
256
257 #else
258
259 //
260 // This macro does nothing in user mode
261 //
262 #define RTL_PAGED_CODE()
263
264 #endif
265
266 //
267 // RTL Splay Tree Functions
268 //
269 #ifndef RTL_USE_AVL_TABLES
270
271 NTSYSAPI
272 VOID
273 NTAPI
274 RtlInitializeGenericTable(
275 _Out_ PRTL_GENERIC_TABLE Table,
276 _In_ PRTL_GENERIC_COMPARE_ROUTINE CompareRoutine,
277 _In_opt_ PRTL_GENERIC_ALLOCATE_ROUTINE AllocateRoutine,
278 _In_opt_ PRTL_GENERIC_FREE_ROUTINE FreeRoutine,
279 _In_opt_ PVOID TableContext
280 );
281
282 NTSYSAPI
283 PVOID
284 NTAPI
285 RtlInsertElementGenericTable(
286 _In_ PRTL_GENERIC_TABLE Table,
287 _In_reads_bytes_(BufferSize) PVOID Buffer,
288 _In_ CLONG BufferSize,
289 _Out_opt_ PBOOLEAN NewElement
290 );
291
292 NTSYSAPI
293 PVOID
294 NTAPI
295 RtlInsertElementGenericTableFull(
296 _In_ PRTL_GENERIC_TABLE Table,
297 _In_reads_bytes_(BufferSize) PVOID Buffer,
298 _In_ CLONG BufferSize,
299 _Out_opt_ PBOOLEAN NewElement,
300 _In_ PVOID NodeOrParent,
301 _In_ TABLE_SEARCH_RESULT SearchResult
302 );
303
304 NTSYSAPI
305 BOOLEAN
306 NTAPI
307 RtlDeleteElementGenericTable(
308 _In_ PRTL_GENERIC_TABLE Table,
309 _In_ PVOID Buffer
310 );
311
312 _Must_inspect_result_
313 NTSYSAPI
314 PVOID
315 NTAPI
316 RtlLookupElementGenericTable(
317 _In_ PRTL_GENERIC_TABLE Table,
318 _In_ PVOID Buffer
319 );
320
321 NTSYSAPI
322 PVOID
323 NTAPI
324 RtlLookupElementGenericTableFull(
325 _In_ PRTL_GENERIC_TABLE Table,
326 _In_ PVOID Buffer,
327 _Out_ PVOID *NodeOrParent,
328 _Out_ TABLE_SEARCH_RESULT *SearchResult
329 );
330
331 _Must_inspect_result_
332 NTSYSAPI
333 PVOID
334 NTAPI
335 RtlEnumerateGenericTable(
336 _In_ PRTL_GENERIC_TABLE Table,
337 _In_ BOOLEAN Restart
338 );
339
340 _Must_inspect_result_
341 NTSYSAPI
342 PVOID
343 NTAPI
344 RtlEnumerateGenericTableWithoutSplaying(
345 _In_ PRTL_GENERIC_TABLE Table,
346 _Inout_ PVOID *RestartKey
347 );
348
349 _Must_inspect_result_
350 NTSYSAPI
351 PVOID
352 NTAPI
353 RtlGetElementGenericTable(
354 _In_ PRTL_GENERIC_TABLE Table,
355 _In_ ULONG I
356 );
357
358 NTSYSAPI
359 ULONG
360 NTAPI
361 RtlNumberGenericTableElements(
362 _In_ PRTL_GENERIC_TABLE Table
363 );
364
365 _Must_inspect_result_
366 NTSYSAPI
367 BOOLEAN
368 NTAPI
369 RtlIsGenericTableEmpty(
370 _In_ PRTL_GENERIC_TABLE Table
371 );
372
373 #endif /* !RTL_USE_AVL_TABLES */
374
375 NTSYSAPI
376 PRTL_SPLAY_LINKS
377 NTAPI
378 RtlSplay(
379 _Inout_ PRTL_SPLAY_LINKS Links
380 );
381
382 NTSYSAPI
383 PRTL_SPLAY_LINKS
384 NTAPI
385 RtlDelete(
386 _In_ PRTL_SPLAY_LINKS Links
387 );
388
389 NTSYSAPI
390 VOID
391 NTAPI
392 RtlDeleteNoSplay(
393 _In_ PRTL_SPLAY_LINKS Links,
394 _Inout_ PRTL_SPLAY_LINKS *Root
395 );
396
397 _Must_inspect_result_
398 NTSYSAPI
399 PRTL_SPLAY_LINKS
400 NTAPI
401 RtlSubtreeSuccessor(
402 _In_ PRTL_SPLAY_LINKS Links
403 );
404
405 _Must_inspect_result_
406 NTSYSAPI
407 PRTL_SPLAY_LINKS
408 NTAPI
409 RtlSubtreePredecessor(
410 _In_ PRTL_SPLAY_LINKS Links
411 );
412
413 _Must_inspect_result_
414 NTSYSAPI
415 PRTL_SPLAY_LINKS
416 NTAPI
417 RtlRealSuccessor(
418 _In_ PRTL_SPLAY_LINKS Links
419 );
420
421 _Must_inspect_result_
422 NTSYSAPI
423 PRTL_SPLAY_LINKS
424 NTAPI
425 RtlRealPredecessor(
426 _In_ PRTL_SPLAY_LINKS Links
427 );
428
429 #define RtlIsLeftChild(Links) \
430 (RtlLeftChild(RtlParent(Links)) == (PRTL_SPLAY_LINKS)(Links))
431
432 #define RtlIsRightChild(Links) \
433 (RtlRightChild(RtlParent(Links)) == (PRTL_SPLAY_LINKS)(Links))
434
435 #define RtlRightChild(Links) \
436 ((PRTL_SPLAY_LINKS)(Links))->RightChild
437
438 #define RtlIsRoot(Links) \
439 (RtlParent(Links) == (PRTL_SPLAY_LINKS)(Links))
440
441 #define RtlLeftChild(Links) \
442 ((PRTL_SPLAY_LINKS)(Links))->LeftChild
443
444 #define RtlParent(Links) \
445 ((PRTL_SPLAY_LINKS)(Links))->Parent
446
447 // FIXME: use inline function
448
449 #define RtlInitializeSplayLinks(Links) \
450 { \
451 PRTL_SPLAY_LINKS _SplayLinks; \
452 _SplayLinks = (PRTL_SPLAY_LINKS)(Links); \
453 _SplayLinks->Parent = _SplayLinks; \
454 _SplayLinks->LeftChild = NULL; \
455 _SplayLinks->RightChild = NULL; \
456 }
457
458 #define RtlInsertAsLeftChild(ParentLinks,ChildLinks) \
459 { \
460 PRTL_SPLAY_LINKS _SplayParent; \
461 PRTL_SPLAY_LINKS _SplayChild; \
462 _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks); \
463 _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks); \
464 _SplayParent->LeftChild = _SplayChild; \
465 _SplayChild->Parent = _SplayParent; \
466 }
467
468 #define RtlInsertAsRightChild(ParentLinks,ChildLinks) \
469 { \
470 PRTL_SPLAY_LINKS _SplayParent; \
471 PRTL_SPLAY_LINKS _SplayChild; \
472 _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks); \
473 _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks); \
474 _SplayParent->RightChild = _SplayChild; \
475 _SplayChild->Parent = _SplayParent; \
476 }
477
478 //
479 // RTL AVL Tree Functions
480 //
481 NTSYSAPI
482 VOID
483 NTAPI
484 RtlInitializeGenericTableAvl(
485 _Out_ PRTL_AVL_TABLE Table,
486 _In_ PRTL_AVL_COMPARE_ROUTINE CompareRoutine,
487 _In_opt_ PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine,
488 _In_opt_ PRTL_AVL_FREE_ROUTINE FreeRoutine,
489 _In_opt_ PVOID TableContext
490 );
491
492 NTSYSAPI
493 PVOID
494 NTAPI
495 RtlInsertElementGenericTableAvl(
496 _In_ PRTL_AVL_TABLE Table,
497 _In_reads_bytes_(BufferSize) PVOID Buffer,
498 _In_ CLONG BufferSize,
499 _Out_opt_ PBOOLEAN NewElement
500 );
501
502 NTSYSAPI
503 PVOID
504 NTAPI
505 RtlInsertElementGenericTableFullAvl(
506 _In_ PRTL_AVL_TABLE Table,
507 _In_reads_bytes_(BufferSize) PVOID Buffer,
508 _In_ CLONG BufferSize,
509 _Out_opt_ PBOOLEAN NewElement,
510 _In_ PVOID NodeOrParent,
511 _In_ TABLE_SEARCH_RESULT SearchResult
512 );
513
514 NTSYSAPI
515 BOOLEAN
516 NTAPI
517 RtlDeleteElementGenericTableAvl(
518 _In_ PRTL_AVL_TABLE Table,
519 _In_ PVOID Buffer
520 );
521
522 _Must_inspect_result_
523 NTSYSAPI
524 PVOID
525 NTAPI
526 RtlLookupElementGenericTableAvl(
527 _In_ PRTL_AVL_TABLE Table,
528 _In_ PVOID Buffer
529 );
530
531 NTSYSAPI
532 PVOID
533 NTAPI
534 RtlLookupElementGenericTableFullAvl(
535 _In_ PRTL_AVL_TABLE Table,
536 _In_ PVOID Buffer,
537 _Out_ PVOID *NodeOrParent,
538 _Out_ TABLE_SEARCH_RESULT *SearchResult
539 );
540
541 _Must_inspect_result_
542 NTSYSAPI
543 PVOID
544 NTAPI
545 RtlEnumerateGenericTableAvl(
546 _In_ PRTL_AVL_TABLE Table,
547 _In_ BOOLEAN Restart
548 );
549
550 _Must_inspect_result_
551 NTSYSAPI
552 PVOID
553 NTAPI
554 RtlEnumerateGenericTableWithoutSplayingAvl(
555 _In_ PRTL_AVL_TABLE Table,
556 _Inout_ PVOID *RestartKey
557 );
558
559 _Must_inspect_result_
560 NTSYSAPI
561 PVOID
562 NTAPI
563 RtlLookupFirstMatchingElementGenericTableAvl(
564 _In_ PRTL_AVL_TABLE Table,
565 _In_ PVOID Buffer,
566 _Out_ PVOID *RestartKey
567 );
568
569 _Must_inspect_result_
570 NTSYSAPI
571 PVOID
572 NTAPI
573 RtlEnumerateGenericTableLikeADirectory(
574 _In_ PRTL_AVL_TABLE Table,
575 _In_opt_ PRTL_AVL_MATCH_FUNCTION MatchFunction,
576 _In_opt_ PVOID MatchData,
577 _In_ ULONG NextFlag,
578 _Inout_ PVOID *RestartKey,
579 _Inout_ PULONG DeleteCount,
580 _In_ PVOID Buffer
581 );
582
583 _Must_inspect_result_
584 NTSYSAPI
585 PVOID
586 NTAPI
587 RtlGetElementGenericTableAvl(
588 _In_ PRTL_AVL_TABLE Table,
589 _In_ ULONG I
590 );
591
592 NTSYSAPI
593 ULONG
594 NTAPI
595 RtlNumberGenericTableElementsAvl(
596 _In_ PRTL_AVL_TABLE Table
597 );
598
599 _Must_inspect_result_
600 NTSYSAPI
601 BOOLEAN
602 NTAPI
603 RtlIsGenericTableEmptyAvl(
604 _In_ PRTL_AVL_TABLE Table
605 );
606
607 #ifdef RTL_USE_AVL_TABLES
608
609 #define RtlInitializeGenericTable RtlInitializeGenericTableAvl
610 #define RtlInsertElementGenericTable RtlInsertElementGenericTableAvl
611 #define RtlInsertElementGenericTableFull RtlInsertElementGenericTableFullAvl
612 #define RtlDeleteElementGenericTable RtlDeleteElementGenericTableAvl
613 #define RtlLookupElementGenericTable RtlLookupElementGenericTableAvl
614 #define RtlLookupElementGenericTableFull RtlLookupElementGenericTableFullAvl
615 #define RtlEnumerateGenericTable RtlEnumerateGenericTableAvl
616 #define RtlEnumerateGenericTableWithoutSplaying RtlEnumerateGenericTableWithoutSplayingAvl
617 #define RtlGetElementGenericTable RtlGetElementGenericTableAvl
618 #define RtlNumberGenericTableElements RtlNumberGenericTableElementsAvl
619 #define RtlIsGenericTableEmpty RtlIsGenericTableEmptyAvl
620
621 #endif /* RTL_USE_AVL_TABLES */
622
623 //
624 // Exception and Error Functions
625 //
626 NTSYSAPI
627 PVOID
628 NTAPI
629 RtlAddVectoredExceptionHandler(
630 _In_ ULONG FirstHandler,
631 _In_ PVECTORED_EXCEPTION_HANDLER VectoredHandler
632 );
633
634 NTSYSAPI
635 ULONG
636 NTAPI
637 RtlRemoveVectoredExceptionHandler(
638 _In_ PVOID VectoredHandlerHandle
639 );
640
641 NTSYSAPI
642 PVOID
643 NTAPI
644 RtlAddVectoredContinueHandler(
645 _In_ ULONG FirstHandler,
646 _In_ PVECTORED_EXCEPTION_HANDLER VectoredHandler
647 );
648
649 NTSYSAPI
650 ULONG
651 NTAPI
652 RtlRemoveVectoredContinueHandler(
653 _In_ PVOID VectoredHandlerHandle
654 );
655
656 NTSYSAPI
657 VOID
658 NTAPI
659 RtlSetUnhandledExceptionFilter(
660 _In_ PRTLP_UNHANDLED_EXCEPTION_FILTER TopLevelExceptionFilter
661 );
662
663 NTSYSAPI
664 LONG
665 NTAPI
666 RtlUnhandledExceptionFilter(
667 _In_ struct _EXCEPTION_POINTERS* ExceptionInfo
668 );
669
670 __analysis_noreturn
671 NTSYSAPI
672 VOID
673 NTAPI
674 RtlAssert(
675 _In_ PVOID FailedAssertion,
676 _In_ PVOID FileName,
677 _In_ ULONG LineNumber,
678 _In_opt_z_ PCHAR Message
679 );
680
681 NTSYSAPI
682 PVOID
683 NTAPI
684 RtlEncodePointer(
685 _In_ PVOID Pointer
686 );
687
688 NTSYSAPI
689 PVOID
690 NTAPI
691 RtlDecodePointer(
692 _In_ PVOID Pointer
693 );
694
695 NTSYSAPI
696 PVOID
697 NTAPI
698 RtlEncodeSystemPointer(
699 _In_ PVOID Pointer
700 );
701
702 NTSYSAPI
703 PVOID
704 NTAPI
705 RtlDecodeSystemPointer(
706 _In_ PVOID Pointer
707 );
708
709 NTSYSAPI
710 NTSTATUS
711 NTAPI
712 RtlGetLastNtStatus(
713 VOID
714 );
715
716 NTSYSAPI
717 ULONG
718 NTAPI
719 RtlGetLastWin32Error(
720 VOID
721 );
722
723 NTSYSAPI
724 VOID
725 NTAPI
726 RtlSetLastWin32Error(
727 _In_ ULONG LastError
728 );
729
730 NTSYSAPI
731 VOID
732 NTAPI
733 RtlSetLastWin32ErrorAndNtStatusFromNtStatus(
734 _In_ NTSTATUS Status
735 );
736
737 NTSYSAPI
738 NTSTATUS
739 NTAPI
740 RtlSetThreadErrorMode(
741 _In_ ULONG NewMode,
742 _Out_opt_ PULONG OldMode
743 );
744
745 NTSYSAPI
746 ULONG
747 NTAPI
748 RtlGetThreadErrorMode(
749 VOID
750 );
751
752 #endif /* NTOS_MODE_USER */
753
754 NTSYSAPI
755 VOID
756 NTAPI
757 RtlCaptureContext(
758 _Out_ PCONTEXT ContextRecord
759 );
760
761 NTSYSAPI
762 BOOLEAN
763 NTAPI
764 RtlDispatchException(
765 _In_ PEXCEPTION_RECORD ExceptionRecord,
766 _In_ PCONTEXT Context
767 );
768
769 _IRQL_requires_max_(APC_LEVEL)
770 _When_(Status < 0, _Out_range_(>, 0))
771 _When_(Status >= 0, _Out_range_(==, 0))
772 NTSYSAPI
773 ULONG
774 NTAPI
775 RtlNtStatusToDosError(
776 _In_ NTSTATUS Status
777 );
778
779 _When_(Status < 0, _Out_range_(>, 0))
780 _When_(Status >= 0, _Out_range_(==, 0))
781 NTSYSAPI
782 ULONG
783 NTAPI
784 RtlNtStatusToDosErrorNoTeb(
785 _In_ NTSTATUS Status
786 );
787
788 NTSYSAPI
789 NTSTATUS
790 NTAPI
791 RtlMapSecurityErrorToNtStatus(
792 _In_ ULONG SecurityError
793 );
794
795 NTSYSAPI
796 VOID
797 NTAPI
798 RtlRaiseException(
799 _In_ PEXCEPTION_RECORD ExceptionRecord
800 );
801
802 DECLSPEC_NORETURN
803 NTSYSAPI
804 VOID
805 NTAPI
806 RtlRaiseStatus(
807 _In_ NTSTATUS Status
808 );
809
810 NTSYSAPI
811 VOID
812 NTAPI
813 RtlUnwind(
814 _In_opt_ PVOID TargetFrame,
815 _In_opt_ PVOID TargetIp,
816 _In_opt_ PEXCEPTION_RECORD ExceptionRecord,
817 _In_ PVOID ReturnValue
818 );
819
820 #define RTL_STACK_WALKING_MODE_FRAMES_TO_SKIP_SHIFT 8
821
822 #ifdef _M_AMD64
823
824 NTSYSAPI
825 PRUNTIME_FUNCTION
826 NTAPI
827 RtlLookupFunctionEntry(
828 _In_ DWORD64 ControlPc,
829 _Out_ PDWORD64 ImageBase,
830 _Inout_opt_ PUNWIND_HISTORY_TABLE HistoryTable
831 );
832
833 NTSYSAPI
834 PEXCEPTION_ROUTINE
835 NTAPI
836 RtlVirtualUnwind(
837 _In_ ULONG HandlerType,
838 _In_ ULONG64 ImageBase,
839 _In_ ULONG64 ControlPc,
840 _In_ PRUNTIME_FUNCTION FunctionEntry,
841 _Inout_ PCONTEXT Context,
842 _Outptr_ PVOID* HandlerData,
843 _Out_ PULONG64 EstablisherFrame,
844 _Inout_opt_ PKNONVOLATILE_CONTEXT_POINTERS ContextPointers
845 );
846
847 #endif // _M_AMD64
848
849 //
850 // Tracing Functions
851 //
852 NTSYSAPI
853 ULONG
854 NTAPI
855 RtlWalkFrameChain(
856 _Out_writes_(Count - (Flags >> RTL_STACK_WALKING_MODE_FRAMES_TO_SKIP_SHIFT)) PVOID *Callers,
857 _In_ ULONG Count,
858 _In_ ULONG Flags
859 );
860
861 NTSYSAPI
862 USHORT
863 NTAPI
864 RtlLogStackBackTrace(
865 VOID
866 );
867
868 #ifdef NTOS_MODE_USER
869 //
870 // Heap Functions
871 //
872 _Must_inspect_result_
873 _Ret_maybenull_
874 _Post_writable_byte_size_(Size)
875 NTSYSAPI
876 PVOID
877 NTAPI
878 RtlAllocateHeap(
879 _In_ PVOID HeapHandle,
880 _In_opt_ ULONG Flags,
881 _In_ SIZE_T Size
882 );
883
884 _Must_inspect_result_
885 NTSYSAPI
886 PVOID
887 NTAPI
888 RtlCreateHeap(
889 _In_ ULONG Flags,
890 _In_opt_ PVOID BaseAddress,
891 _In_opt_ SIZE_T SizeToReserve,
892 _In_opt_ SIZE_T SizeToCommit,
893 _In_opt_ PVOID Lock,
894 _In_opt_ PRTL_HEAP_PARAMETERS Parameters
895 );
896
897 NTSYSAPI
898 ULONG
899 NTAPI
900 RtlCreateTagHeap(
901 _In_ HANDLE HeapHandle,
902 _In_ ULONG Flags,
903 _In_opt_ PWSTR TagName,
904 _In_ PWSTR TagSubName
905 );
906
907 ULONG
908 NTAPI
909 RtlCompactHeap(
910 _In_ HANDLE Heap,
911 _In_ ULONG Flags
912 );
913
914 _Must_inspect_result_
915 NTSYSAPI
916 PVOID
917 NTAPI
918 RtlDebugCreateHeap(
919 _In_ ULONG Flags,
920 _In_opt_ PVOID BaseAddress,
921 _In_opt_ SIZE_T SizeToReserve,
922 _In_opt_ SIZE_T SizeToCommit,
923 _In_opt_ PVOID Lock,
924 _In_opt_ PRTL_HEAP_PARAMETERS Parameters
925 );
926
927 NTSYSAPI
928 HANDLE
929 NTAPI
930 RtlDestroyHeap(
931 _In_ _Post_invalid_ HANDLE Heap
932 );
933
934 NTSYSAPI
935 ULONG
936 NTAPI
937 RtlExtendHeap(
938 _In_ HANDLE Heap,
939 _In_ ULONG Flags,
940 _In_ PVOID P,
941 _In_ SIZE_T Size
942 );
943
944 _Success_(return != 0)
945 NTSYSAPI
946 BOOLEAN
947 NTAPI
948 RtlFreeHeap(
949 _In_ HANDLE HeapHandle,
950 _In_opt_ ULONG Flags,
951 _In_ _Post_invalid_ PVOID P
952 );
953
954 ULONG
955 NTAPI
956 RtlGetProcessHeaps(
957 _In_ ULONG HeapCount,
958 _Out_cap_(HeapCount) HANDLE *HeapArray
959 );
960
961 _Success_(return != 0)
962 BOOLEAN
963 NTAPI
964 RtlGetUserInfoHeap(
965 _In_ PVOID HeapHandle,
966 _In_ ULONG Flags,
967 _In_ PVOID BaseAddress,
968 _Inout_opt_ PVOID *UserValue,
969 _Out_opt_ PULONG UserFlags
970 );
971
972 NTSYSAPI
973 PVOID
974 NTAPI
975 RtlProtectHeap(
976 _In_ PVOID HeapHandle,
977 _In_ BOOLEAN Protect
978 );
979
980 NTSYSAPI
981 NTSTATUS
982 NTAPI
983 RtlQueryHeapInformation(
984 _In_ PVOID HeapHandle,
985 _In_ HEAP_INFORMATION_CLASS HeapInformationClass,
986 _Out_ PVOID HeapInformation,
987 _In_ SIZE_T HeapInformationLength,
988 _When_(HeapInformationClass==HeapCompatibilityInformation, _On_failure_(_Out_opt_))
989 _Out_opt_ PSIZE_T ReturnLength
990 );
991
992 _Ret_opt_z_
993 NTSYSAPI
994 PWSTR
995 NTAPI
996 RtlQueryTagHeap(
997 _In_ PVOID HeapHandle,
998 _In_ ULONG Flags,
999 _In_ USHORT TagIndex,
1000 _In_ BOOLEAN ResetCounters,
1001 _Out_ PRTL_HEAP_TAG_INFO HeapTagInfo
1002 );
1003
1004 _Must_inspect_result_
1005 _Ret_maybenull_
1006 _Post_writable_byte_size_(Size)
1007 NTSYSAPI
1008 PVOID
1009 NTAPI
1010 RtlReAllocateHeap(
1011 _In_ HANDLE Heap,
1012 _In_opt_ ULONG Flags,
1013 _In_ _Post_invalid_ PVOID Ptr,
1014 _In_ SIZE_T Size
1015 );
1016
1017 NTSYSAPI
1018 NTSTATUS
1019 NTAPI
1020 RtlSetHeapInformation(
1021 _In_ PVOID HeapHandle,
1022 _In_ HEAP_INFORMATION_CLASS HeapInformationClass,
1023 _When_(HeapInformationClass==HeapCompatibilityInformation,_In_) PVOID HeapInformation,
1024 _In_ SIZE_T HeapInformationLength
1025 );
1026
1027 NTSYSAPI
1028 BOOLEAN
1029 NTAPI
1030 RtlLockHeap(
1031 _In_ HANDLE Heap
1032 );
1033
1034 NTSYSAPI
1035 ULONG
1036 NTAPI
1037 RtlMultipleAllocateHeap(
1038 _In_ HANDLE HeapHandle,
1039 _In_ ULONG Flags,
1040 _In_ SIZE_T Size,
1041 _In_ ULONG Count,
1042 _Out_cap_(Count) _Deref_post_bytecap_(Size) PVOID * Array
1043 );
1044
1045 NTSYSAPI
1046 ULONG
1047 NTAPI
1048 RtlMultipleFreeHeap(
1049 _In_ HANDLE HeapHandle,
1050 _In_ ULONG Flags,
1051 _In_ ULONG Count,
1052 _In_count_(Count) /* _Deref_ _Post_invalid_ */ PVOID * Array
1053 );
1054
1055 NTSYSAPI
1056 NTSTATUS
1057 NTAPI
1058 RtlUsageHeap(
1059 _In_ HANDLE Heap,
1060 _In_ ULONG Flags,
1061 _Out_ PRTL_HEAP_USAGE Usage
1062 );
1063
1064 NTSYSAPI
1065 BOOLEAN
1066 NTAPI
1067 RtlUnlockHeap(
1068 _In_ HANDLE Heap
1069 );
1070
1071 BOOLEAN
1072 NTAPI
1073 RtlSetUserValueHeap(
1074 _In_ PVOID HeapHandle,
1075 _In_ ULONG Flags,
1076 _In_ PVOID BaseAddress,
1077 _In_ PVOID UserValue
1078 );
1079
1080 BOOLEAN
1081 NTAPI
1082 RtlSetUserFlagsHeap(
1083 _In_ PVOID HeapHandle,
1084 _In_ ULONG Flags,
1085 _In_ PVOID BaseAddress,
1086 _In_ ULONG UserFlagsReset,
1087 _In_ ULONG UserFlagsSet
1088 );
1089
1090 NTSYSAPI
1091 BOOLEAN
1092 NTAPI
1093 RtlValidateHeap(
1094 _In_ HANDLE Heap,
1095 _In_ ULONG Flags,
1096 _In_opt_ PVOID P
1097 );
1098
1099 NTSYSAPI
1100 NTSTATUS
1101 NTAPI
1102 RtlWalkHeap(
1103 _In_ HANDLE HeapHandle,
1104 _In_ PVOID HeapEntry
1105 );
1106
1107 #define RtlGetProcessHeap() (NtCurrentPeb()->ProcessHeap)
1108
1109 #endif // NTOS_MODE_USER
1110
1111 #define NtCurrentPeb() (NtCurrentTeb()->ProcessEnvironmentBlock)
1112
1113 NTSYSAPI
1114 SIZE_T
1115 NTAPI
1116 RtlSizeHeap(
1117 _In_ PVOID HeapHandle,
1118 _In_ ULONG Flags,
1119 _In_ PVOID MemoryPointer
1120 );
1121
1122
1123 //
1124 // Security Functions
1125 //
1126 _IRQL_requires_max_(APC_LEVEL)
1127 NTSYSAPI
1128 NTSTATUS
1129 NTAPI
1130 RtlAbsoluteToSelfRelativeSD(
1131 _In_ PSECURITY_DESCRIPTOR AbsoluteSecurityDescriptor,
1132 _Out_writes_bytes_to_opt_(*BufferLength, *BufferLength) PSECURITY_DESCRIPTOR SelfRelativeSecurityDescriptor,
1133 _Inout_ PULONG BufferLength
1134 );
1135
1136 _IRQL_requires_max_(APC_LEVEL)
1137 NTSYSAPI
1138 NTSTATUS
1139 NTAPI
1140 RtlAddAccessAllowedAce(
1141 _Inout_ PACL Acl,
1142 _In_ ULONG Revision,
1143 _In_ ACCESS_MASK AccessMask,
1144 _In_ PSID Sid
1145 );
1146
1147 _IRQL_requires_max_(APC_LEVEL)
1148 NTSYSAPI
1149 NTSTATUS
1150 NTAPI
1151 RtlAddAccessAllowedAceEx(
1152 _Inout_ PACL pAcl,
1153 _In_ ULONG dwAceRevision,
1154 _In_ ULONG AceFlags,
1155 _In_ ACCESS_MASK AccessMask,
1156 _In_ PSID pSid
1157 );
1158
1159 NTSYSAPI
1160 NTSTATUS
1161 NTAPI
1162 RtlAddAccessAllowedObjectAce(
1163 _Inout_ PACL pAcl,
1164 _In_ ULONG dwAceRevision,
1165 _In_ ULONG AceFlags,
1166 _In_ ACCESS_MASK AccessMask,
1167 _In_opt_ GUID *ObjectTypeGuid,
1168 _In_opt_ GUID *InheritedObjectTypeGuid,
1169 _In_ PSID pSid
1170 );
1171
1172 NTSYSAPI
1173 NTSTATUS
1174 NTAPI
1175 RtlAddAccessDeniedAce(
1176 _Inout_ PACL Acl,
1177 _In_ ULONG Revision,
1178 _In_ ACCESS_MASK AccessMask,
1179 _In_ PSID Sid
1180 );
1181
1182 NTSYSAPI
1183 NTSTATUS
1184 NTAPI
1185 RtlAddAccessDeniedAceEx(
1186 _Inout_ PACL Acl,
1187 _In_ ULONG Revision,
1188 _In_ ULONG Flags,
1189 _In_ ACCESS_MASK AccessMask,
1190 _In_ PSID Sid
1191 );
1192
1193 NTSYSAPI
1194 NTSTATUS
1195 NTAPI
1196 RtlAddAccessDeniedObjectAce(
1197 _Inout_ PACL pAcl,
1198 _In_ ULONG dwAceRevision,
1199 _In_ ULONG AceFlags,
1200 _In_ ACCESS_MASK AccessMask,
1201 _In_opt_ GUID *ObjectTypeGuid,
1202 _In_opt_ GUID *InheritedObjectTypeGuid,
1203 _In_ PSID pSid
1204 );
1205
1206 NTSYSAPI
1207 NTSTATUS
1208 NTAPI
1209 RtlAddAce(
1210 _Inout_ PACL Acl,
1211 _In_ ULONG AceRevision,
1212 _In_ ULONG StartingAceIndex,
1213 _In_reads_bytes_(AceListLength) PVOID AceList,
1214 _In_ ULONG AceListLength
1215 );
1216
1217 NTSYSAPI
1218 NTSTATUS
1219 NTAPI
1220 RtlAddAuditAccessAce(
1221 _Inout_ PACL Acl,
1222 _In_ ULONG Revision,
1223 _In_ ACCESS_MASK AccessMask,
1224 _In_ PSID Sid,
1225 _In_ BOOLEAN Success,
1226 _In_ BOOLEAN Failure
1227 );
1228
1229 NTSYSAPI
1230 NTSTATUS
1231 NTAPI
1232 RtlAcquirePrivilege(
1233 _In_ PULONG Privilege,
1234 _In_ ULONG NumPriv,
1235 _In_ ULONG Flags,
1236 _Out_ PVOID *ReturnedState
1237 );
1238
1239 NTSYSAPI
1240 NTSTATUS
1241 NTAPI
1242 RtlAddAuditAccessAceEx(
1243 _Inout_ PACL Acl,
1244 _In_ ULONG Revision,
1245 _In_ ULONG Flags,
1246 _In_ ACCESS_MASK AccessMask,
1247 _In_ PSID Sid,
1248 _In_ BOOLEAN Success,
1249 _In_ BOOLEAN Failure
1250 );
1251
1252 NTSYSAPI
1253 NTSTATUS
1254 NTAPI
1255 RtlAddAuditAccessObjectAce(
1256 _Inout_ PACL Acl,
1257 _In_ ULONG Revision,
1258 _In_ ULONG Flags,
1259 _In_ ACCESS_MASK AccessMask,
1260 _In_opt_ GUID *ObjectTypeGuid,
1261 _In_opt_ GUID *InheritedObjectTypeGuid,
1262 _In_ PSID Sid,
1263 _In_ BOOLEAN Success,
1264 _In_ BOOLEAN Failure
1265 );
1266
1267 NTSYSAPI
1268 NTSTATUS
1269 NTAPI
1270 RtlAddMandatoryAce(
1271 _Inout_ PACL Acl,
1272 _In_ ULONG Revision,
1273 _In_ ULONG Flags,
1274 _In_ ULONG MandatoryFlags,
1275 _In_ UCHAR AceType,
1276 _In_ PSID LabelSid);
1277
1278 NTSYSAPI
1279 NTSTATUS
1280 NTAPI
1281 RtlAdjustPrivilege(
1282 _In_ ULONG Privilege,
1283 _In_ BOOLEAN NewValue,
1284 _In_ BOOLEAN ForThread,
1285 _Out_ PBOOLEAN OldValue
1286 );
1287
1288 _Must_inspect_result_
1289 NTSYSAPI
1290 NTSTATUS
1291 NTAPI
1292 RtlAllocateAndInitializeSid(
1293 _In_ PSID_IDENTIFIER_AUTHORITY IdentifierAuthority,
1294 _In_ UCHAR SubAuthorityCount,
1295 _In_ ULONG SubAuthority0,
1296 _In_ ULONG SubAuthority1,
1297 _In_ ULONG SubAuthority2,
1298 _In_ ULONG SubAuthority3,
1299 _In_ ULONG SubAuthority4,
1300 _In_ ULONG SubAuthority5,
1301 _In_ ULONG SubAuthority6,
1302 _In_ ULONG SubAuthority7,
1303 _Outptr_ PSID *Sid
1304 );
1305
1306 NTSYSAPI
1307 BOOLEAN
1308 NTAPI
1309 RtlAreAllAccessesGranted(
1310 ACCESS_MASK GrantedAccess,
1311 ACCESS_MASK DesiredAccess
1312 );
1313
1314 NTSYSAPI
1315 BOOLEAN
1316 NTAPI
1317 RtlAreAnyAccessesGranted(
1318 ACCESS_MASK GrantedAccess,
1319 ACCESS_MASK DesiredAccess
1320 );
1321
1322 _IRQL_requires_max_(APC_LEVEL)
1323 NTSYSAPI
1324 VOID
1325 NTAPI
1326 RtlCopyLuid (
1327 _Out_ PLUID DestinationLuid,
1328 _In_ PLUID SourceLuid
1329 );
1330
1331 NTSYSAPI
1332 VOID
1333 NTAPI
1334 RtlCopyLuidAndAttributesArray(
1335 ULONG Count,
1336 PLUID_AND_ATTRIBUTES Src,
1337 PLUID_AND_ATTRIBUTES Dest
1338 );
1339
1340 NTSYSAPI
1341 NTSTATUS
1342 NTAPI
1343 RtlCopySidAndAttributesArray(
1344 _In_ ULONG Count,
1345 _In_ PSID_AND_ATTRIBUTES Src,
1346 _In_ ULONG SidAreaSize,
1347 _In_ PSID_AND_ATTRIBUTES Dest,
1348 _In_ PSID SidArea,
1349 _Out_ PSID* RemainingSidArea,
1350 _Out_ PULONG RemainingSidAreaSize
1351 );
1352
1353 _IRQL_requires_max_(APC_LEVEL)
1354 NTSYSAPI
1355 NTSTATUS
1356 NTAPI
1357 RtlConvertSidToUnicodeString(
1358 _Inout_ PUNICODE_STRING UnicodeString,
1359 _In_ PSID Sid,
1360 _In_ BOOLEAN AllocateDestinationString
1361 );
1362
1363 _IRQL_requires_max_(APC_LEVEL)
1364 NTSYSAPI
1365 NTSTATUS
1366 NTAPI
1367 RtlCopySid(
1368 _In_ ULONG DestinationSidLength,
1369 _Out_writes_bytes_(DestinationSidLength) PSID DestinationSid,
1370 _In_ PSID SourceSid
1371 );
1372
1373 NTSYSAPI
1374 NTSTATUS
1375 NTAPI
1376 RtlCreateAcl(
1377 PACL Acl,
1378 ULONG AclSize,
1379 ULONG AclRevision
1380 );
1381
1382 NTSYSAPI
1383 NTSTATUS
1384 NTAPI
1385 RtlCreateSecurityDescriptor(
1386 _Out_ PSECURITY_DESCRIPTOR SecurityDescriptor,
1387 _In_ ULONG Revision
1388 );
1389
1390 NTSYSAPI
1391 NTSTATUS
1392 NTAPI
1393 RtlCreateSecurityDescriptorRelative(
1394 _Out_ PISECURITY_DESCRIPTOR_RELATIVE SecurityDescriptor,
1395 _In_ ULONG Revision
1396 );
1397
1398 NTSYSAPI
1399 NTSTATUS
1400 NTAPI
1401 RtlCopySecurityDescriptor(
1402 _In_ PSECURITY_DESCRIPTOR pSourceSecurityDescriptor,
1403 _Out_ PSECURITY_DESCRIPTOR *pDestinationSecurityDescriptor
1404 );
1405
1406 NTSYSAPI
1407 NTSTATUS
1408 NTAPI
1409 RtlDeleteAce(
1410 PACL Acl,
1411 ULONG AceIndex
1412 );
1413
1414 NTSYSAPI
1415 BOOLEAN
1416 NTAPI
1417 RtlEqualPrefixSid(
1418 PSID Sid1,
1419 PSID Sid2
1420 );
1421
1422 NTSYSAPI
1423 BOOLEAN
1424 NTAPI
1425 RtlEqualSid (
1426 _In_ PSID Sid1,
1427 _In_ PSID Sid2
1428 );
1429
1430 NTSYSAPI
1431 BOOLEAN
1432 NTAPI
1433 RtlFirstFreeAce(
1434 PACL Acl,
1435 PACE* Ace
1436 );
1437
1438 NTSYSAPI
1439 PVOID
1440 NTAPI
1441 RtlFreeSid(
1442 _In_ _Post_invalid_ PSID Sid
1443 );
1444
1445 NTSYSAPI
1446 NTSTATUS
1447 NTAPI
1448 RtlGetAce(
1449 PACL Acl,
1450 ULONG AceIndex,
1451 PVOID *Ace
1452 );
1453
1454 NTSYSAPI
1455 NTSTATUS
1456 NTAPI
1457 RtlGetControlSecurityDescriptor(
1458 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,
1459 _Out_ PSECURITY_DESCRIPTOR_CONTROL Control,
1460 _Out_ PULONG Revision
1461 );
1462
1463 NTSYSAPI
1464 NTSTATUS
1465 NTAPI
1466 RtlGetDaclSecurityDescriptor(
1467 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,
1468 _Out_ PBOOLEAN DaclPresent,
1469 _Out_ PACL *Dacl,
1470 _Out_ PBOOLEAN DaclDefaulted
1471 );
1472
1473 NTSYSAPI
1474 NTSTATUS
1475 NTAPI
1476 RtlGetSaclSecurityDescriptor(
1477 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,
1478 _Out_ PBOOLEAN SaclPresent,
1479 _Out_ PACL* Sacl,
1480 _Out_ PBOOLEAN SaclDefaulted
1481 );
1482
1483 NTSYSAPI
1484 NTSTATUS
1485 NTAPI
1486 RtlGetGroupSecurityDescriptor(
1487 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,
1488 _Out_ PSID *Group,
1489 _Out_ PBOOLEAN GroupDefaulted
1490 );
1491
1492 NTSYSAPI
1493 NTSTATUS
1494 NTAPI
1495 RtlGetOwnerSecurityDescriptor(
1496 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,
1497 _Out_ PSID *Owner,
1498 _Out_ PBOOLEAN OwnerDefaulted
1499 );
1500
1501 NTSYSAPI
1502 BOOLEAN
1503 NTAPI
1504 RtlGetSecurityDescriptorRMControl(
1505 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,
1506 _Out_ PUCHAR RMControl
1507 );
1508
1509 NTSYSAPI
1510 PSID_IDENTIFIER_AUTHORITY
1511 NTAPI
1512 RtlIdentifierAuthoritySid(PSID Sid);
1513
1514 NTSYSAPI
1515 NTSTATUS
1516 NTAPI
1517 RtlImpersonateSelf(IN SECURITY_IMPERSONATION_LEVEL ImpersonationLevel);
1518
1519 _IRQL_requires_max_(APC_LEVEL)
1520 NTSYSAPI
1521 NTSTATUS
1522 NTAPI
1523 RtlInitializeSid(
1524 _Out_ PSID Sid,
1525 _In_ PSID_IDENTIFIER_AUTHORITY IdentifierAuthority,
1526 _In_ UCHAR SubAuthorityCount
1527 );
1528
1529 NTSYSAPI
1530 ULONG
1531 NTAPI
1532 RtlLengthRequiredSid(IN ULONG SubAuthorityCount);
1533
1534 _IRQL_requires_max_(APC_LEVEL)
1535 NTSYSAPI
1536 ULONG
1537 NTAPI
1538 RtlLengthSecurityDescriptor(
1539 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor);
1540
1541 NTSYSAPI
1542 ULONG
1543 NTAPI
1544 RtlLengthSid(IN PSID Sid);
1545
1546 NTSYSAPI
1547 NTSTATUS
1548 NTAPI
1549 RtlMakeSelfRelativeSD(
1550 _In_ PSECURITY_DESCRIPTOR AbsoluteSD,
1551 _Out_ PSECURITY_DESCRIPTOR SelfRelativeSD,
1552 _Inout_ PULONG BufferLength);
1553
1554 NTSYSAPI
1555 VOID
1556 NTAPI
1557 RtlMapGenericMask(
1558 PACCESS_MASK AccessMask,
1559 PGENERIC_MAPPING GenericMapping
1560 );
1561
1562 #ifdef NTOS_MODE_USER
1563
1564 NTSYSAPI
1565 NTSTATUS
1566 NTAPI
1567 RtlQueryInformationAcl(
1568 PACL Acl,
1569 PVOID Information,
1570 ULONG InformationLength,
1571 ACL_INFORMATION_CLASS InformationClass
1572 );
1573
1574 #endif
1575
1576 NTSYSAPI
1577 VOID
1578 NTAPI
1579 RtlReleasePrivilege(
1580 _In_ PVOID ReturnedState
1581 );
1582
1583 #if (NTDDI_VERSION >= NTDDI_VISTA)
1584
1585 NTSYSAPI
1586 NTSTATUS
1587 NTAPI
1588 RtlRemovePrivileges(
1589 _In_ HANDLE TokenHandle,
1590 _In_reads_opt_(PrivilegeCount) _When_(PrivilegeCount != 0, _Notnull_)
1591 PULONG PrivilegesToKeep,
1592 _In_ ULONG PrivilegeCount
1593 );
1594
1595 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
1596
1597 _IRQL_requires_max_(APC_LEVEL)
1598 NTSYSAPI
1599 NTSTATUS
1600 NTAPI
1601 RtlSelfRelativeToAbsoluteSD(
1602 _In_ PSECURITY_DESCRIPTOR SelfRelativeSecurityDescriptor,
1603 _Out_writes_bytes_to_opt_(*AbsoluteSecurityDescriptorSize, *AbsoluteSecurityDescriptorSize) PSECURITY_DESCRIPTOR AbsoluteSecurityDescriptor,
1604 _Inout_ PULONG AbsoluteSecurityDescriptorSize,
1605 _Out_writes_bytes_to_opt_(*DaclSize, *DaclSize) PACL Dacl,
1606 _Inout_ PULONG DaclSize,
1607 _Out_writes_bytes_to_opt_(*SaclSize, *SaclSize) PACL Sacl,
1608 _Inout_ PULONG SaclSize,
1609 _Out_writes_bytes_to_opt_(*OwnerSize, *OwnerSize) PSID Owner,
1610 _Inout_ PULONG OwnerSize,
1611 _Out_writes_bytes_to_opt_(*PrimaryGroupSize, *PrimaryGroupSize) PSID PrimaryGroup,
1612 _Inout_ PULONG PrimaryGroupSize
1613 );
1614
1615 NTSYSAPI
1616 NTSTATUS
1617 NTAPI
1618 RtlSelfRelativeToAbsoluteSD2(
1619 _Inout_ PSECURITY_DESCRIPTOR SelfRelativeSD,
1620 _Out_ PULONG BufferSize
1621 );
1622
1623 NTSYSAPI
1624 NTSTATUS
1625 NTAPI
1626 RtlSetAttributesSecurityDescriptor(
1627 _Inout_ PSECURITY_DESCRIPTOR SecurityDescriptor,
1628 _In_ SECURITY_DESCRIPTOR_CONTROL Control,
1629 _Out_ PULONG Revision
1630 );
1631
1632 NTSYSAPI
1633 NTSTATUS
1634 NTAPI
1635 RtlSetControlSecurityDescriptor(
1636 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,
1637 _In_ SECURITY_DESCRIPTOR_CONTROL ControlBitsOfInterest,
1638 _In_ SECURITY_DESCRIPTOR_CONTROL ControlBitsToSet
1639 );
1640
1641 _IRQL_requires_max_(APC_LEVEL)
1642 NTSYSAPI
1643 NTSTATUS
1644 NTAPI
1645 RtlSetDaclSecurityDescriptor(
1646 _Inout_ PSECURITY_DESCRIPTOR SecurityDescriptor,
1647 _In_ BOOLEAN DaclPresent,
1648 _In_opt_ PACL Dacl,
1649 _In_opt_ BOOLEAN DaclDefaulted
1650 );
1651
1652 _IRQL_requires_max_(APC_LEVEL)
1653 NTSYSAPI
1654 NTSTATUS
1655 NTAPI
1656 RtlSetGroupSecurityDescriptor(
1657 _Inout_ PSECURITY_DESCRIPTOR SecurityDescriptor,
1658 _In_opt_ PSID Group,
1659 _In_opt_ BOOLEAN GroupDefaulted
1660 );
1661
1662 #ifdef NTOS_MODE_USER
1663
1664 NTSYSAPI
1665 NTSTATUS
1666 NTAPI
1667 RtlSetInformationAcl(
1668 PACL Acl,
1669 PVOID Information,
1670 ULONG InformationLength,
1671 ACL_INFORMATION_CLASS InformationClass
1672 );
1673
1674 #endif
1675
1676 _IRQL_requires_max_(APC_LEVEL)
1677 NTSYSAPI
1678 NTSTATUS
1679 NTAPI
1680 RtlSetOwnerSecurityDescriptor(
1681 _Inout_ PSECURITY_DESCRIPTOR SecurityDescriptor,
1682 _In_opt_ PSID Owner,
1683 _In_opt_ BOOLEAN OwnerDefaulted
1684 );
1685
1686 NTSYSAPI
1687 NTSTATUS
1688 NTAPI
1689 RtlSetSaclSecurityDescriptor(
1690 _Inout_ PSECURITY_DESCRIPTOR SecurityDescriptor,
1691 _In_ BOOLEAN SaclPresent,
1692 _In_ PACL Sacl,
1693 _In_ BOOLEAN SaclDefaulted
1694 );
1695
1696 NTSYSAPI
1697 VOID
1698 NTAPI
1699 RtlSetSecurityDescriptorRMControl(
1700 _Inout_ PSECURITY_DESCRIPTOR SecurityDescriptor,
1701 _In_ PUCHAR RMControl
1702 );
1703
1704 NTSYSAPI
1705 PUCHAR
1706 NTAPI
1707 RtlSubAuthorityCountSid(
1708 _In_ PSID Sid
1709 );
1710
1711 NTSYSAPI
1712 PULONG
1713 NTAPI
1714 RtlSubAuthoritySid(
1715 _In_ PSID Sid,
1716 _In_ ULONG SubAuthority
1717 );
1718
1719 _IRQL_requires_max_(APC_LEVEL)
1720 _Must_inspect_result_
1721 NTSYSAPI
1722 BOOLEAN
1723 NTAPI
1724 RtlValidRelativeSecurityDescriptor(
1725 _In_reads_bytes_(SecurityDescriptorLength) PSECURITY_DESCRIPTOR SecurityDescriptorInput,
1726 _In_ ULONG SecurityDescriptorLength,
1727 _In_ SECURITY_INFORMATION RequiredInformation
1728 );
1729
1730 NTSYSAPI
1731 BOOLEAN
1732 NTAPI
1733 RtlValidSecurityDescriptor(IN PSECURITY_DESCRIPTOR SecurityDescriptor);
1734
1735 NTSYSAPI
1736 BOOLEAN
1737 NTAPI
1738 RtlValidSid(IN PSID Sid);
1739
1740 NTSYSAPI
1741 BOOLEAN
1742 NTAPI
1743 RtlValidAcl(PACL Acl);
1744
1745 NTSYSAPI
1746 NTSTATUS
1747 NTAPI
1748 RtlDeleteSecurityObject(
1749 _In_ PSECURITY_DESCRIPTOR *ObjectDescriptor
1750 );
1751
1752 NTSYSAPI
1753 NTSTATUS
1754 NTAPI
1755 RtlNewSecurityObject(
1756 _In_ PSECURITY_DESCRIPTOR ParentDescriptor,
1757 _In_ PSECURITY_DESCRIPTOR CreatorDescriptor,
1758 _Out_ PSECURITY_DESCRIPTOR *NewDescriptor,
1759 _In_ BOOLEAN IsDirectoryObject,
1760 _In_ HANDLE Token,
1761 _In_ PGENERIC_MAPPING GenericMapping
1762 );
1763
1764 NTSYSAPI
1765 NTSTATUS
1766 NTAPI
1767 RtlQuerySecurityObject(
1768 _In_ PSECURITY_DESCRIPTOR ObjectDescriptor,
1769 _In_ SECURITY_INFORMATION SecurityInformation,
1770 _Out_ PSECURITY_DESCRIPTOR ResultantDescriptor,
1771 _In_ ULONG DescriptorLength,
1772 _Out_ PULONG ReturnLength
1773 );
1774
1775 NTSYSAPI
1776 NTSTATUS
1777 NTAPI
1778 RtlSetSecurityObject(
1779 _In_ SECURITY_INFORMATION SecurityInformation,
1780 _In_ PSECURITY_DESCRIPTOR ModificationDescriptor,
1781 _Out_ PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor,
1782 _In_ PGENERIC_MAPPING GenericMapping,
1783 _In_ HANDLE Token
1784 );
1785
1786 //
1787 // Single-Character Functions
1788 //
1789 NTSYSAPI
1790 NTSTATUS
1791 NTAPI
1792 RtlLargeIntegerToChar(
1793 _In_ PLARGE_INTEGER Value,
1794 _In_ ULONG Base,
1795 _In_ ULONG Length,
1796 _Out_ PCHAR String
1797 );
1798
1799 NTSYSAPI
1800 CHAR
1801 NTAPI
1802 RtlUpperChar(CHAR Source);
1803
1804 NTSYSAPI
1805 WCHAR
1806 NTAPI
1807 RtlUpcaseUnicodeChar(WCHAR Source);
1808
1809 NTSYSAPI
1810 WCHAR
1811 NTAPI
1812 RtlDowncaseUnicodeChar(IN WCHAR Source);
1813
1814 NTSYSAPI
1815 NTSTATUS
1816 NTAPI
1817 RtlIntegerToChar(
1818 _In_ ULONG Value,
1819 _In_ ULONG Base,
1820 _In_ ULONG Length,
1821 _Out_ PCHAR String
1822 );
1823
1824 NTSYSAPI
1825 NTSTATUS
1826 NTAPI
1827 RtlIntegerToUnicode(
1828 _In_ ULONG Value,
1829 _In_opt_ ULONG Base,
1830 _In_opt_ ULONG Length,
1831 _Inout_ LPWSTR String
1832 );
1833
1834 _IRQL_requires_max_(PASSIVE_LEVEL)
1835 _At_(String->MaximumLength, _Const_)
1836 NTSYSAPI
1837 NTSTATUS
1838 NTAPI
1839 RtlIntegerToUnicodeString(
1840 _In_ ULONG Value,
1841 _In_opt_ ULONG Base,
1842 _Inout_ PUNICODE_STRING String
1843 );
1844
1845 NTSYSAPI
1846 NTSTATUS
1847 NTAPI
1848 RtlCharToInteger(
1849 PCSZ String,
1850 ULONG Base,
1851 PULONG Value
1852 );
1853
1854 //
1855 // Byte Swap Functions
1856 //
1857 #ifdef NTOS_MODE_USER
1858
1859 unsigned short __cdecl _byteswap_ushort(unsigned short);
1860 unsigned long __cdecl _byteswap_ulong (unsigned long);
1861 unsigned __int64 __cdecl _byteswap_uint64(unsigned __int64);
1862 #ifdef _MSC_VER
1863 #pragma intrinsic(_byteswap_ushort)
1864 #pragma intrinsic(_byteswap_ulong)
1865 #pragma intrinsic(_byteswap_uint64)
1866 #endif // _MSC_VER
1867 #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
1868 #define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
1869 #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
1870
1871 #endif // NTOS_MODE_USER
1872
1873 //
1874 // Unicode->Ansi String Functions
1875 //
1876 NTSYSAPI
1877 ULONG
1878 NTAPI
1879 RtlxUnicodeStringToAnsiSize(IN PCUNICODE_STRING UnicodeString);
1880
1881 #ifdef NTOS_MODE_USER
1882
1883 #define RtlUnicodeStringToAnsiSize(STRING) ( \
1884 NLS_MB_CODE_PAGE_TAG ? \
1885 RtlxUnicodeStringToAnsiSize(STRING) : \
1886 ((STRING)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
1887 )
1888
1889 #endif
1890
1891 NTSYSAPI
1892 NTSTATUS
1893 NTAPI
1894 RtlUnicodeStringToAnsiString(
1895 PANSI_STRING DestinationString,
1896 PCUNICODE_STRING SourceString,
1897 BOOLEAN AllocateDestinationString
1898 );
1899
1900 //
1901 // Unicode->OEM String Functions
1902 //
1903 NTSYSAPI
1904 NTSTATUS
1905 NTAPI
1906 RtlUpcaseUnicodeStringToOemString(
1907 POEM_STRING DestinationString,
1908 PCUNICODE_STRING SourceString,
1909 BOOLEAN AllocateDestinationString
1910 );
1911
1912 _IRQL_requires_max_(PASSIVE_LEVEL)
1913 _Must_inspect_result_
1914 //_At_(DestinationString->Buffer, _Post_bytecount_(DestinationString->Length))
1915 NTSYSAPI
1916 NTSTATUS
1917 NTAPI
1918 RtlUpcaseUnicodeStringToCountedOemString(
1919 _When_(AllocateDestinationString, _Out_ _At_(DestinationString->Buffer, __drv_allocatesMem(Mem)))
1920 _When_(!AllocateDestinationString, _Inout_)
1921 POEM_STRING DestinationString,
1922 _In_ PCUNICODE_STRING SourceString,
1923 _In_ BOOLEAN AllocateDestinationString
1924 );
1925
1926 NTSYSAPI
1927 NTSTATUS
1928 NTAPI
1929 RtlUnicodeStringToOemString(
1930 POEM_STRING DestinationString,
1931 PCUNICODE_STRING SourceString,
1932 BOOLEAN AllocateDestinationString
1933 );
1934
1935 _IRQL_requires_max_(PASSIVE_LEVEL)
1936 _Must_inspect_result_
1937 NTSYSAPI
1938 NTSTATUS
1939 NTAPI
1940 RtlUnicodeStringToCountedOemString(
1941 _When_(AllocateDestinationString, _Out_ _At_(DestinationString->Buffer, __drv_allocatesMem(Mem)))
1942 _When_(!AllocateDestinationString, _Inout_)
1943 POEM_STRING DestinationString,
1944 _In_ PCUNICODE_STRING SourceString,
1945 _In_ BOOLEAN AllocateDestinationString
1946 );
1947
1948 NTSYSAPI
1949 NTSTATUS
1950 NTAPI
1951 RtlUpcaseUnicodeToOemN(
1952 PCHAR OemString,
1953 ULONG OemSize,
1954 PULONG ResultSize,
1955 PCWCH UnicodeString,
1956 ULONG UnicodeSize
1957 );
1958
1959 NTSYSAPI
1960 ULONG
1961 NTAPI
1962 RtlxUnicodeStringToOemSize(IN PCUNICODE_STRING UnicodeString);
1963
1964 #ifdef NTOS_MODE_USER
1965
1966 #define RtlUnicodeStringToOemSize(STRING) ( \
1967 NLS_MB_OEM_CODE_PAGE_TAG ? \
1968 RtlxUnicodeStringToOemSize(STRING) : \
1969 ((STRING)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
1970 )
1971
1972 #define RtlUnicodeStringToCountedOemSize(STRING) ( \
1973 (ULONG)(RtlUnicodeStringToOemSize(STRING) - sizeof(ANSI_NULL)) \
1974 )
1975
1976 #endif
1977
1978 NTSYSAPI
1979 NTSTATUS
1980 NTAPI
1981 RtlUnicodeToOemN(
1982 PCHAR OemString,
1983 ULONG OemSize,
1984 PULONG ResultSize,
1985 PCWCH UnicodeString,
1986 ULONG UnicodeSize
1987 );
1988
1989 //
1990 // Unicode->MultiByte String Functions
1991 //
1992 NTSYSAPI
1993 NTSTATUS
1994 NTAPI
1995 RtlUnicodeToMultiByteN(
1996 PCHAR MbString,
1997 ULONG MbSize,
1998 PULONG ResultSize,
1999 PCWCH UnicodeString,
2000 ULONG UnicodeSize
2001 );
2002
2003 NTSYSAPI
2004 NTSTATUS
2005 NTAPI
2006 RtlUpcaseUnicodeToMultiByteN(
2007 PCHAR MbString,
2008 ULONG MbSize,
2009 PULONG ResultSize,
2010 PCWCH UnicodeString,
2011 ULONG UnicodeSize
2012 );
2013
2014 NTSYSAPI
2015 NTSTATUS
2016 NTAPI
2017 RtlUnicodeToMultiByteSize(
2018 PULONG MbSize,
2019 PCWCH UnicodeString,
2020 ULONG UnicodeSize
2021 );
2022
2023 NTSYSAPI
2024 ULONG
2025 NTAPI
2026 RtlxOemStringToUnicodeSize(IN PCOEM_STRING OemString);
2027
2028 //
2029 // OEM to Unicode Functions
2030 //
2031 NTSYSAPI
2032 NTSTATUS
2033 NTAPI
2034 RtlOemStringToUnicodeString(
2035 PUNICODE_STRING DestinationString,
2036 PCOEM_STRING SourceString,
2037 BOOLEAN AllocateDestinationString
2038 );
2039
2040 _IRQL_requires_max_(PASSIVE_LEVEL)
2041 NTSYSAPI
2042 NTSTATUS
2043 NTAPI
2044 RtlOemToUnicodeN(
2045 _Out_writes_bytes_to_(MaxBytesInUnicodeString, *BytesInUnicodeString) PWCH UnicodeString,
2046 _In_ ULONG MaxBytesInUnicodeString,
2047 _Out_opt_ PULONG BytesInUnicodeString,
2048 _In_reads_bytes_(BytesInOemString) PCCH OemString,
2049 _In_ ULONG BytesInOemString
2050 );
2051
2052 #ifdef NTOS_MODE_USER
2053
2054 #define RtlOemStringToUnicodeSize(STRING) ( \
2055 NLS_MB_OEM_CODE_PAGE_TAG ? \
2056 RtlxOemStringToUnicodeSize(STRING) : \
2057 ((STRING)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
2058 )
2059
2060 #define RtlOemStringToCountedUnicodeSize(STRING) ( \
2061 (ULONG)(RtlOemStringToUnicodeSize(STRING) - sizeof(UNICODE_NULL)) \
2062 )
2063
2064 #endif
2065
2066 //
2067 // Ansi->Unicode String Functions
2068 //
2069 _IRQL_requires_max_(APC_LEVEL)
2070 NTSYSAPI
2071 WCHAR
2072 NTAPI
2073 RtlAnsiCharToUnicodeChar(
2074 _Inout_ PUCHAR *SourceCharacter);
2075
2076 NTSYSAPI
2077 NTSTATUS
2078 NTAPI
2079 RtlAnsiStringToUnicodeString(
2080 PUNICODE_STRING DestinationString,
2081 PCANSI_STRING SourceString,
2082 BOOLEAN AllocateDestinationString
2083 );
2084
2085 NTSYSAPI
2086 ULONG
2087 NTAPI
2088 RtlxAnsiStringToUnicodeSize(
2089 PCANSI_STRING AnsiString
2090 );
2091
2092 #ifdef NTOS_MODE_USER
2093
2094 #define RtlAnsiStringToUnicodeSize(STRING) ( \
2095 NLS_MB_CODE_PAGE_TAG ? \
2096 RtlxAnsiStringToUnicodeSize(STRING) : \
2097 ((STRING)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
2098 )
2099
2100 #endif
2101
2102 NTSYSAPI
2103 BOOLEAN
2104 NTAPI
2105 RtlCreateUnicodeStringFromAsciiz(
2106 _Out_ PUNICODE_STRING Destination,
2107 _In_ PCSZ Source
2108 );
2109
2110 //
2111 // Unicode String Functions
2112 //
2113 NTSYSAPI
2114 NTSTATUS
2115 NTAPI
2116 RtlAppendUnicodeToString(
2117 PUNICODE_STRING Destination,
2118 PCWSTR Source
2119 );
2120
2121 NTSYSAPI
2122 NTSTATUS
2123 NTAPI
2124 RtlAppendUnicodeStringToString(
2125 PUNICODE_STRING Destination,
2126 PCUNICODE_STRING Source
2127 );
2128
2129 NTSYSAPI
2130 LONG
2131 NTAPI
2132 RtlCompareUnicodeString(
2133 PCUNICODE_STRING String1,
2134 PCUNICODE_STRING String2,
2135 BOOLEAN CaseInsensitive
2136 );
2137
2138 _Must_inspect_result_
2139 NTSYSAPI
2140 LONG
2141 NTAPI
2142 RtlCompareUnicodeStrings(
2143 _In_reads_(String1Length) PCWCH String1,
2144 _In_ SIZE_T String1Length,
2145 _In_reads_(String2Length) PCWCH String2,
2146 _In_ SIZE_T String2Length,
2147 _In_ BOOLEAN CaseInSensitive
2148 );
2149
2150 NTSYSAPI
2151 VOID
2152 NTAPI
2153 RtlCopyUnicodeString(
2154 PUNICODE_STRING DestinationString,
2155 PCUNICODE_STRING SourceString
2156 );
2157
2158 NTSYSAPI
2159 BOOLEAN
2160 NTAPI
2161 RtlCreateUnicodeString(
2162 PUNICODE_STRING DestinationString,
2163 PCWSTR SourceString
2164 );
2165
2166 #ifdef NTOS_MODE_USER
2167
2168 NTSYSAPI
2169 NTSTATUS
2170 NTAPI
2171 RtlDowncaseUnicodeString(
2172 _Inout_ PUNICODE_STRING UniDest,
2173 _In_ PCUNICODE_STRING UniSource,
2174 _In_ BOOLEAN AllocateDestinationString
2175 );
2176
2177 NTSYSAPI
2178 NTSTATUS
2179 NTAPI
2180 RtlDuplicateUnicodeString(
2181 _In_ ULONG Flags,
2182 _In_ PCUNICODE_STRING SourceString,
2183 _Out_ PUNICODE_STRING DestinationString
2184 );
2185
2186 NTSYSAPI
2187 NTSTATUS
2188 NTAPI
2189 RtlFindCharInUnicodeString(
2190 _In_ ULONG Flags,
2191 _In_ PCUNICODE_STRING SearchString,
2192 _In_ PCUNICODE_STRING MatchString,
2193 _Out_ PUSHORT Position
2194 );
2195
2196 //
2197 // Memory Functions
2198 //
2199 #if defined(_M_AMD64)
2200
2201 FORCEINLINE
2202 VOID
RtlFillMemoryUlong(_Out_writes_bytes_all_ (Length)PVOID Destination,_In_ SIZE_T Length,_In_ ULONG Pattern)2203 RtlFillMemoryUlong(
2204 _Out_writes_bytes_all_(Length) PVOID Destination,
2205 _In_ SIZE_T Length,
2206 _In_ ULONG Pattern)
2207 {
2208 PULONG Address = (PULONG)Destination;
2209 if ((Length /= 4) != 0) {
2210 if (((ULONG64)Address & 4) != 0) {
2211 *Address = Pattern;
2212 if ((Length -= 1) == 0) {
2213 return;
2214 }
2215 Address += 1;
2216 }
2217 __stosq((PULONG64)(Address), Pattern | ((ULONG64)Pattern << 32), Length / 2);
2218 if ((Length & 1) != 0) Address[Length - 1] = Pattern;
2219 }
2220 return;
2221 }
2222
2223 #define RtlFillMemoryUlonglong(Destination, Length, Pattern) \
2224 __stosq((PULONG64)(Destination), Pattern, (Length) / 8)
2225
2226 #else
2227
2228 NTSYSAPI
2229 VOID
2230 NTAPI
2231 RtlFillMemoryUlong(
2232 _Out_writes_bytes_all_(Length) PVOID Destination,
2233 _In_ SIZE_T Length,
2234 _In_ ULONG Pattern
2235 );
2236
2237 NTSYSAPI
2238 VOID
2239 NTAPI
2240 RtlFillMemoryUlonglong(
2241 _Out_ PVOID Destination,
2242 _In_ SIZE_T Length,
2243 _In_ ULONGLONG Pattern
2244 );
2245
2246 #endif
2247
2248 NTSYSAPI
2249 NTSTATUS
2250 NTAPI
2251 RtlCopyMappedMemory(
2252 _Out_writes_bytes_all_(Size) PVOID Destination,
2253 _In_reads_bytes_(Size) const VOID *Source,
2254 _In_ SIZE_T Size
2255 );
2256
2257 NTSYSAPI
2258 SIZE_T
2259 NTAPI
2260 RtlCompareMemoryUlong(
2261 _In_ PVOID Source,
2262 _In_ SIZE_T Length,
2263 _In_ ULONG Pattern
2264 );
2265
2266 #ifndef RtlEqualMemory
2267 #define RtlEqualMemory(Destination, Source, Length) \
2268 (!memcmp(Destination, Source, Length))
2269 #endif
2270
2271 #define RtlCopyBytes RtlCopyMemory
2272 #define RtlFillBytes RtlFillMemory
2273 #define RtlZeroBytes RtlZeroMemory
2274
2275 #endif
2276
2277 NTSYSAPI
2278 BOOLEAN
2279 NTAPI
2280 RtlEqualUnicodeString(
2281 PCUNICODE_STRING String1,
2282 PCUNICODE_STRING String2,
2283 BOOLEAN CaseInsensitive
2284 );
2285
2286 _IRQL_requires_max_(PASSIVE_LEVEL)
2287 NTSYSAPI
2288 VOID
2289 NTAPI
2290 RtlFreeUnicodeString(
2291 _Inout_ _At_(UnicodeString->Buffer, __drv_freesMem(Mem))
2292 PUNICODE_STRING UnicodeString
2293 );
2294
2295 NTSYSAPI
2296 VOID
2297 NTAPI
2298 RtlEraseUnicodeString(
2299 _Inout_ PUNICODE_STRING String
2300 );
2301
2302 NTSYSAPI
2303 NTSTATUS
2304 NTAPI
2305 RtlHashUnicodeString(
2306 _In_ CONST UNICODE_STRING *String,
2307 _In_ BOOLEAN CaseInSensitive,
2308 _In_ ULONG HashAlgorithm,
2309 _Out_ PULONG HashValue
2310 );
2311
2312 _IRQL_requires_max_(DISPATCH_LEVEL)
2313 _At_(DestinationString->Buffer, _Post_equal_to_(SourceString))
2314 _When_(SourceString != NULL,
2315 _At_(DestinationString->Length, _Post_equal_to_(_String_length_(SourceString)))
2316 _At_(DestinationString->MaximumLength, _Post_equal_to_(DestinationString->Length + sizeof(CHAR))))
2317 _When_(SourceString == NULL,
2318 _At_(DestinationString->Length, _Post_equal_to_(0))
2319 _At_(DestinationString->MaximumLength, _Post_equal_to_(0)))
2320 NTSYSAPI
2321 VOID
2322 NTAPI
2323 RtlInitString(
2324 _Out_ PSTRING DestinationString,
2325 _In_opt_z_ __drv_aliasesMem PCSTR SourceString
2326 );
2327
2328 _IRQL_requires_max_(DISPATCH_LEVEL)
2329 _At_(DestinationString->Buffer, _Post_equal_to_(SourceString))
2330 _When_(SourceString != NULL,
2331 _At_(DestinationString->Length, _Post_equal_to_(_String_length_(SourceString) * sizeof(WCHAR)))
2332 _At_(DestinationString->MaximumLength, _Post_equal_to_(DestinationString->Length + sizeof(WCHAR))))
2333 _When_(SourceString == NULL,
2334 _At_(DestinationString->Length, _Post_equal_to_(0))
2335 _At_(DestinationString->MaximumLength, _Post_equal_to_(0)))
2336 NTSYSAPI
2337 VOID
2338 NTAPI
2339 RtlInitUnicodeString(
2340 _Out_ PUNICODE_STRING DestinationString,
2341 _In_opt_z_ __drv_aliasesMem PCWSTR SourceString
2342 );
2343
2344 _IRQL_requires_max_(DISPATCH_LEVEL)
2345 NTSYSAPI
2346 NTSTATUS
2347 NTAPI
2348 RtlInitUnicodeStringEx(
2349 _Out_ PUNICODE_STRING DestinationString,
2350 _In_opt_z_ __drv_aliasesMem PCWSTR SourceString
2351 );
2352
2353 NTSYSAPI
2354 BOOLEAN
2355 NTAPI
2356 RtlIsTextUnicode(
2357 _In_ CONST VOID* Buffer,
2358 _In_ INT Size,
2359 _Inout_opt_ INT* Flags
2360 );
2361
2362 _IRQL_requires_max_(PASSIVE_LEVEL)
2363 _Must_inspect_result_
2364 NTSYSAPI
2365 BOOLEAN
2366 NTAPI
2367 RtlPrefixString(
2368 _In_ const STRING *String1,
2369 _In_ const STRING *String2,
2370 _In_ BOOLEAN CaseInsensitive
2371 );
2372
2373 _IRQL_requires_max_(PASSIVE_LEVEL)
2374 _Must_inspect_result_
2375 NTSYSAPI
2376 BOOLEAN
2377 NTAPI
2378 RtlPrefixUnicodeString(
2379 _In_ PCUNICODE_STRING String1,
2380 _In_ PCUNICODE_STRING String2,
2381 _In_ BOOLEAN CaseInsensitive
2382 );
2383
2384 _IRQL_requires_max_(PASSIVE_LEVEL)
2385 NTSYSAPI
2386 VOID
2387 NTAPI
2388 RtlUpperString(
2389 _Inout_ PSTRING DestinationString,
2390 _In_ const STRING *SourceString
2391 );
2392
2393 _IRQL_requires_max_(PASSIVE_LEVEL)
2394 _Must_inspect_result_
2395 NTSYSAPI
2396 LONG
2397 NTAPI
2398 RtlCompareString(
2399 _In_ const STRING *String1,
2400 _In_ const STRING *String2,
2401 _In_ BOOLEAN CaseInSensitive
2402 );
2403
2404 NTSYSAPI
2405 VOID
2406 NTAPI
2407 RtlCopyString(
2408 _Out_ PSTRING DestinationString,
2409 _In_opt_ const STRING *SourceString
2410 );
2411
2412 _IRQL_requires_max_(PASSIVE_LEVEL)
2413 _Must_inspect_result_
2414 NTSYSAPI
2415 BOOLEAN
2416 NTAPI
2417 RtlEqualString(
2418 _In_ const STRING *String1,
2419 _In_ const STRING *String2,
2420 _In_ BOOLEAN CaseInSensitive
2421 );
2422
2423 _IRQL_requires_max_(APC_LEVEL)
2424 NTSYSAPI
2425 NTSTATUS
2426 NTAPI
2427 RtlAppendStringToString(
2428 _Inout_ PSTRING Destination,
2429 _In_ const STRING *Source
2430 );
2431
2432 _IRQL_requires_max_(PASSIVE_LEVEL)
2433 _When_(AllocateDestinationString, _Must_inspect_result_)
2434 NTSYSAPI
2435 NTSTATUS
2436 NTAPI
2437 RtlUpcaseUnicodeString(
2438 _When_(AllocateDestinationString, _Out_ _At_(DestinationString->Buffer, __drv_allocatesMem(Mem)))
2439 _When_(!AllocateDestinationString, _Inout_)
2440 PUNICODE_STRING DestinationString,
2441 _In_ PCUNICODE_STRING SourceString,
2442 _In_ BOOLEAN AllocateDestinationString
2443 );
2444
2445 _IRQL_requires_max_(PASSIVE_LEVEL)
2446 NTSYSAPI
2447 NTSTATUS
2448 NTAPI
2449 RtlUnicodeStringToInteger(
2450 _In_ PCUNICODE_STRING String,
2451 _In_opt_ ULONG Base,
2452 _Out_ PULONG Value
2453 );
2454
2455 NTSYSAPI
2456 NTSTATUS
2457 NTAPI
2458 RtlValidateUnicodeString(
2459 _In_ ULONG Flags,
2460 _In_ PCUNICODE_STRING String
2461 );
2462
2463 #define RTL_SKIP_BUFFER_COPY 0x00000001
2464
2465 NTSYSAPI
2466 NTSTATUS
2467 NTAPI
2468 RtlpEnsureBufferSize(
2469 _In_ ULONG Flags,
2470 _Inout_ PRTL_BUFFER Buffer,
2471 _In_ SIZE_T RequiredSize
2472 );
2473
2474 #ifdef NTOS_MODE_USER
2475
2476 FORCEINLINE
2477 VOID
RtlInitBuffer(_Inout_ PRTL_BUFFER Buffer,_In_ PUCHAR Data,_In_ ULONG DataSize)2478 RtlInitBuffer(
2479 _Inout_ PRTL_BUFFER Buffer,
2480 _In_ PUCHAR Data,
2481 _In_ ULONG DataSize
2482 )
2483 {
2484 Buffer->Buffer = Buffer->StaticBuffer = Data;
2485 Buffer->Size = Buffer->StaticSize = DataSize;
2486 Buffer->ReservedForAllocatedSize = 0;
2487 Buffer->ReservedForIMalloc = NULL;
2488 }
2489
2490 FORCEINLINE
2491 NTSTATUS
RtlEnsureBufferSize(_In_ ULONG Flags,_Inout_ PRTL_BUFFER Buffer,_In_ ULONG RequiredSize)2492 RtlEnsureBufferSize(
2493 _In_ ULONG Flags,
2494 _Inout_ PRTL_BUFFER Buffer,
2495 _In_ ULONG RequiredSize
2496 )
2497 {
2498 if (Buffer && RequiredSize <= Buffer->Size)
2499 return STATUS_SUCCESS;
2500 return RtlpEnsureBufferSize(Flags, Buffer, RequiredSize);
2501 }
2502
2503 FORCEINLINE
2504 VOID
RtlFreeBuffer(_Inout_ PRTL_BUFFER Buffer)2505 RtlFreeBuffer(
2506 _Inout_ PRTL_BUFFER Buffer
2507 )
2508 {
2509 if (Buffer->Buffer != Buffer->StaticBuffer && Buffer->Buffer)
2510 RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer->Buffer);
2511 Buffer->Buffer = Buffer->StaticBuffer;
2512 Buffer->Size = Buffer->StaticSize;
2513 }
2514
2515 NTSYSAPI
2516 VOID
2517 NTAPI
2518 RtlRunEncodeUnicodeString(
2519 _Inout_ PUCHAR Hash,
2520 _Inout_ PUNICODE_STRING String
2521 );
2522
2523 NTSYSAPI
2524 VOID
2525 NTAPI
2526 RtlRunDecodeUnicodeString(
2527 _In_ UCHAR Hash,
2528 _Inout_ PUNICODE_STRING String
2529 );
2530
2531 #endif /* NTOS_MODE_USER */
2532
2533 //
2534 // Ansi String Functions
2535 //
2536 _IRQL_requires_max_(PASSIVE_LEVEL)
2537 NTSYSAPI
2538 VOID
2539 NTAPI
2540 RtlFreeAnsiString(
2541 _Inout_ _At_(AnsiString->Buffer, __drv_freesMem(Mem))
2542 PANSI_STRING AnsiString
2543 );
2544
2545 _IRQL_requires_max_(DISPATCH_LEVEL)
2546 NTSYSAPI
2547 VOID
2548 NTAPI
2549 RtlInitAnsiString(
2550 _Out_ PANSI_STRING DestinationString,
2551 _In_opt_z_ __drv_aliasesMem PCSZ SourceString
2552 );
2553
2554 _IRQL_requires_max_(DISPATCH_LEVEL)
2555 NTSYSAPI
2556 NTSTATUS
2557 NTAPI
2558 RtlInitAnsiStringEx(
2559 _Out_ PANSI_STRING DestinationString,
2560 _In_opt_z_ __drv_aliasesMem PCSZ SourceString
2561 );
2562
2563 //
2564 // OEM String Functions
2565 //
2566 _IRQL_requires_max_(PASSIVE_LEVEL)
2567 NTSYSAPI
2568 VOID
2569 NTAPI
2570 RtlFreeOemString(
2571 _Inout_ _At_(OemString->Buffer, __drv_freesMem(Mem))
2572 POEM_STRING OemString
2573 );
2574
2575 //
2576 // MultiByte->Unicode String Functions
2577 //
2578 _IRQL_requires_max_(PASSIVE_LEVEL)
2579 NTSYSAPI
2580 NTSTATUS
2581 NTAPI
2582 RtlMultiByteToUnicodeN(
2583 _Out_writes_bytes_to_(MaxBytesInUnicodeString, *BytesInUnicodeString) PWCH UnicodeString,
2584 _In_ ULONG MaxBytesInUnicodeString,
2585 _Out_opt_ PULONG BytesInUnicodeString,
2586 _In_reads_bytes_(BytesInMultiByteString) const CHAR *MultiByteString,
2587 _In_ ULONG BytesInMultiByteString
2588 );
2589
2590 _IRQL_requires_max_(PASSIVE_LEVEL)
2591 NTSYSAPI
2592 NTSTATUS
2593 NTAPI
2594 RtlMultiByteToUnicodeSize(
2595 _Out_ PULONG BytesInUnicodeString,
2596 _In_reads_bytes_(BytesInMultiByteString) const CHAR *MultiByteString,
2597 _In_ ULONG BytesInMultiByteString
2598 );
2599
2600 //
2601 // Atom Functions
2602 //
2603 NTSYSAPI
2604 NTSTATUS
2605 NTAPI
2606 RtlAddAtomToAtomTable(
2607 _In_ PRTL_ATOM_TABLE AtomTable,
2608 _In_ PWSTR AtomName,
2609 _Out_ PRTL_ATOM Atom
2610 );
2611
2612 NTSYSAPI
2613 NTSTATUS
2614 NTAPI
2615 RtlCreateAtomTable(
2616 _In_ ULONG TableSize,
2617 _Inout_ PRTL_ATOM_TABLE *AtomTable
2618 );
2619
2620 NTSYSAPI
2621 NTSTATUS
2622 NTAPI
2623 RtlDeleteAtomFromAtomTable(
2624 _In_ PRTL_ATOM_TABLE AtomTable,
2625 _In_ RTL_ATOM Atom
2626 );
2627
2628 NTSYSAPI
2629 NTSTATUS
2630 NTAPI
2631 RtlDestroyAtomTable(IN PRTL_ATOM_TABLE AtomTable);
2632
2633 NTSYSAPI
2634 NTSTATUS
2635 NTAPI
2636 RtlQueryAtomInAtomTable(
2637 _In_ PRTL_ATOM_TABLE AtomTable,
2638 _In_ RTL_ATOM Atom,
2639 _Out_opt_ PULONG RefCount,
2640 _Out_opt_ PULONG PinCount,
2641 _Out_opt_z_bytecap_(*NameLength) PWSTR AtomName,
2642 _Inout_opt_ PULONG NameLength
2643 );
2644
2645 NTSYSAPI
2646 NTSTATUS
2647 NTAPI
2648 RtlPinAtomInAtomTable(
2649 _In_ PRTL_ATOM_TABLE AtomTable,
2650 _In_ RTL_ATOM Atom
2651 );
2652
2653 NTSYSAPI
2654 NTSTATUS
2655 NTAPI
2656 RtlLookupAtomInAtomTable(
2657 _In_ PRTL_ATOM_TABLE AtomTable,
2658 _In_ PWSTR AtomName,
2659 _Out_ PRTL_ATOM Atom
2660 );
2661
2662 //
2663 // Process Management Functions
2664 //
2665 NTSYSAPI
2666 PPEB
2667 NTAPI
2668 RtlGetCurrentPeb(
2669 VOID
2670 );
2671
2672 NTSYSAPI
2673 VOID
2674 NTAPI
2675 RtlAcquirePebLock(VOID);
2676
2677 NTSYSAPI
2678 NTSTATUS
2679 NTAPI
2680 RtlCreateProcessParameters (
2681 _Out_ PRTL_USER_PROCESS_PARAMETERS *ProcessParameters,
2682 _In_ PUNICODE_STRING ImagePathName,
2683 _In_opt_ PUNICODE_STRING DllPath,
2684 _In_opt_ PUNICODE_STRING CurrentDirectory,
2685 _In_opt_ PUNICODE_STRING CommandLine,
2686 _In_opt_ PWSTR Environment,
2687 _In_opt_ PUNICODE_STRING WindowTitle,
2688 _In_opt_ PUNICODE_STRING DesktopInfo,
2689 _In_opt_ PUNICODE_STRING ShellInfo,
2690 _In_opt_ PUNICODE_STRING RuntimeInfo
2691 );
2692
2693 NTSYSAPI
2694 NTSTATUS
2695 NTAPI
2696 RtlCreateUserProcess(
2697 _In_ PUNICODE_STRING ImageFileName,
2698 _In_ ULONG Attributes,
2699 _In_ PRTL_USER_PROCESS_PARAMETERS ProcessParameters,
2700 _In_opt_ PSECURITY_DESCRIPTOR ProcessSecutityDescriptor,
2701 _In_opt_ PSECURITY_DESCRIPTOR ThreadSecurityDescriptor,
2702 _In_opt_ HANDLE ParentProcess,
2703 _In_ BOOLEAN CurrentDirectory,
2704 _In_opt_ HANDLE DebugPort,
2705 _In_opt_ HANDLE ExceptionPort,
2706 _Out_ PRTL_USER_PROCESS_INFORMATION ProcessInfo
2707 );
2708
2709 #if (NTDDI_VERSION >= NTDDI_WIN7)
2710 NTSYSAPI
2711 NTSTATUS
2712 NTAPI
2713 RtlCreateUserThread(
2714 _In_ PVOID ThreadContext,
2715 _Out_ HANDLE *OutThreadHandle,
2716 _Reserved_ PVOID Reserved1,
2717 _Reserved_ PVOID Reserved2,
2718 _Reserved_ PVOID Reserved3,
2719 _Reserved_ PVOID Reserved4,
2720 _Reserved_ PVOID Reserved5,
2721 _Reserved_ PVOID Reserved6,
2722 _Reserved_ PVOID Reserved7,
2723 _Reserved_ PVOID Reserved8
2724 );
2725 #else
2726 NTSYSAPI
2727 NTSTATUS
2728 NTAPI
2729 RtlCreateUserThread(
2730 _In_ HANDLE ProcessHandle,
2731 _In_opt_ PSECURITY_DESCRIPTOR SecurityDescriptor,
2732 _In_ BOOLEAN CreateSuspended,
2733 _In_ ULONG StackZeroBits,
2734 _In_ SIZE_T StackReserve,
2735 _In_ SIZE_T StackCommit,
2736 _In_ PTHREAD_START_ROUTINE StartAddress,
2737 _In_ PVOID Parameter,
2738 _Out_opt_ PHANDLE ThreadHandle,
2739 _Out_opt_ PCLIENT_ID ClientId
2740 );
2741 #endif
2742
2743 NTSYSAPI
2744 PRTL_USER_PROCESS_PARAMETERS
2745 NTAPI
2746 RtlDeNormalizeProcessParams(
2747 _In_ PRTL_USER_PROCESS_PARAMETERS ProcessParameters);
2748
2749 NTSYSAPI
2750 NTSTATUS
2751 NTAPI
2752 RtlDestroyProcessParameters(
2753 _In_ PRTL_USER_PROCESS_PARAMETERS ProcessParameters);
2754
2755 NTSYSAPI
2756 VOID
2757 NTAPI
2758 RtlExitUserThread(
2759 _In_ NTSTATUS Status);
2760
2761 NTSYSAPI
2762 VOID
2763 NTAPI
2764 RtlInitializeContext(
2765 _In_ HANDLE ProcessHandle,
2766 _Out_ PCONTEXT ThreadContext,
2767 _In_opt_ PVOID ThreadStartParam,
2768 _In_ PTHREAD_START_ROUTINE ThreadStartAddress,
2769 _In_ PINITIAL_TEB InitialTeb
2770 );
2771
2772 #ifdef _M_AMD64
2773 typedef struct _WOW64_CONTEXT *PWOW64_CONTEXT;
2774
2775 NTSYSAPI
2776 NTSTATUS
2777 NTAPI
2778 RtlWow64GetThreadContext(
2779 _In_ HANDLE ThreadHandle,
2780 _Inout_ PWOW64_CONTEXT ThreadContext
2781 );
2782
2783
2784 NTSYSAPI
2785 NTSTATUS
2786 NTAPI
2787 RtlWow64SetThreadContext(
2788 _In_ HANDLE ThreadHandle,
2789 _In_ PWOW64_CONTEXT ThreadContext
2790 );
2791 #endif
2792
2793 NTSYSAPI
2794 BOOLEAN
2795 NTAPI
2796 RtlIsThreadWithinLoaderCallout(VOID);
2797
2798 NTSYSAPI
2799 PRTL_USER_PROCESS_PARAMETERS
2800 NTAPI
2801 RtlNormalizeProcessParams(
2802 _In_ PRTL_USER_PROCESS_PARAMETERS ProcessParameters);
2803
2804 NTSYSAPI
2805 VOID
2806 NTAPI
2807 RtlReleasePebLock(VOID);
2808
2809 NTSYSAPI
2810 NTSTATUS
2811 NTAPI
2812 RtlRemoteCall(
2813 _In_ HANDLE Process,
2814 _In_ HANDLE Thread,
2815 _In_ PVOID CallSite,
2816 _In_ ULONG ArgumentCount,
2817 _In_ PULONG Arguments,
2818 _In_ BOOLEAN PassContext,
2819 _In_ BOOLEAN AlreadySuspended
2820 );
2821
2822 NTSYSAPI
2823 NTSTATUS
2824 __cdecl
2825 RtlSetProcessIsCritical(
2826 _In_ BOOLEAN NewValue,
2827 _Out_opt_ PBOOLEAN OldValue,
2828 _In_ BOOLEAN NeedBreaks
2829 );
2830
2831 NTSYSAPI
2832 NTSTATUS
2833 __cdecl
2834 RtlSetThreadIsCritical(
2835 _In_ BOOLEAN NewValue,
2836 _Out_opt_ PBOOLEAN OldValue,
2837 _In_ BOOLEAN NeedBreaks
2838 );
2839
2840 NTSYSAPI
2841 ULONG
2842 NTAPI
2843 RtlGetCurrentProcessorNumber(
2844 VOID
2845 );
2846
2847
2848 //
2849 // Thread Pool Functions
2850 //
2851 //
2852 NTSTATUS
2853 NTAPI
2854 RtlSetThreadPoolStartFunc(
2855 _In_ PRTL_START_POOL_THREAD StartPoolThread,
2856 _In_ PRTL_EXIT_POOL_THREAD ExitPoolThread
2857 );
2858
2859 NTSYSAPI
2860 NTSTATUS
2861 NTAPI
2862 RtlDeregisterWaitEx(
2863 _In_ HANDLE hWaitHandle,
2864 _In_opt_ HANDLE hCompletionEvent
2865 );
2866
2867 NTSYSAPI
2868 NTSTATUS
2869 NTAPI
2870 RtlDeregisterWait(
2871 _In_ HANDLE hWaitHandle
2872 );
2873
2874 NTSYSAPI
2875 NTSTATUS
2876 NTAPI
2877 RtlQueueWorkItem(
2878 _In_ WORKERCALLBACKFUNC Function,
2879 _In_opt_ PVOID Context,
2880 _In_ ULONG Flags
2881 );
2882
2883 NTSYSAPI
2884 NTSTATUS
2885 NTAPI
2886 RtlSetIoCompletionCallback(
2887 _In_ HANDLE FileHandle,
2888 _In_ PIO_APC_ROUTINE Callback,
2889 _In_ ULONG Flags
2890 );
2891
2892 NTSYSAPI
2893 NTSTATUS
2894 NTAPI
2895 RtlRegisterWait(
2896 _In_ PHANDLE phNewWaitObject,
2897 _In_ HANDLE hObject,
2898 _In_ WAITORTIMERCALLBACKFUNC Callback,
2899 _In_ PVOID pvContext,
2900 _In_ ULONG ulMilliseconds,
2901 _In_ ULONG ulFlags
2902 );
2903
2904 //
2905 // Environment/Path Functions
2906 //
2907 NTSYSAPI
2908 NTSTATUS
2909 NTAPI
2910 RtlCreateEnvironment(
2911 _In_ BOOLEAN Inherit,
2912 _Out_ PWSTR *Environment
2913 );
2914
2915 NTSYSAPI
2916 NTSTATUS
2917 NTAPI
2918 RtlComputePrivatizedDllName_U(
2919 _In_ PUNICODE_STRING DllName,
2920 _Inout_ PUNICODE_STRING RealName,
2921 _Inout_ PUNICODE_STRING LocalName
2922 );
2923
2924 NTSYSAPI
2925 VOID
2926 NTAPI
2927 RtlDestroyEnvironment(
2928 _In_ PWSTR Environment
2929 );
2930
2931 NTSYSAPI
2932 BOOLEAN
2933 NTAPI
2934 RtlDoesFileExists_U(
2935 _In_ PCWSTR FileName
2936 );
2937
2938 NTSYSAPI
2939 RTL_PATH_TYPE
2940 NTAPI
2941 RtlDetermineDosPathNameType_U(
2942 _In_ PCWSTR Path
2943 );
2944
2945 NTSYSAPI
2946 ULONG
2947 NTAPI
2948 RtlDosSearchPath_U(
2949 _In_ PCWSTR Path,
2950 _In_ PCWSTR FileName,
2951 _In_ PCWSTR Extension,
2952 _In_ ULONG BufferSize,
2953 _Out_ PWSTR Buffer,
2954 _Out_ PWSTR *PartName
2955 );
2956
2957 NTSYSAPI
2958 NTSTATUS
2959 NTAPI
2960 RtlDosSearchPath_Ustr(
2961 _In_ ULONG Flags,
2962 _In_ PUNICODE_STRING PathString,
2963 _In_ PUNICODE_STRING FileNameString,
2964 _In_ PUNICODE_STRING ExtensionString,
2965 _In_ PUNICODE_STRING CallerBuffer,
2966 _Inout_opt_ PUNICODE_STRING DynamicString,
2967 _Out_opt_ PUNICODE_STRING* FullNameOut,
2968 _Out_opt_ PSIZE_T FilePartSize,
2969 _Out_opt_ PSIZE_T LengthNeeded
2970 );
2971
2972 NTSYSAPI
2973 BOOLEAN
2974 NTAPI
2975 RtlDosPathNameToNtPathName_U(
2976 _In_opt_z_ PCWSTR DosPathName,
2977 _Out_ PUNICODE_STRING NtPathName,
2978 _Out_opt_ PCWSTR *NtFileNamePart,
2979 _Out_opt_ PRTL_RELATIVE_NAME_U DirectoryInfo
2980 );
2981
2982
2983 #define RTL_UNCHANGED_UNK_PATH 1
2984 #define RTL_CONVERTED_UNC_PATH 2
2985 #define RTL_CONVERTED_NT_PATH 3
2986 #define RTL_UNCHANGED_DOS_PATH 4
2987
2988 NTSYSAPI
2989 NTSTATUS
2990 NTAPI
2991 RtlNtPathNameToDosPathName(
2992 _In_ ULONG Flags,
2993 _Inout_ PRTL_UNICODE_STRING_BUFFER Path,
2994 _Out_opt_ PULONG PathType,
2995 _Out_opt_ PULONG Unknown
2996 );
2997
2998
2999 NTSYSAPI
3000 BOOLEAN
3001 NTAPI
3002 RtlDosPathNameToRelativeNtPathName_U(
3003 _In_ PCWSTR DosName,
3004 _Out_ PUNICODE_STRING NtName,
3005 _Out_ PCWSTR *PartName,
3006 _Out_ PRTL_RELATIVE_NAME_U RelativeName
3007 );
3008
3009 _At_(Destination->Buffer, _Out_bytecap_(Destination->MaximumLength))
3010 NTSYSAPI
3011 NTSTATUS
3012 NTAPI
3013 RtlExpandEnvironmentStrings_U(
3014 _In_z_ PWSTR Environment,
3015 _In_ PUNICODE_STRING Source,
3016 _Inout_ PUNICODE_STRING Destination,
3017 _Out_ PULONG Length
3018 );
3019
3020 NTSYSAPI
3021 ULONG
3022 NTAPI
3023 RtlGetCurrentDirectory_U(
3024 _In_ ULONG MaximumLength,
3025 _Out_bytecap_(MaximumLength) PWSTR Buffer
3026 );
3027
3028 NTSYSAPI
3029 ULONG
3030 NTAPI
3031 RtlGetFullPathName_U(
3032 _In_ PCWSTR FileName,
3033 _In_ ULONG Size,
3034 _Out_z_bytecap_(Size) PWSTR Buffer,
3035 _Out_opt_ PWSTR *ShortName
3036 );
3037
3038 #if (NTDDI_VERSION >= NTDDI_WIN7)
3039 NTSYSAPI
3040 NTSTATUS
3041 NTAPI
3042 RtlGetFullPathName_UEx(
3043 _In_ PWSTR FileName,
3044 _In_ ULONG BufferLength,
3045 _Out_ PWSTR Buffer,
3046 _Out_opt_ PWSTR *FilePart,
3047 _Out_opt_ RTL_PATH_TYPE *InputPathType
3048 );
3049 #endif
3050
3051 NTSTATUS
3052 NTAPI
3053 RtlGetFullPathName_UstrEx(
3054 _In_ PUNICODE_STRING FileName,
3055 _In_opt_ PUNICODE_STRING StaticString,
3056 _In_opt_ PUNICODE_STRING DynamicString,
3057 _Out_opt_ PUNICODE_STRING *StringUsed,
3058 _Out_opt_ PSIZE_T FilePartSize,
3059 _Out_opt_ PBOOLEAN NameInvalid,
3060 _Out_ RTL_PATH_TYPE* PathType,
3061 _Out_opt_ PSIZE_T LengthNeeded
3062 );
3063
3064 NTSYSAPI
3065 NTSTATUS
3066 NTAPI
3067 RtlGetLengthWithoutTrailingPathSeperators(
3068 _Reserved_ ULONG Flags,
3069 _In_ PCUNICODE_STRING PathString,
3070 _Out_ PULONG Length
3071 );
3072
3073 NTSYSAPI
3074 ULONG
3075 NTAPI
3076 RtlGetLongestNtPathLength(
3077 VOID
3078 );
3079
3080 NTSYSAPI
3081 ULONG
3082 NTAPI
3083 RtlIsDosDeviceName_U(
3084 _In_ PCWSTR Name
3085 );
3086
3087 NTSYSAPI
3088 ULONG
3089 NTAPI
3090 RtlIsDosDeviceName_Ustr(
3091 _In_ PCUNICODE_STRING Name
3092 );
3093
3094 _IRQL_requires_max_(PASSIVE_LEVEL)
3095 _Must_inspect_result_
3096 NTSYSAPI
3097 BOOLEAN
3098 NTAPI
3099 RtlIsNameLegalDOS8Dot3(
3100 _In_ PCUNICODE_STRING Name,
3101 _Inout_opt_ POEM_STRING OemName,
3102 _Out_opt_ PBOOLEAN NameContainsSpaces
3103 );
3104
3105 NTSYSAPI
3106 NTSTATUS
3107 NTAPI
3108 RtlQueryEnvironmentVariable_U(
3109 _In_opt_ PWSTR Environment,
3110 _In_ PCUNICODE_STRING Name,
3111 _Out_ PUNICODE_STRING Value
3112 );
3113
3114 VOID
3115 NTAPI
3116 RtlReleaseRelativeName(
3117 _In_ PRTL_RELATIVE_NAME_U RelativeName
3118 );
3119
3120 NTSYSAPI
3121 NTSTATUS
3122 NTAPI
3123 RtlSetCurrentDirectory_U(
3124 _In_ PUNICODE_STRING name
3125 );
3126
3127 NTSYSAPI
3128 NTSTATUS
3129 NTAPI
3130 RtlSetEnvironmentVariable(
3131 _In_z_ PWSTR *Environment,
3132 _In_ PUNICODE_STRING Name,
3133 _In_ PUNICODE_STRING Value
3134 );
3135
3136 //
3137 // Critical Section/Resource Functions
3138 //
3139 NTSYSAPI
3140 NTSTATUS
3141 NTAPI
3142 RtlDeleteCriticalSection (
3143 _In_ PRTL_CRITICAL_SECTION CriticalSection
3144 );
3145
3146 NTSYSAPI
3147 NTSTATUS
3148 NTAPI
3149 RtlEnterCriticalSection(
3150 _In_ PRTL_CRITICAL_SECTION CriticalSection
3151 );
3152
3153 NTSYSAPI
3154 NTSTATUS
3155 NTAPI
3156 RtlInitializeCriticalSection(
3157 _In_ PRTL_CRITICAL_SECTION CriticalSection
3158 );
3159
3160 NTSYSAPI
3161 NTSTATUS
3162 NTAPI
3163 RtlInitializeCriticalSectionAndSpinCount(
3164 _In_ PRTL_CRITICAL_SECTION CriticalSection,
3165 _In_ ULONG SpinCount
3166 );
3167
3168 NTSYSAPI
3169 ULONG
3170 NTAPI
3171 RtlIsCriticalSectionLocked(
3172 _In_ PRTL_CRITICAL_SECTION CriticalSection
3173 );
3174
3175 NTSYSAPI
3176 ULONG
3177 NTAPI
3178 RtlIsCriticalSectionLockedByThread(
3179 _In_ PRTL_CRITICAL_SECTION CriticalSection
3180 );
3181
3182 NTSYSAPI
3183 NTSTATUS
3184 NTAPI
3185 RtlLeaveCriticalSection(
3186 _In_ PRTL_CRITICAL_SECTION CriticalSection
3187 );
3188
3189 NTSYSAPI
3190 BOOLEAN
3191 NTAPI
3192 RtlTryEnterCriticalSection(
3193 _In_ PRTL_CRITICAL_SECTION CriticalSection
3194 );
3195
3196 NTSYSAPI
3197 VOID
3198 NTAPI
3199 RtlpUnWaitCriticalSection(
3200 _In_ PRTL_CRITICAL_SECTION CriticalSection
3201 );
3202
3203 NTSYSAPI
3204 NTSTATUS
3205 NTAPI
3206 RtlpWaitForCriticalSection(
3207 _In_ PRTL_CRITICAL_SECTION CriticalSection
3208 );
3209
3210 NTSYSAPI
3211 BOOLEAN
3212 NTAPI
3213 RtlAcquireResourceExclusive(
3214 _In_ PRTL_RESOURCE Resource,
3215 _In_ BOOLEAN Wait
3216 );
3217
3218 NTSYSAPI
3219 BOOLEAN
3220 NTAPI
3221 RtlAcquireResourceShared(
3222 _In_ PRTL_RESOURCE Resource,
3223 _In_ BOOLEAN Wait
3224 );
3225
3226 NTSYSAPI
3227 VOID
3228 NTAPI
3229 RtlConvertExclusiveToShared(
3230 _In_ PRTL_RESOURCE Resource
3231 );
3232
3233 NTSYSAPI
3234 VOID
3235 NTAPI
3236 RtlConvertSharedToExclusive(
3237 _In_ PRTL_RESOURCE Resource
3238 );
3239
3240 NTSYSAPI
3241 VOID
3242 NTAPI
3243 RtlDeleteResource(
3244 _In_ PRTL_RESOURCE Resource
3245 );
3246
3247 NTSYSAPI
3248 VOID
3249 NTAPI
3250 RtlDumpResource(
3251 _In_ PRTL_RESOURCE Resource
3252 );
3253
3254 NTSYSAPI
3255 VOID
3256 NTAPI
3257 RtlInitializeResource(
3258 _In_ PRTL_RESOURCE Resource
3259 );
3260
3261 NTSYSAPI
3262 VOID
3263 NTAPI
3264 RtlReleaseResource(
3265 _In_ PRTL_RESOURCE Resource
3266 );
3267
3268 //
3269 // Compression Functions
3270 //
3271 NTSYSAPI //NT_RTL_COMPRESS_API
3272 NTSTATUS
3273 NTAPI
3274 RtlCompressBuffer(
3275 _In_ USHORT CompressionFormatAndEngine,
3276 _In_reads_bytes_(UncompressedBufferSize) PUCHAR UncompressedBuffer,
3277 _In_ ULONG UncompressedBufferSize,
3278 _Out_writes_bytes_to_(CompressedBufferSize, *FinalCompressedSize) PUCHAR CompressedBuffer,
3279 _In_ ULONG CompressedBufferSize,
3280 _In_ ULONG UncompressedChunkSize,
3281 _Out_ PULONG FinalCompressedSize,
3282 _In_ PVOID WorkSpace
3283 );
3284
3285 _IRQL_requires_max_(APC_LEVEL)
3286 NTSYSAPI //NT_RTL_COMPRESS_API
3287 NTSTATUS
3288 NTAPI
3289 RtlDecompressBuffer(
3290 _In_ USHORT CompressionFormat,
3291 _Out_writes_bytes_to_(UncompressedBufferSize, *FinalUncompressedSize) PUCHAR UncompressedBuffer,
3292 _In_ ULONG UncompressedBufferSize,
3293 _In_reads_bytes_(CompressedBufferSize) PUCHAR CompressedBuffer,
3294 _In_ ULONG CompressedBufferSize,
3295 _Out_ PULONG FinalUncompressedSize
3296 );
3297
3298 NTSYSAPI
3299 NTSTATUS
3300 NTAPI
3301 RtlGetCompressionWorkSpaceSize(
3302 _In_ USHORT CompressionFormatAndEngine,
3303 _Out_ PULONG CompressBufferWorkSpaceSize,
3304 _Out_ PULONG CompressFragmentWorkSpaceSize
3305 );
3306
3307 //
3308 // Frame Functions
3309 //
3310 NTSYSAPI
3311 VOID
3312 NTAPI
3313 RtlPopFrame(
3314 _In_ PTEB_ACTIVE_FRAME Frame
3315 );
3316
3317 NTSYSAPI
3318 VOID
3319 NTAPI
3320 RtlPushFrame(
3321 _In_ PTEB_ACTIVE_FRAME Frame
3322 );
3323
3324 NTSYSAPI
3325 PTEB_ACTIVE_FRAME
3326 NTAPI
3327 RtlGetFrame(
3328 VOID
3329 );
3330
3331 //
3332 // Debug Info Functions
3333 //
3334 NTSYSAPI
3335 PRTL_DEBUG_INFORMATION
3336 NTAPI
3337 RtlCreateQueryDebugBuffer(
3338 _In_ ULONG Size,
3339 _In_ BOOLEAN EventPair
3340 );
3341
3342 NTSYSAPI
3343 NTSTATUS
3344 NTAPI
3345 RtlDestroyQueryDebugBuffer(IN PRTL_DEBUG_INFORMATION DebugBuffer);
3346
3347 NTSYSAPI
3348 NTSTATUS
3349 NTAPI
3350 RtlQueryProcessDebugInformation(
3351 _In_ ULONG ProcessId,
3352 _In_ ULONG DebugInfoClassMask,
3353 _Inout_ PRTL_DEBUG_INFORMATION DebugBuffer
3354 );
3355
3356 //
3357 // Bitmap Functions
3358 //
3359 #ifdef NTOS_MODE_USER
3360
3361 NTSYSAPI
3362 BOOLEAN
3363 NTAPI
3364 RtlAreBitsClear(
3365 _In_ PRTL_BITMAP BitMapHeader,
3366 _In_ ULONG StartingIndex,
3367 _In_ ULONG Length
3368 );
3369
3370 NTSYSAPI
3371 BOOLEAN
3372 NTAPI
3373 RtlAreBitsSet(
3374 _In_ PRTL_BITMAP BitMapHeader,
3375 _In_ ULONG StartingIndex,
3376 _In_ ULONG Length
3377 );
3378
3379 NTSYSAPI
3380 VOID
3381 NTAPI
3382 RtlClearAllBits(
3383 _In_ PRTL_BITMAP BitMapHeader
3384 );
3385
3386 NTSYSAPI
3387 VOID
3388 NTAPI
3389 RtlClearBit(
3390 _In_ PRTL_BITMAP BitMapHeader,
3391 _In_range_(<, BitMapHeader->SizeOfBitMap) ULONG BitNumber
3392 );
3393
3394 NTSYSAPI
3395 VOID
3396 NTAPI
3397 RtlClearBits(
3398 _In_ PRTL_BITMAP BitMapHeader,
3399 _In_range_(0, BitMapHeader->SizeOfBitMap - NumberToClear) ULONG StartingIndex,
3400 _In_range_(0, BitMapHeader->SizeOfBitMap - StartingIndex) ULONG NumberToClear
3401 );
3402
3403 NTSYSAPI
3404 ULONG
3405 NTAPI
3406 RtlFindClearBits(
3407 _In_ PRTL_BITMAP BitMapHeader,
3408 _In_ ULONG NumberToFind,
3409 _In_ ULONG HintIndex
3410 );
3411
3412 NTSYSAPI
3413 ULONG
3414 NTAPI
3415 RtlFindClearBitsAndSet(
3416 _In_ PRTL_BITMAP BitMapHeader,
3417 _In_ ULONG NumberToFind,
3418 _In_ ULONG HintIndex
3419 );
3420
3421 NTSYSAPI
3422 ULONG
3423 NTAPI
3424 RtlFindFirstRunClear(
3425 _In_ PRTL_BITMAP BitMapHeader,
3426 _Out_ PULONG StartingIndex
3427 );
3428
3429 NTSYSAPI
3430 ULONG
3431 NTAPI
3432 RtlFindClearRuns(
3433 _In_ PRTL_BITMAP BitMapHeader,
3434 _Out_writes_to_(SizeOfRunArray, return) PRTL_BITMAP_RUN RunArray,
3435 _In_range_(>, 0) ULONG SizeOfRunArray,
3436 _In_ BOOLEAN LocateLongestRuns
3437 );
3438
3439 NTSYSAPI
3440 ULONG
3441 NTAPI
3442 RtlFindLastBackwardRunClear(
3443 _In_ PRTL_BITMAP BitMapHeader,
3444 _In_ ULONG FromIndex,
3445 _Out_ PULONG StartingRunIndex
3446 );
3447
3448 NTSYSAPI
3449 CCHAR
3450 NTAPI
3451 RtlFindLeastSignificantBit(
3452 _In_ ULONGLONG Value
3453 );
3454
3455 NTSYSAPI
3456 ULONG
3457 NTAPI
3458 RtlFindLongestRunClear(
3459 _In_ PRTL_BITMAP BitMapHeader,
3460 _Out_ PULONG StartingIndex
3461 );
3462
3463 NTSYSAPI
3464 CCHAR
3465 NTAPI
3466 RtlFindMostSignificantBit(
3467 _In_ ULONGLONG Value
3468 );
3469
3470 NTSYSAPI
3471 ULONG
3472 NTAPI
3473 RtlFindNextForwardRunClear(
3474 _In_ PRTL_BITMAP BitMapHeader,
3475 _In_ ULONG FromIndex,
3476 _Out_ PULONG StartingRunIndex
3477 );
3478
3479 NTSYSAPI
3480 ULONG
3481 NTAPI
3482 RtlFindNextForwardRunSet(
3483 _In_ PRTL_BITMAP BitMapHeader,
3484 _In_ ULONG FromIndex,
3485 _Out_ PULONG StartingRunIndex
3486 );
3487
3488 NTSYSAPI
3489 ULONG
3490 NTAPI
3491 RtlFindSetBits(
3492 _In_ PRTL_BITMAP BitMapHeader,
3493 _In_ ULONG NumberToFind,
3494 _In_ ULONG HintIndex
3495 );
3496
3497 NTSYSAPI
3498 ULONG
3499 NTAPI
3500 RtlFindSetBitsAndClear(
3501 _In_ PRTL_BITMAP BitMapHeader,
3502 _In_ ULONG NumberToFind,
3503 _In_ ULONG HintIndex
3504 );
3505
3506 #ifdef __REACTOS__ // ReactOS improvement
3507 _At_(BitMapHeader->SizeOfBitMap, _Post_equal_to_(SizeOfBitMap))
3508 _At_(BitMapHeader->Buffer, _Post_equal_to_(BitMapBuffer))
3509 #endif
3510 NTSYSAPI
3511 VOID
3512 NTAPI
3513 RtlInitializeBitMap(
3514 _Out_ PRTL_BITMAP BitMapHeader,
3515 _In_opt_ __drv_aliasesMem PULONG BitMapBuffer,
3516 _In_opt_ ULONG SizeOfBitMap
3517 );
3518
3519 NTSYSAPI
3520 ULONG
3521 NTAPI
3522 RtlNumberOfClearBits(
3523 _In_ PRTL_BITMAP BitMapHeader
3524 );
3525
3526 NTSYSAPI
3527 ULONG
3528 NTAPI
3529 RtlNumberOfSetBits(
3530 _In_ PRTL_BITMAP BitMapHeader
3531 );
3532
3533 NTSYSAPI
3534 VOID
3535 NTAPI
3536 RtlSetBit(
3537 _In_ PRTL_BITMAP BitMapHeader,
3538 _In_range_(<, BitMapHeader->SizeOfBitMap) ULONG BitNumber
3539 );
3540
3541 NTSYSAPI
3542 VOID
3543 NTAPI
3544 RtlSetBits(
3545 _In_ PRTL_BITMAP BitMapHeader,
3546 _In_range_(0, BitMapHeader->SizeOfBitMap - NumberToSet) ULONG StartingIndex,
3547 _In_range_(0, BitMapHeader->SizeOfBitMap - StartingIndex) ULONG NumberToSet
3548 );
3549
3550 NTSYSAPI
3551 VOID
3552 NTAPI
3553 RtlSetAllBits(
3554 _In_ PRTL_BITMAP BitMapHeader
3555 );
3556
3557 _Must_inspect_result_
3558 NTSYSAPI
3559 BOOLEAN
3560 NTAPI
3561 RtlTestBit(
3562 _In_ PRTL_BITMAP BitMapHeader,
3563 _In_range_(<, BitMapHeader->SizeOfBitMap) ULONG BitNumber
3564 );
3565
3566 #if defined(_M_AMD64)
3567 _Must_inspect_result_
3568 FORCEINLINE
3569 BOOLEAN
3570 RtlCheckBit(
3571 _In_ PRTL_BITMAP BitMapHeader,
3572 _In_range_(<, BitMapHeader->SizeOfBitMap) ULONG BitPosition)
3573 {
3574 return BitTest64((LONG64 CONST*)BitMapHeader->Buffer, (LONG64)BitPosition);
3575 }
3576 #else
3577 #define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP)/32]) >> ((BP)%32)) & 0x1)
3578 #endif /* defined(_M_AMD64) */
3579
3580 #endif // NTOS_MODE_USER
3581
3582
3583 //
3584 // Timer Functions
3585 //
3586 NTSYSAPI
3587 NTSTATUS
3588 NTAPI
3589 RtlCreateTimer(
3590 _In_ HANDLE TimerQueue,
3591 _In_ PHANDLE phNewTimer,
3592 _In_ WAITORTIMERCALLBACKFUNC Callback,
3593 _In_ PVOID Parameter,
3594 _In_ ULONG DueTime,
3595 _In_ ULONG Period,
3596 _In_ ULONG Flags
3597 );
3598
3599 NTSYSAPI
3600 NTSTATUS
3601 NTAPI
3602 RtlCreateTimerQueue(PHANDLE TimerQueue);
3603
3604 NTSYSAPI
3605 NTSTATUS
3606 NTAPI
3607 RtlDeleteTimer(
3608 _In_ HANDLE TimerQueue,
3609 _In_ HANDLE Timer,
3610 _In_ HANDLE CompletionEvent
3611 );
3612
3613 NTSYSAPI
3614 NTSTATUS
3615 NTAPI
3616 RtlUpdateTimer(
3617 _In_ HANDLE TimerQueue,
3618 _In_ HANDLE Timer,
3619 _In_ ULONG DueTime,
3620 _In_ ULONG Period
3621 );
3622
3623 NTSYSAPI
3624 NTSTATUS
3625 NTAPI
3626 RtlDeleteTimerQueueEx(
3627 _In_ HANDLE TimerQueue,
3628 _In_opt_ HANDLE CompletionEvent
3629 );
3630
3631 NTSYSAPI
3632 NTSTATUS
3633 NTAPI
3634 RtlDeleteTimerQueue(HANDLE TimerQueue);
3635
3636 //
3637 // SList functions
3638 //
3639 PSLIST_ENTRY
3640 FASTCALL
3641 InterlockedPushListSList(
3642 _Inout_ PSLIST_HEADER ListHead,
3643 _Inout_ __drv_aliasesMem PSLIST_ENTRY List,
3644 _Inout_ PSLIST_ENTRY ListEnd,
3645 _In_ ULONG Count
3646 );
3647
3648 //
3649 // Range List functions
3650 //
3651 NTSYSAPI
3652 VOID
3653 NTAPI
3654 RtlInitializeRangeList(
3655 _Out_ PRTL_RANGE_LIST RangeList
3656 );
3657
3658 NTSYSAPI
3659 VOID
3660 NTAPI
3661 RtlFreeRangeList(
3662 _In_ PRTL_RANGE_LIST RangeList
3663 );
3664
3665 NTSYSAPI
3666 NTSTATUS
3667 NTAPI
3668 RtlCopyRangeList(
3669 _Out_ PRTL_RANGE_LIST CopyRangeList,
3670 _In_ PRTL_RANGE_LIST RangeList
3671 );
3672
3673 NTSYSAPI
3674 NTSTATUS
3675 NTAPI
3676 RtlMergeRangeLists(
3677 _Out_ PRTL_RANGE_LIST MergedRangeList,
3678 _In_ PRTL_RANGE_LIST RangeList1,
3679 _In_ PRTL_RANGE_LIST RangeList2,
3680 _In_ ULONG Flags
3681 );
3682
3683 NTSYSAPI
3684 NTSTATUS
3685 NTAPI
3686 RtlInvertRangeList(
3687 _Out_ PRTL_RANGE_LIST InvertedRangeList,
3688 _In_ PRTL_RANGE_LIST RangeList
3689 );
3690
3691 NTSYSAPI
3692 NTSTATUS
3693 NTAPI
3694 RtlAddRange(
3695 _Inout_ PRTL_RANGE_LIST RangeList,
3696 _In_ ULONGLONG Start,
3697 _In_ ULONGLONG End,
3698 _In_ UCHAR Attributes,
3699 _In_ ULONG Flags,
3700 _In_opt_ PVOID UserData,
3701 _In_opt_ PVOID Owner
3702 );
3703
3704 NTSYSAPI
3705 NTSTATUS
3706 NTAPI
3707 RtlDeleteRange(
3708 _Inout_ PRTL_RANGE_LIST RangeList,
3709 _In_ ULONGLONG Start,
3710 _In_ ULONGLONG End,
3711 _In_ PVOID Owner
3712 );
3713
3714 NTSYSAPI
3715 NTSTATUS
3716 NTAPI
3717 RtlDeleteOwnersRanges(
3718 _Inout_ PRTL_RANGE_LIST RangeList,
3719 _In_ _Maybenull_ PVOID Owner
3720 );
3721
3722 NTSYSAPI
3723 NTSTATUS
3724 NTAPI
3725 RtlFindRange(
3726 _In_ PRTL_RANGE_LIST RangeList,
3727 _In_ ULONGLONG Minimum,
3728 _In_ ULONGLONG Maximum,
3729 _In_ ULONG Length,
3730 _In_ ULONG Alignment,
3731 _In_ ULONG Flags,
3732 _In_ UCHAR AttributeAvailableMask,
3733 _In_opt_ PVOID Context,
3734 _In_opt_ PRTL_CONFLICT_RANGE_CALLBACK Callback,
3735 _Out_ PULONGLONG Start
3736 );
3737
3738 NTSYSAPI
3739 NTSTATUS
3740 NTAPI
3741 RtlIsRangeAvailable(
3742 _In_ PRTL_RANGE_LIST RangeList,
3743 _In_ ULONGLONG Start,
3744 _In_ ULONGLONG End,
3745 _In_ ULONG Flags,
3746 _In_ UCHAR AttributeAvailableMask,
3747 _In_opt_ PVOID Context,
3748 _In_opt_ PRTL_CONFLICT_RANGE_CALLBACK Callback,
3749 _Out_ PBOOLEAN Available
3750 );
3751
3752 NTSYSAPI
3753 NTSTATUS
3754 NTAPI
3755 RtlGetFirstRange(
3756 _In_ PRTL_RANGE_LIST RangeList,
3757 _Out_ PRTL_RANGE_LIST_ITERATOR Iterator,
3758 _Outptr_ PRTL_RANGE *Range
3759 );
3760
3761 NTSYSAPI
3762 NTSTATUS
3763 NTAPI
3764 RtlGetNextRange(
3765 _Inout_ PRTL_RANGE_LIST_ITERATOR Iterator,
3766 _Outptr_ PRTL_RANGE *Range,
3767 _In_ BOOLEAN MoveForwards
3768 );
3769
3770 //
3771 // Debug Functions
3772 //
3773 ULONG
3774 __cdecl
3775 DbgPrint(
3776 _In_z_ _Printf_format_string_ PCSTR Format,
3777 ...
3778 );
3779
3780 NTSYSAPI
3781 ULONG
3782 __cdecl
3783 DbgPrintEx(
3784 _In_ ULONG ComponentId,
3785 _In_ ULONG Level,
3786 _In_z_ _Printf_format_string_ PCSTR Format,
3787 ...
3788 );
3789
3790 NTSYSAPI
3791 ULONG
3792 NTAPI
3793 DbgPrompt(
3794 _In_z_ PCCH Prompt,
3795 _Out_writes_bytes_(MaximumResponseLength) PCH Response,
3796 _In_ ULONG MaximumResponseLength
3797 );
3798
3799 #undef DbgBreakPoint
3800 VOID
3801 NTAPI
3802 DbgBreakPoint(
3803 VOID
3804 );
3805
3806 VOID
3807 NTAPI
3808 DbgLoadImageSymbols(
3809 _In_ PSTRING Name,
3810 _In_ PVOID Base,
3811 _In_ ULONG_PTR ProcessId
3812 );
3813
3814 VOID
3815 NTAPI
3816 DbgUnLoadImageSymbols(
3817 _In_ PSTRING Name,
3818 _In_ PVOID Base,
3819 _In_ ULONG_PTR ProcessId
3820 );
3821
3822 VOID
3823 NTAPI
3824 DbgCommandString(
3825 _In_ PCCH Name,
3826 _In_ PCCH Command
3827 );
3828
3829 //
3830 // Generic Table Functions
3831 //
3832 #if defined(NTOS_MODE_USER) || defined(_NTIFS_)
3833 NTSYSAPI
3834 PVOID
3835 NTAPI
3836 RtlInsertElementGenericTable(
3837 _In_ PRTL_GENERIC_TABLE Table,
3838 _In_reads_bytes_(BufferSize) PVOID Buffer,
3839 _In_ CLONG BufferSize,
3840 _Out_opt_ PBOOLEAN NewElement
3841 );
3842
3843 NTSYSAPI
3844 PVOID
3845 NTAPI
3846 RtlInsertElementGenericTableFull(
3847 _In_ PRTL_GENERIC_TABLE Table,
3848 _In_reads_bytes_(BufferSize) PVOID Buffer,
3849 _In_ CLONG BufferSize,
3850 _Out_opt_ PBOOLEAN NewElement,
3851 _In_ PVOID NodeOrParent,
3852 _In_ TABLE_SEARCH_RESULT SearchResult
3853 );
3854
3855 NTSYSAPI
3856 BOOLEAN
3857 NTAPI
3858 RtlIsGenericTableEmpty(
3859 _In_ PRTL_GENERIC_TABLE Table
3860 );
3861
3862 NTSYSAPI
3863 PVOID
3864 NTAPI
3865 RtlLookupElementGenericTableFull(
3866 _In_ PRTL_GENERIC_TABLE Table,
3867 _In_ PVOID Buffer,
3868 _Out_ PVOID *NodeOrParent,
3869 _Out_ TABLE_SEARCH_RESULT *SearchResult
3870 );
3871 #endif
3872
3873 //
3874 // Handle Table Functions
3875 //
3876 NTSYSAPI
3877 PRTL_HANDLE_TABLE_ENTRY
3878 NTAPI
3879 RtlAllocateHandle(
3880 _In_ PRTL_HANDLE_TABLE HandleTable,
3881 _Inout_ PULONG Index
3882 );
3883
3884 NTSYSAPI
3885 VOID
3886 NTAPI
3887 RtlDestroyHandleTable(
3888 _Inout_ PRTL_HANDLE_TABLE HandleTable);
3889
3890 NTSYSAPI
3891 BOOLEAN
3892 NTAPI
3893 RtlFreeHandle(
3894 _In_ PRTL_HANDLE_TABLE HandleTable,
3895 _In_ PRTL_HANDLE_TABLE_ENTRY Handle
3896 );
3897
3898 NTSYSAPI
3899 VOID
3900 NTAPI
3901 RtlInitializeHandleTable(
3902 _In_ ULONG TableSize,
3903 _In_ ULONG HandleSize,
3904 _In_ PRTL_HANDLE_TABLE HandleTable
3905 );
3906
3907 NTSYSAPI
3908 BOOLEAN
3909 NTAPI
3910 RtlIsValidHandle(
3911 _In_ PRTL_HANDLE_TABLE HandleTable,
3912 _In_ PRTL_HANDLE_TABLE_ENTRY Handle
3913 );
3914
3915 _Success_(return!=FALSE)
3916 NTSYSAPI
3917 BOOLEAN
3918 NTAPI
3919 RtlIsValidIndexHandle(
3920 _In_ PRTL_HANDLE_TABLE HandleTable,
3921 _In_ ULONG Index,
3922 _Out_ PRTL_HANDLE_TABLE_ENTRY *Handle
3923 );
3924
3925 //
3926 // PE Functions
3927 //
3928 NTSYSAPI
3929 NTSTATUS
3930 NTAPI
3931 RtlFindMessage(
3932 _In_ PVOID BaseAddress,
3933 _In_ ULONG Type,
3934 _In_ ULONG Language,
3935 _In_ ULONG MessageId,
3936 _Out_ PMESSAGE_RESOURCE_ENTRY *MessageResourceEntry
3937 );
3938
3939 NTSYSAPI
3940 ULONG
3941 NTAPI
3942 RtlGetNtGlobalFlags(VOID);
3943
3944 _Success_(return!=NULL)
3945 NTSYSAPI
3946 PVOID
3947 NTAPI
3948 RtlImageDirectoryEntryToData(
3949 _In_ PVOID BaseAddress,
3950 _In_ BOOLEAN MappedAsImage,
3951 _In_ USHORT Directory,
3952 _Out_ PULONG Size
3953 );
3954
3955 NTSYSAPI
3956 PVOID
3957 NTAPI
3958 RtlImageRvaToVa(
3959 _In_ PIMAGE_NT_HEADERS NtHeader,
3960 _In_ PVOID BaseAddress,
3961 _In_ ULONG Rva,
3962 _Inout_opt_ PIMAGE_SECTION_HEADER *SectionHeader
3963 );
3964
3965 NTSYSAPI
3966 PIMAGE_NT_HEADERS
3967 NTAPI
3968 RtlImageNtHeader(
3969 _In_ PVOID BaseAddress);
3970
3971 NTSYSAPI
3972 NTSTATUS
3973 NTAPI
3974 RtlImageNtHeaderEx(
3975 _In_ ULONG Flags,
3976 _In_ PVOID BaseAddress,
3977 _In_ ULONGLONG Size,
3978 _Out_ PIMAGE_NT_HEADERS *NtHeader
3979 );
3980
3981 NTSYSAPI
3982 PIMAGE_SECTION_HEADER
3983 NTAPI
3984 RtlImageRvaToSection(
3985 _In_ PIMAGE_NT_HEADERS NtHeader,
3986 _In_ PVOID BaseAddress,
3987 _In_ ULONG Rva
3988 );
3989
3990 ULONG
3991 NTAPI
3992 LdrRelocateImageWithBias(
3993 _In_ PVOID BaseAddress,
3994 _In_ LONGLONG AdditionalBias,
3995 _In_opt_ PCSTR LoaderName,
3996 _In_ ULONG Success,
3997 _In_ ULONG Conflict,
3998 _In_ ULONG Invalid
3999 );
4000
4001 //
4002 // Activation Context Functions
4003 //
4004 #ifdef NTOS_MODE_USER
4005 NTSYSAPI
4006 NTSTATUS
4007 NTAPI
4008 RtlActivateActivationContextEx(
4009 _In_ ULONG Flags,
4010 _In_ PTEB Teb,
4011 _In_ PVOID Context,
4012 _Out_ PULONG_PTR Cookie
4013 );
4014
4015 NTSYSAPI
4016 NTSTATUS
4017 NTAPI
4018 RtlActivateActivationContext(
4019 _In_ ULONG Flags,
4020 _In_ HANDLE Handle,
4021 _Out_ PULONG_PTR Cookie
4022 );
4023
4024 NTSYSAPI
4025 VOID
4026 NTAPI
4027 RtlAddRefActivationContext(
4028 _In_ PVOID Context
4029 );
4030
4031 NTSYSAPI
4032 PRTL_ACTIVATION_CONTEXT_STACK_FRAME
4033 FASTCALL
4034 RtlActivateActivationContextUnsafeFast(
4035 _In_ PRTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED Frame,
4036 _In_ PVOID Context
4037 );
4038
4039 NTSYSAPI
4040 NTSTATUS
4041 NTAPI
4042 RtlAllocateActivationContextStack(
4043 _In_ PACTIVATION_CONTEXT_STACK *Stack
4044 );
4045
4046 NTSYSAPI
4047 NTSTATUS
4048 NTAPI
4049 RtlCreateActivationContext(
4050 _In_ ULONG Flags,
4051 _In_ PACTIVATION_CONTEXT_DATA ActivationContextData,
4052 _In_ ULONG ExtraBytes,
4053 _In_ PVOID NotificationRoutine,
4054 _In_ PVOID NotificationContext,
4055 _Out_ PACTIVATION_CONTEXT *ActCtx
4056 );
4057
4058 NTSYSAPI
4059 NTSTATUS
4060 NTAPI
4061 RtlGetActiveActivationContext(
4062 _In_ PVOID *Context
4063 );
4064
4065 NTSYSAPI
4066 VOID
4067 NTAPI
4068 RtlReleaseActivationContext(
4069 _In_ HANDLE handle
4070 );
4071
4072 NTSYSAPI
4073 NTSTATUS
4074 NTAPI
4075 RtlDeactivateActivationContext(
4076 _In_ ULONG dwFlags,
4077 _In_ ULONG_PTR ulCookie
4078 );
4079
4080 NTSYSAPI
4081 VOID
4082 NTAPI
4083 RtlFreeActivationContextStack(
4084 _In_ PACTIVATION_CONTEXT_STACK Stack
4085 );
4086
4087 NTSYSAPI
4088 VOID
4089 NTAPI
4090 RtlFreeThreadActivationContextStack(VOID);
4091
4092 NTSYSAPI
4093 PRTL_ACTIVATION_CONTEXT_STACK_FRAME
4094 FASTCALL
4095 RtlDeactivateActivationContextUnsafeFast(
4096 _In_ PRTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED Frame
4097 );
4098
4099 NTSYSAPI
4100 NTSTATUS
4101 NTAPI
4102 RtlDosApplyFileIsolationRedirection_Ustr(
4103 _In_ ULONG Flags,
4104 _In_ PUNICODE_STRING OriginalName,
4105 _In_ PUNICODE_STRING Extension,
4106 _Inout_ PUNICODE_STRING StaticString,
4107 _Inout_ PUNICODE_STRING DynamicString,
4108 _Inout_ PUNICODE_STRING *NewName,
4109 _In_ PULONG NewFlags,
4110 _In_ PSIZE_T FileNameSize,
4111 _In_ PSIZE_T RequiredLength
4112 );
4113
4114 NTSYSAPI
4115 NTSTATUS
4116 NTAPI
4117 RtlFindActivationContextSectionString(
4118 _In_ ULONG dwFlags,
4119 _In_ const GUID *ExtensionGuid,
4120 _In_ ULONG SectionType,
4121 _In_ const UNICODE_STRING *SectionName,
4122 _Inout_ PVOID ReturnedData
4123 );
4124
4125 NTSYSAPI
4126 NTSTATUS
4127 NTAPI
4128 RtlQueryInformationActivationContext(
4129 _In_ DWORD dwFlags,
4130 _In_opt_ PVOID Context,
4131 _In_opt_ PVOID pvSubInstance,
4132 _In_ ULONG ulInfoClass,
4133 _Out_bytecap_(cbBuffer) PVOID pvBuffer,
4134 _In_opt_ SIZE_T cbBuffer,
4135 _Out_opt_ SIZE_T *pcbWrittenOrRequired
4136 );
4137
4138 NTSYSAPI
4139 NTSTATUS
4140 NTAPI
4141 RtlQueryInformationActiveActivationContext(
4142 _In_ ULONG ulInfoClass,
4143 _Out_bytecap_(cbBuffer) PVOID pvBuffer,
4144 _In_opt_ SIZE_T cbBuffer,
4145 _Out_opt_ SIZE_T *pcbWrittenOrRequired
4146 );
4147
4148 NTSYSAPI
4149 NTSTATUS
4150 NTAPI
4151 RtlZombifyActivationContext(
4152 PVOID Context
4153 );
4154
4155 //
4156 // WOW64 Functions
4157 //
4158 NTSYSAPI
4159 NTSTATUS
4160 NTAPI
4161 RtlWow64EnableFsRedirection(
4162 _In_ BOOLEAN Wow64FsEnableRedirection
4163 );
4164
4165 NTSYSAPI
4166 NTSTATUS
4167 NTAPI
4168 RtlWow64EnableFsRedirectionEx(
4169 _In_ PVOID Wow64FsEnableRedirection,
4170 _Out_ PVOID *OldFsRedirectionLevel
4171 );
4172
4173 #endif
4174
4175 //
4176 // Registry Functions
4177 //
4178 _IRQL_requires_max_(PASSIVE_LEVEL)
4179 _Must_inspect_result_
4180 NTSYSAPI
4181 NTSTATUS
4182 NTAPI
4183 RtlCheckRegistryKey(
4184 _In_ ULONG RelativeTo,
4185 _In_ PWSTR Path
4186 );
4187
4188 NTSYSAPI
4189 NTSTATUS
4190 NTAPI
4191 RtlCreateRegistryKey(
4192 _In_ ULONG RelativeTo,
4193 _In_ PWSTR Path
4194 );
4195
4196 NTSYSAPI
4197 NTSTATUS
4198 NTAPI
4199 RtlFormatCurrentUserKeyPath(
4200 _Out_ _At_(KeyPath->Buffer, __drv_allocatesMem(Mem) _Post_bytecap_(KeyPath->MaximumLength) _Post_bytecount_(KeyPath->Length))
4201 PUNICODE_STRING KeyPath
4202 );
4203
4204 NTSYSAPI
4205 NTSTATUS
4206 NTAPI
4207 RtlOpenCurrentUser(
4208 _In_ ACCESS_MASK DesiredAccess,
4209 _Out_ PHANDLE KeyHandle
4210 );
4211
4212 _IRQL_requires_max_(PASSIVE_LEVEL)
4213 NTSYSAPI
4214 NTSTATUS
4215 NTAPI
4216 RtlQueryRegistryValues(
4217 _In_ ULONG RelativeTo,
4218 _In_ PCWSTR Path,
4219 _Inout_ _At_(*(*QueryTable).EntryContext, _Pre_unknown_)
4220 PRTL_QUERY_REGISTRY_TABLE QueryTable,
4221 _In_opt_ PVOID Context,
4222 _In_opt_ PVOID Environment
4223 );
4224
4225 _IRQL_requires_max_(PASSIVE_LEVEL)
4226 NTSYSAPI
4227 NTSTATUS
4228 NTAPI
4229 RtlWriteRegistryValue(
4230 _In_ ULONG RelativeTo,
4231 _In_ PCWSTR Path,
4232 _In_z_ PCWSTR ValueName,
4233 _In_ ULONG ValueType,
4234 _In_reads_bytes_opt_(ValueLength) PVOID ValueData,
4235 _In_ ULONG ValueLength
4236 );
4237
4238 #ifdef NTOS_MODE_USER
4239 NTSYSAPI
4240 NTSTATUS
4241 NTAPI
4242 RtlpNtCreateKey(
4243 _Out_ HANDLE KeyHandle,
4244 _In_ ACCESS_MASK DesiredAccess,
4245 _In_ POBJECT_ATTRIBUTES ObjectAttributes,
4246 _In_ ULONG TitleIndex,
4247 _In_ PUNICODE_STRING Class,
4248 _Out_ PULONG Disposition
4249 );
4250
4251 NTSYSAPI
4252 NTSTATUS
4253 NTAPI
4254 RtlpNtEnumerateSubKey(
4255 _In_ HANDLE KeyHandle,
4256 _Inout_ PUNICODE_STRING SubKeyName,
4257 _In_ ULONG Index,
4258 _In_ ULONG Unused
4259 );
4260
4261 NTSYSAPI
4262 NTSTATUS
4263 NTAPI
4264 RtlpNtMakeTemporaryKey(
4265 _In_ HANDLE KeyHandle
4266 );
4267
4268 NTSYSAPI
4269 NTSTATUS
4270 NTAPI
4271 RtlpNtOpenKey(
4272 _Out_ HANDLE KeyHandle,
4273 _In_ ACCESS_MASK DesiredAccess,
4274 _In_ POBJECT_ATTRIBUTES ObjectAttributes,
4275 _In_ ULONG Unused
4276 );
4277
4278 NTSYSAPI
4279 NTSTATUS
4280 NTAPI
4281 RtlpNtQueryValueKey(
4282 _In_ HANDLE KeyHandle,
4283 _Out_opt_ PULONG Type,
4284 _Out_opt_ PVOID Data,
4285 _Inout_opt_ PULONG DataLength,
4286 _In_ ULONG Unused
4287 );
4288
4289 NTSYSAPI
4290 NTSTATUS
4291 NTAPI
4292 RtlpNtSetValueKey(
4293 _In_ HANDLE KeyHandle,
4294 _In_ ULONG Type,
4295 _In_ PVOID Data,
4296 _In_ ULONG DataLength
4297 );
4298 #endif
4299
4300 //
4301 // NLS Functions
4302 //
4303 NTSYSAPI
4304 VOID
4305 NTAPI
4306 RtlGetDefaultCodePage(
4307 _Out_ PUSHORT AnsiCodePage,
4308 _Out_ PUSHORT OemCodePage
4309 );
4310
4311 NTSYSAPI
4312 VOID
4313 NTAPI
4314 RtlInitNlsTables(
4315 _In_ PUSHORT AnsiTableBase,
4316 _In_ PUSHORT OemTableBase,
4317 _In_ PUSHORT CaseTableBase,
4318 _Out_ PNLSTABLEINFO NlsTable
4319 );
4320
4321 _IRQL_requires_max_(PASSIVE_LEVEL)
4322 NTSYSAPI
4323 VOID
4324 NTAPI
4325 RtlInitCodePageTable(
4326 _In_ PUSHORT TableBase,
4327 _Out_ PCPTABLEINFO CodePageTable
4328 );
4329
4330 NTSYSAPI
4331 VOID
4332 NTAPI
4333 RtlResetRtlTranslations(
4334 _In_ PNLSTABLEINFO NlsTable);
4335
4336 #if defined(NTOS_MODE_USER) && !defined(NO_RTL_INLINES)
4337
4338 //
4339 // Misc conversion functions
4340 //
4341 static __inline
4342 LARGE_INTEGER
4343 NTAPI_INLINE
RtlConvertLongToLargeInteger(_In_ LONG SignedInteger)4344 RtlConvertLongToLargeInteger(
4345 _In_ LONG SignedInteger
4346 )
4347 {
4348 LARGE_INTEGER Result;
4349
4350 Result.QuadPart = SignedInteger;
4351 return Result;
4352 }
4353
4354 static __inline
4355 LARGE_INTEGER
4356 NTAPI_INLINE
RtlEnlargedIntegerMultiply(_In_ LONG Multiplicand,_In_ LONG Multiplier)4357 RtlEnlargedIntegerMultiply(
4358 _In_ LONG Multiplicand,
4359 _In_ LONG Multiplier
4360 )
4361 {
4362 LARGE_INTEGER Product;
4363
4364 Product.QuadPart = (LONGLONG)Multiplicand * (ULONGLONG)Multiplier;
4365 return Product;
4366 }
4367
4368 static __inline
4369 ULONG
4370 NTAPI_INLINE
RtlEnlargedUnsignedDivide(_In_ ULARGE_INTEGER Dividend,_In_ ULONG Divisor,_In_opt_ PULONG Remainder)4371 RtlEnlargedUnsignedDivide(
4372 _In_ ULARGE_INTEGER Dividend,
4373 _In_ ULONG Divisor,
4374 _In_opt_ PULONG Remainder
4375 )
4376 {
4377 ULONG Quotient;
4378
4379 Quotient = (ULONG)(Dividend.QuadPart / Divisor);
4380 if (Remainder) {
4381 *Remainder = (ULONG)(Dividend.QuadPart % Divisor);
4382 }
4383
4384 return Quotient;
4385 }
4386
4387 static __inline
4388 LARGE_INTEGER
4389 NTAPI_INLINE
RtlEnlargedUnsignedMultiply(_In_ ULONG Multiplicand,_In_ ULONG Multiplier)4390 RtlEnlargedUnsignedMultiply(
4391 _In_ ULONG Multiplicand,
4392 _In_ ULONG Multiplier
4393 )
4394 {
4395 LARGE_INTEGER Product;
4396
4397 Product.QuadPart = (ULONGLONG)Multiplicand * (ULONGLONG)Multiplier;
4398 return Product;
4399 }
4400
4401 #if defined(_AMD64_) || defined(_IA64_)
4402 static __inline
4403 LARGE_INTEGER
4404 NTAPI_INLINE
RtlExtendedLargeIntegerDivide(_In_ LARGE_INTEGER Dividend,_In_ ULONG Divisor,_Out_opt_ PULONG Remainder)4405 RtlExtendedLargeIntegerDivide(
4406 _In_ LARGE_INTEGER Dividend,
4407 _In_ ULONG Divisor,
4408 _Out_opt_ PULONG Remainder)
4409 {
4410 LARGE_INTEGER ret;
4411 ret.QuadPart = (ULONG64)Dividend.QuadPart / Divisor;
4412 if (Remainder)
4413 *Remainder = (ULONG)(Dividend.QuadPart % Divisor);
4414 return ret;
4415 }
4416
4417 #else
4418 NTSYSAPI
4419 LARGE_INTEGER
4420 NTAPI
4421 RtlExtendedLargeIntegerDivide(
4422 _In_ LARGE_INTEGER Dividend,
4423 _In_ ULONG Divisor,
4424 _Out_opt_ PULONG Remainder
4425 );
4426
4427 #endif /* defined(_AMD64_) || defined(_IA64_) */
4428
4429 #endif
4430
4431
4432 NTSYSAPI
4433 ULONG
4434 NTAPI
4435 RtlUniform(
4436 _In_ PULONG Seed
4437 );
4438
4439 NTSYSAPI
4440 ULONG
4441 NTAPI
4442 RtlRandom(
4443 _Inout_ PULONG Seed
4444 );
4445
4446 NTSYSAPI
4447 ULONG
4448 NTAPI
4449 RtlComputeCrc32(
4450 _In_ ULONG InitialCrc,
4451 _In_ const UCHAR *Buffer,
4452 _In_ ULONG Length
4453 );
4454
4455 //
4456 // Network Functions
4457 //
4458 NTSYSAPI
4459 PSTR
4460 NTAPI
4461 RtlIpv4AddressToStringA(
4462 _In_ const struct in_addr *Addr,
4463 _Out_writes_(16) PCHAR S
4464 );
4465
4466 NTSYSAPI
4467 PWSTR
4468 NTAPI
4469 RtlIpv4AddressToStringW(
4470 _In_ const struct in_addr *Addr,
4471 _Out_writes_(16) PWCHAR S
4472 );
4473
4474 NTSYSAPI
4475 NTSTATUS
4476 NTAPI
4477 RtlIpv4AddressToStringExA(
4478 _In_ const struct in_addr *Address,
4479 _In_ USHORT Port,
4480 _Out_writes_to_(*AddressStringLength, *AddressStringLength) PCHAR AddressString,
4481 _Inout_ PULONG AddressStringLength
4482 );
4483
4484 NTSTATUS
4485 NTAPI
4486 RtlIpv4AddressToStringExW(
4487 _In_ const struct in_addr *Address,
4488 _In_ USHORT Port,
4489 _Out_writes_to_(*AddressStringLength, *AddressStringLength) PWCHAR AddressString,
4490 _Inout_ PULONG AddressStringLength
4491 );
4492
4493 NTSYSAPI
4494 NTSTATUS
4495 NTAPI
4496 RtlIpv4StringToAddressA(
4497 _In_ PCSTR String,
4498 _In_ BOOLEAN Strict,
4499 _Out_ PCSTR *Terminator,
4500 _Out_ struct in_addr *Addr
4501 );
4502
4503 NTSYSAPI
4504 NTSTATUS
4505 NTAPI
4506 RtlIpv4StringToAddressW(
4507 _In_ PCWSTR String,
4508 _In_ BOOLEAN Strict,
4509 _Out_ PCWSTR *Terminator,
4510 _Out_ struct in_addr *Addr
4511 );
4512
4513 NTSYSAPI
4514 NTSTATUS
4515 NTAPI
4516 RtlIpv4StringToAddressExA(
4517 _In_ PCSTR AddressString,
4518 _In_ BOOLEAN Strict,
4519 _Out_ struct in_addr *Address,
4520 _Out_ PUSHORT Port
4521 );
4522
4523 NTSYSAPI
4524 NTSTATUS
4525 NTAPI
4526 RtlIpv4StringToAddressExW(
4527 _In_ PCWSTR AddressString,
4528 _In_ BOOLEAN Strict,
4529 _Out_ struct in_addr *Address,
4530 _Out_ PUSHORT Port
4531 );
4532
4533 NTSYSAPI
4534 PSTR
4535 NTAPI
4536 RtlIpv6AddressToStringA(
4537 _In_ const struct in6_addr *Addr,
4538 _Out_writes_(46) PSTR S
4539 );
4540
4541 NTSYSAPI
4542 PWSTR
4543 NTAPI
4544 RtlIpv6AddressToStringW(
4545 _In_ const struct in6_addr *Addr,
4546 _Out_writes_(46) PWSTR S
4547 );
4548
4549 NTSYSAPI
4550 NTSTATUS
4551 NTAPI
4552 RtlIpv6AddressToStringExA(
4553 _In_ const struct in6_addr *Address,
4554 _In_ ULONG ScopeId,
4555 _In_ USHORT Port,
4556 _Out_writes_to_(*AddressStringLength, *AddressStringLength) PSTR AddressString,
4557 _Inout_ PULONG AddressStringLength
4558 );
4559
4560 NTSYSAPI
4561 NTSTATUS
4562 NTAPI
4563 RtlIpv6AddressToStringExW(
4564 _In_ const struct in6_addr *Address,
4565 _In_ ULONG ScopeId,
4566 _In_ USHORT Port,
4567 _Out_writes_to_(*AddressStringLength, *AddressStringLength) PWCHAR AddressString,
4568 _Inout_ PULONG AddressStringLength
4569 );
4570
4571 NTSYSAPI
4572 NTSTATUS
4573 NTAPI
4574 RtlIpv6StringToAddressA(
4575 _In_ PCSTR String,
4576 _Out_ PCSTR *Terminator,
4577 _Out_ struct in6_addr *Addr
4578 );
4579
4580 NTSYSAPI
4581 NTSTATUS
4582 NTAPI
4583 RtlIpv6StringToAddressW(
4584 _In_ PCWSTR String,
4585 _Out_ PCWSTR *Terminator,
4586 _Out_ struct in6_addr *Addr
4587 );
4588
4589 NTSYSAPI
4590 NTSTATUS
4591 NTAPI
4592 RtlIpv6StringToAddressExA(
4593 _In_ PCSTR AddressString,
4594 _Out_ struct in6_addr *Address,
4595 _Out_ PULONG ScopeId,
4596 _Out_ PUSHORT Port
4597 );
4598
4599 NTSYSAPI
4600 NTSTATUS
4601 NTAPI
4602 RtlIpv6StringToAddressExW(
4603 _In_ PCWSTR AddressString,
4604 _Out_ struct in6_addr *Address,
4605 _Out_ PULONG ScopeId,
4606 _Out_ PUSHORT Port
4607 );
4608
4609
4610 //
4611 // Time Functions
4612 //
4613 NTSYSAPI
4614 BOOLEAN
4615 NTAPI
4616 RtlCutoverTimeToSystemTime(
4617 _In_ PTIME_FIELDS CutoverTimeFields,
4618 _Out_ PLARGE_INTEGER SystemTime,
4619 _In_ PLARGE_INTEGER CurrentTime,
4620 _In_ BOOLEAN ThisYearsCutoverOnly);
4621
4622 NTSYSAPI
4623 NTSTATUS
4624 NTAPI
4625 RtlQueryTimeZoneInformation(
4626 _Out_ PRTL_TIME_ZONE_INFORMATION TimeZoneInformation);
4627
4628 NTSYSAPI
4629 VOID
4630 NTAPI
4631 RtlSecondsSince1970ToTime(
4632 _In_ ULONG SecondsSince1970,
4633 _Out_ PLARGE_INTEGER Time
4634 );
4635
4636 NTSYSAPI
4637 NTSTATUS
4638 NTAPI
4639 RtlSetTimeZoneInformation(
4640 _In_ PRTL_TIME_ZONE_INFORMATION TimeZoneInformation);
4641
4642 _Success_(return != FALSE)
4643 NTSYSAPI
4644 BOOLEAN
4645 NTAPI
4646 RtlTimeFieldsToTime(
4647 _In_ PTIME_FIELDS TimeFields,
4648 _Out_ PLARGE_INTEGER Time
4649 );
4650
4651 _Success_(return != FALSE)
4652 NTSYSAPI
4653 BOOLEAN
4654 NTAPI
4655 RtlTimeToSecondsSince1970(
4656 _In_ PLARGE_INTEGER Time,
4657 _Out_ PULONG ElapsedSeconds
4658 );
4659
4660 NTSYSAPI
4661 VOID
4662 NTAPI
4663 RtlTimeToTimeFields(
4664 PLARGE_INTEGER Time,
4665 PTIME_FIELDS TimeFields
4666 );
4667
4668 NTSYSAPI
4669 NTSTATUS
4670 NTAPI
4671 RtlSystemTimeToLocalTime(
4672 _In_ PLARGE_INTEGER SystemTime,
4673 _Out_ PLARGE_INTEGER LocalTime
4674 );
4675
4676 //
4677 // Version Functions
4678 //
4679 _IRQL_requires_max_(PASSIVE_LEVEL)
4680 _Must_inspect_result_
4681 NTSYSAPI
4682 NTSTATUS
4683 NTAPI
4684 RtlVerifyVersionInfo(
4685 _In_ PRTL_OSVERSIONINFOEXW VersionInfo,
4686 _In_ ULONG TypeMask,
4687 _In_ ULONGLONG ConditionMask
4688 );
4689
4690 _IRQL_requires_max_(PASSIVE_LEVEL)
4691 NTSYSAPI
4692 NTSTATUS
4693 NTAPI
4694 RtlGetVersion(
4695 _Out_
4696 _At_(lpVersionInformation->dwOSVersionInfoSize, _Pre_ _Valid_)
4697 _When_(lpVersionInformation->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOEXW),
4698 _At_((PRTL_OSVERSIONINFOEXW)lpVersionInformation, _Out_))
4699 PRTL_OSVERSIONINFOW lpVersionInformation
4700 );
4701
4702 _IRQL_requires_max_(PASSIVE_LEVEL)
4703 NTSYSAPI
4704 BOOLEAN
4705 NTAPI
4706 RtlGetNtProductType(_Out_ PNT_PRODUCT_TYPE ProductType);
4707
4708 #if (_WIN32_WINNT >= _WIN32_WINNT_VISTA)
4709 //
4710 // Synchronization functions
4711 //
4712 NTSYSAPI
4713 VOID
4714 NTAPI
4715 RtlInitializeConditionVariable(
4716 _Out_ PRTL_CONDITION_VARIABLE ConditionVariable);
4717
4718 NTSYSAPI
4719 VOID
4720 NTAPI
4721 RtlWakeConditionVariable(
4722 _Inout_ PRTL_CONDITION_VARIABLE ConditionVariable);
4723
4724 NTSYSAPI
4725 VOID
4726 NTAPI
4727 RtlWakeAllConditionVariable(
4728 _Inout_ PRTL_CONDITION_VARIABLE ConditionVariable);
4729
4730 NTSYSAPI
4731 NTSTATUS
4732 NTAPI
4733 RtlSleepConditionVariableCS(
4734 _Inout_ PRTL_CONDITION_VARIABLE ConditionVariable,
4735 _Inout_ PRTL_CRITICAL_SECTION CriticalSection,
4736 _In_opt_ PLARGE_INTEGER TimeOut);
4737
4738 NTSYSAPI
4739 NTSTATUS
4740 NTAPI
4741 RtlSleepConditionVariableSRW(
4742 _Inout_ PRTL_CONDITION_VARIABLE ConditionVariable,
4743 _Inout_ PRTL_SRWLOCK SRWLock,
4744 _In_opt_ PLARGE_INTEGER TimeOut,
4745 _In_ ULONG Flags);
4746 #endif
4747
4748 //
4749 // Secure Memory Functions
4750 //
4751 #ifdef NTOS_MODE_USER
4752 NTSYSAPI
4753 NTSTATUS
4754 NTAPI
4755 RtlRegisterSecureMemoryCacheCallback(
4756 _In_ PRTL_SECURE_MEMORY_CACHE_CALLBACK Callback);
4757
4758 NTSYSAPI
4759 BOOLEAN
4760 NTAPI
4761 RtlFlushSecureMemoryCache(
4762 _In_ PVOID MemoryCache,
4763 _In_opt_ SIZE_T MemoryLength
4764 );
4765 #endif
4766
4767 //
4768 // Boot Status Data Functions
4769 //
4770 #ifdef NTOS_MODE_USER
4771 NTSYSAPI
4772 NTSTATUS
4773 NTAPI
4774 RtlCreateBootStatusDataFile(
4775 VOID
4776 );
4777
4778 NTSYSAPI
4779 NTSTATUS
4780 NTAPI
4781 RtlGetSetBootStatusData(
4782 _In_ HANDLE FileHandle,
4783 _In_ BOOLEAN WriteMode,
4784 _In_ RTL_BSD_ITEM_TYPE DataClass,
4785 _In_ PVOID Buffer,
4786 _In_ ULONG BufferSize,
4787 _Out_opt_ PULONG ReturnLength
4788 );
4789
4790 NTSYSAPI
4791 NTSTATUS
4792 NTAPI
4793 RtlLockBootStatusData(
4794 _Out_ PHANDLE FileHandle
4795 );
4796
4797 NTSYSAPI
4798 NTSTATUS
4799 NTAPI
4800 RtlUnlockBootStatusData(
4801 _In_ HANDLE FileHandle
4802 );
4803 #endif
4804
4805 #ifdef NTOS_MODE_USER
4806 _Must_inspect_result_
4807 NTSYSAPI
4808 NTSTATUS
4809 NTAPI
4810 RtlGUIDFromString(
4811 _In_ PUNICODE_STRING GuidString,
4812 _Out_ GUID *Guid);
4813
4814 _Must_inspect_result_
4815 NTSYSAPI
4816 NTSTATUS
4817 NTAPI
4818 RtlStringFromGUID(
4819 _In_ REFGUID Guid,
4820 _Out_ _At_(GuidString->Buffer, __drv_allocatesMem(Mem))
4821 PUNICODE_STRING GuidString);
4822
4823 NTSYSAPI
4824 NTSTATUS
4825 NTAPI
4826 RtlComputeImportTableHash(
4827 _In_ HANDLE hFile,
4828 _Out_ PCHAR Hash,
4829 _In_ ULONG ImportTableHashRevision
4830 );
4831 #endif
4832
4833 //
4834 // MemoryStream functions
4835 //
4836 #ifdef NTOS_MODE_USER
4837
4838 NTSYSAPI
4839 VOID
4840 NTAPI
4841 RtlInitMemoryStream(
4842 _Out_ PRTL_MEMORY_STREAM Stream
4843 );
4844
4845 NTSYSAPI
4846 VOID
4847 NTAPI
4848 RtlInitOutOfProcessMemoryStream(
4849 _Out_ PRTL_MEMORY_STREAM Stream
4850 );
4851
4852 NTSYSAPI
4853 VOID
4854 NTAPI
4855 RtlFinalReleaseOutOfProcessMemoryStream(
4856 _In_ PRTL_MEMORY_STREAM Stream
4857 );
4858
4859 NTSYSAPI
4860 HRESULT
4861 NTAPI
4862 RtlQueryInterfaceMemoryStream(
4863 _In_ struct IStream *This,
4864 _In_ REFIID RequestedIid,
4865 _Outptr_ PVOID *ResultObject
4866 );
4867
4868 NTSYSAPI
4869 ULONG
4870 NTAPI
4871 RtlAddRefMemoryStream(
4872 _In_ struct IStream *This
4873 );
4874
4875 NTSYSAPI
4876 ULONG
4877 NTAPI
4878 RtlReleaseMemoryStream(
4879 _In_ struct IStream *This
4880 );
4881
4882 NTSYSAPI
4883 HRESULT
4884 NTAPI
4885 RtlReadMemoryStream(
4886 _In_ struct IStream *This,
4887 _Out_writes_bytes_(Length) PVOID Buffer,
4888 _In_ ULONG Length,
4889 _Out_opt_ PULONG BytesRead
4890 );
4891
4892 NTSYSAPI
4893 HRESULT
4894 NTAPI
4895 RtlReadOutOfProcessMemoryStream(
4896 _In_ struct IStream *This,
4897 _Out_writes_bytes_(Length) PVOID Buffer,
4898 _In_ ULONG Length,
4899 _Out_opt_ PULONG BytesRead
4900 );
4901
4902 NTSYSAPI
4903 HRESULT
4904 NTAPI
4905 RtlSeekMemoryStream(
4906 _In_ struct IStream *This,
4907 _In_ LARGE_INTEGER RelativeOffset,
4908 _In_ ULONG Origin,
4909 _Out_opt_ PULARGE_INTEGER ResultOffset
4910 );
4911
4912 NTSYSAPI
4913 HRESULT
4914 NTAPI
4915 RtlCopyMemoryStreamTo(
4916 _In_ struct IStream *This,
4917 _In_ struct IStream *Target,
4918 _In_ ULARGE_INTEGER Length,
4919 _Out_opt_ PULARGE_INTEGER BytesRead,
4920 _Out_opt_ PULARGE_INTEGER BytesWritten
4921 );
4922
4923 NTSYSAPI
4924 HRESULT
4925 NTAPI
4926 RtlCopyOutOfProcessMemoryStreamTo(
4927 _In_ struct IStream *This,
4928 _In_ struct IStream *Target,
4929 _In_ ULARGE_INTEGER Length,
4930 _Out_opt_ PULARGE_INTEGER BytesRead,
4931 _Out_opt_ PULARGE_INTEGER BytesWritten
4932 );
4933
4934 NTSYSAPI
4935 HRESULT
4936 NTAPI
4937 RtlStatMemoryStream(
4938 _In_ struct IStream *This,
4939 _Out_ struct tagSTATSTG *Stats,
4940 _In_ ULONG Flags
4941 );
4942
4943 // Dummy functions
4944 NTSYSAPI
4945 HRESULT
4946 NTAPI
4947 RtlWriteMemoryStream(
4948 _In_ struct IStream *This,
4949 _In_reads_bytes_(Length) CONST VOID *Buffer,
4950 _In_ ULONG Length,
4951 _Out_opt_ PULONG BytesWritten
4952 );
4953
4954 NTSYSAPI
4955 HRESULT
4956 NTAPI
4957 RtlSetMemoryStreamSize(
4958 _In_ struct IStream *This,
4959 _In_ ULARGE_INTEGER NewSize
4960 );
4961
4962 NTSYSAPI
4963 HRESULT
4964 NTAPI
4965 RtlCommitMemoryStream(
4966 _In_ struct IStream *This,
4967 _In_ ULONG CommitFlags
4968 );
4969
4970 NTSYSAPI
4971 HRESULT
4972 NTAPI
4973 RtlRevertMemoryStream(
4974 _In_ struct IStream *This
4975 );
4976
4977 NTSYSAPI
4978 HRESULT
4979 NTAPI
4980 RtlLockMemoryStreamRegion(
4981 _In_ struct IStream *This,
4982 _In_ ULARGE_INTEGER Offset,
4983 _In_ ULARGE_INTEGER Length,
4984 _In_ ULONG LockType
4985 );
4986
4987 NTSYSAPI
4988 HRESULT
4989 NTAPI
4990 RtlUnlockMemoryStreamRegion(
4991 _In_ struct IStream *This,
4992 _In_ ULARGE_INTEGER Offset,
4993 _In_ ULARGE_INTEGER Length,
4994 _In_ ULONG LockType
4995 );
4996
4997 NTSYSAPI
4998 HRESULT
4999 NTAPI
5000 RtlCloneMemoryStream(
5001 _In_ struct IStream *This,
5002 _Outptr_ struct IStream **ResultStream
5003 );
5004
5005 NTSYSAPI
5006 NTSTATUS
5007 NTAPI
5008 RtlGetNativeSystemInformation(
5009 _In_ SYSTEM_INFORMATION_CLASS SystemInformationClass,
5010 _Out_writes_bytes_to_opt_(SystemInformationLength, *ReturnLength) PVOID SystemInformation,
5011 _In_ ULONG SystemInformationLength,
5012 _Out_opt_ PULONG ReturnLength
5013 );
5014
5015 #if (_WIN32_WINNT >= _WIN32_WINNT_VISTA) || (DLL_EXPORT_VERSION >= _WIN32_WINNT_VISTA)
5016
5017 NTSYSAPI
5018 VOID
5019 NTAPI
5020 RtlRunOnceInitialize(
5021 _Out_ PRTL_RUN_ONCE RunOnce);
5022
5023 _Maybe_raises_SEH_exception_
5024 NTSYSAPI
5025 NTSTATUS
5026 NTAPI
5027 RtlRunOnceExecuteOnce(
5028 _Inout_ PRTL_RUN_ONCE RunOnce,
5029 _In_ __inner_callback PRTL_RUN_ONCE_INIT_FN InitFn,
5030 _Inout_opt_ PVOID Parameter,
5031 _Outptr_opt_result_maybenull_ PVOID *Context);
5032
5033 _Must_inspect_result_
5034 NTSYSAPI
5035 NTSTATUS
5036 NTAPI
5037 RtlRunOnceBeginInitialize(
5038 _Inout_ PRTL_RUN_ONCE RunOnce,
5039 _In_ ULONG Flags,
5040 _Outptr_opt_result_maybenull_ PVOID *Context);
5041
5042 NTSYSAPI
5043 NTSTATUS
5044 NTAPI
5045 RtlRunOnceComplete(
5046 _Inout_ PRTL_RUN_ONCE RunOnce,
5047 _In_ ULONG Flags,
5048 _In_opt_ PVOID Context);
5049
5050 #endif
5051
5052 #if (_WIN32_WINNT >= _WIN32_WINNT_VISTA) || (defined(__REACTOS__) && defined(_NTDLLBUILD_))
5053 /* Put NTSYSAPI back when this will be really exported. Only statically linked for now */
5054 // NTSYSAPI
5055 VOID
5056 NTAPI
5057 RtlInitializeSRWLock(OUT PRTL_SRWLOCK SRWLock);
5058
5059 // NTSYSAPI
5060 VOID
5061 NTAPI
5062 RtlAcquireSRWLockShared(IN OUT PRTL_SRWLOCK SRWLock);
5063
5064 // NTSYSAPI
5065 VOID
5066 NTAPI
5067 RtlAcquireSRWLockExclusive(IN OUT PRTL_SRWLOCK SRWLock);
5068
5069 // NTSYSAPI
5070 VOID
5071 NTAPI
5072 RtlReleaseSRWLockShared(IN OUT PRTL_SRWLOCK SRWLock);
5073
5074 // NTSYSAPI
5075 VOID
5076 NTAPI
5077 RtlReleaseSRWLockExclusive(IN OUT PRTL_SRWLOCK SRWLock);
5078
5079 #endif /* Win vista or Reactos Ntdll build */
5080
5081 #if (_WIN32_WINNT >= _WIN32_WINNT_WIN7) || (defined(__REACTOS__) && defined(_NTDLLBUILD_))
5082
5083 // NTSYSAPI
5084 BOOLEAN
5085 NTAPI
5086 RtlTryAcquireSRWLockShared(PRTL_SRWLOCK SRWLock);
5087
5088 // NTSYSAPI
5089 BOOLEAN
5090 NTAPI
5091 RtlTryAcquireSRWLockExclusive(PRTL_SRWLOCK SRWLock);
5092
5093 #endif /* Win7 or Reactos Ntdll build */
5094
5095 #endif // NTOS_MODE_USER
5096
5097 NTSYSAPI
5098 NTSTATUS
5099 NTAPI
5100 RtlFindActivationContextSectionGuid(
5101 ULONG flags,
5102 const GUID *extguid,
5103 ULONG section_kind,
5104 const GUID *guid,
5105 void *ptr
5106 );
5107
5108 #ifdef __cplusplus
5109 }
5110 #endif
5111
5112 #endif
5113