3 Copyright (c) Alex Ionescu. All rights reserved.
11 Type definitions for the Run-Time Library
15 Alex Ionescu (alexi@tinykrnl.org) - Updated - 27-Feb-2006
30 // Maximum Atom Length
32 #define RTL_MAXIMUM_ATOM_LENGTH 255
35 // Process Parameters Flags
37 #define RTL_USER_PROCESS_PARAMETERS_NORMALIZED 0x01
38 #define RTL_USER_PROCESS_PARAMETERS_PROFILE_USER 0x02
39 #define RTL_USER_PROCESS_PARAMETERS_PROFILE_KERNEL 0x04
40 #define RTL_USER_PROCESS_PARAMETERS_PROFILE_SERVER 0x08
41 #define RTL_USER_PROCESS_PARAMETERS_UNKNOWN 0x10
42 #define RTL_USER_PROCESS_PARAMETERS_RESERVE_1MB 0x20
43 #define RTL_USER_PROCESS_PARAMETERS_RESERVE_16MB 0x40
44 #define RTL_USER_PROCESS_PARAMETERS_CASE_SENSITIVE 0x80
45 #define RTL_USER_PROCESS_PARAMETERS_DISABLE_HEAP_CHECKS 0x100
46 #define RTL_USER_PROCESS_PARAMETERS_PROCESS_OR_1 0x200
47 #define RTL_USER_PROCESS_PARAMETERS_PROCESS_OR_2 0x400
48 #define RTL_USER_PROCESS_PARAMETERS_PRIVATE_DLL_PATH 0x1000
49 #define RTL_USER_PROCESS_PARAMETERS_LOCAL_DLL_PATH 0x2000
50 #define RTL_USER_PROCESS_PARAMETERS_IMAGE_KEY_MISSING 0x4000
51 #define RTL_USER_PROCESS_PARAMETERS_NX 0x20000
53 #define RTL_MAX_DRIVE_LETTERS 32
54 #define RTL_DRIVE_LETTER_VALID (USHORT)0x0001
57 // End of Exception List
59 #define EXCEPTION_CHAIN_END ((PEXCEPTION_REGISTRATION_RECORD)-1)
62 // Range and Range List Flags
64 #define RTL_RANGE_LIST_ADD_IF_CONFLICT 0x00000001
65 #define RTL_RANGE_LIST_ADD_SHARED 0x00000002
67 #define RTL_RANGE_SHARED 0x01
68 #define RTL_RANGE_CONFLICT 0x02
71 // Activation Context Frame Flags
73 #define RTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_FORMAT_WHISTLER \
77 // RtlActivateActivationContextEx Flags
79 #define RTL_ACTIVATE_ACTIVATION_CONTEXT_EX_FLAG_RELEASE_ON_STACK_DEALLOCATION \
85 #if !defined(NTOS_MODE_USER) && !defined(_NTIFS_)
86 #define HEAP_NO_SERIALIZE 0x00000001
87 #define HEAP_GROWABLE 0x00000002
88 #define HEAP_GENERATE_EXCEPTIONS 0x00000004
89 #define HEAP_ZERO_MEMORY 0x00000008
90 #define HEAP_REALLOC_IN_PLACE_ONLY 0x00000010
91 #define HEAP_TAIL_CHECKING_ENABLED 0x00000020
92 #define HEAP_FREE_CHECKING_ENABLED 0x00000040
93 #define HEAP_DISABLE_COALESCE_ON_FREE 0x00000080
94 #define HEAP_CREATE_ALIGN_16 0x00010000
95 #define HEAP_CREATE_ENABLE_TRACING 0x00020000
96 #define HEAP_CREATE_ENABLE_EXECUTE 0x00040000
100 // User-Defined Heap Flags and Classes
102 #define HEAP_SETTABLE_USER_VALUE 0x00000100
103 #define HEAP_SETTABLE_USER_FLAG1 0x00000200
104 #define HEAP_SETTABLE_USER_FLAG2 0x00000400
105 #define HEAP_SETTABLE_USER_FLAG3 0x00000800
106 #define HEAP_SETTABLE_USER_FLAGS 0x00000E00
107 #define HEAP_CLASS_0 0x00000000
108 #define HEAP_CLASS_1 0x00001000
109 #define HEAP_CLASS_2 0x00002000
110 #define HEAP_CLASS_3 0x00003000
111 #define HEAP_CLASS_4 0x00004000
112 #define HEAP_CLASS_5 0x00005000
113 #define HEAP_CLASS_6 0x00006000
114 #define HEAP_CLASS_7 0x00007000
115 #define HEAP_CLASS_8 0x00008000
116 #define HEAP_CLASS_MASK 0x0000F000
119 // Internal HEAP Structure Flags
121 #define HEAP_FLAG_PAGE_ALLOCS 0x01000000
122 #define HEAP_PROTECTION_ENABLED 0x02000000
123 #define HEAP_BREAK_WHEN_OUT_OF_VM 0x04000000
124 #define HEAP_NO_ALIGNMENT 0x08000000
125 #define HEAP_CAPTURE_STACK_BACKTRACES 0x08000000
126 #define HEAP_SKIP_VALIDATION_CHECKS 0x10000000
127 #define HEAP_VALIDATE_ALL_ENABLED 0x20000000
128 #define HEAP_VALIDATE_PARAMETERS_ENABLED 0x40000000
129 #define HEAP_LOCK_USER_ALLOCATED 0x80000000
132 // Heap Validation Flags
134 #define HEAP_CREATE_VALID_MASK \
135 (HEAP_NO_SERIALIZE | \
137 HEAP_GENERATE_EXCEPTIONS | \
139 HEAP_REALLOC_IN_PLACE_ONLY | \
140 HEAP_TAIL_CHECKING_ENABLED | \
141 HEAP_FREE_CHECKING_ENABLED | \
142 HEAP_DISABLE_COALESCE_ON_FREE | \
144 HEAP_CREATE_ALIGN_16 | \
145 HEAP_CREATE_ENABLE_TRACING | \
146 HEAP_CREATE_ENABLE_EXECUTE)
148 C_ASSERT(HEAP_CREATE_VALID_MASK
== 0x0007F0FF);
152 // Native image architecture
155 #define IMAGE_FILE_MACHINE_NATIVE IMAGE_FILE_MACHINE_I386
156 #elif defined(_M_ARM)
157 #define IMAGE_FILE_MACHINE_NATIVE IMAGE_FILE_MACHINE_ARM
158 #elif defined(_M_AMD64)
159 #define IMAGE_FILE_MACHINE_NATIVE IMAGE_FILE_MACHINE_AMD64
161 #error Define these please!
167 #define RTL_REGISTRY_ABSOLUTE 0
168 #define RTL_REGISTRY_SERVICES 1
169 #define RTL_REGISTRY_CONTROL 2
170 #define RTL_REGISTRY_WINDOWS_NT 3
171 #define RTL_REGISTRY_DEVICEMAP 4
172 #define RTL_REGISTRY_USER 5
173 #define RTL_REGISTRY_MAXIMUM 6
174 #define RTL_REGISTRY_HANDLE 0x40000000
175 #define RTL_REGISTRY_OPTIONAL 0x80000000
176 #define RTL_QUERY_REGISTRY_SUBKEY 0x00000001
177 #define RTL_QUERY_REGISTRY_TOPKEY 0x00000002
178 #define RTL_QUERY_REGISTRY_REQUIRED 0x00000004
179 #define RTL_QUERY_REGISTRY_NOVALUE 0x00000008
180 #define RTL_QUERY_REGISTRY_NOEXPAND 0x00000010
181 #define RTL_QUERY_REGISTRY_DIRECT 0x00000020
182 #define RTL_QUERY_REGISTRY_DELETE 0x00000040
187 #define VER_MINORVERSION 0x0000001
188 #define VER_MAJORVERSION 0x0000002
189 #define VER_BUILDNUMBER 0x0000004
190 #define VER_PLATFORMID 0x0000008
191 #define VER_SERVICEPACKMINOR 0x0000010
192 #define VER_SERVICEPACKMAJOR 0x0000020
193 #define VER_SUITENAME 0x0000040
194 #define VER_PRODUCT_TYPE 0x0000080
195 #define VER_PLATFORM_WIN32s 0
196 #define VER_PLATFORM_WIN32_WINDOWS 1
197 #define VER_PLATFORM_WIN32_NT 2
199 #define VER_GREATER 2
200 #define VER_GREATER_EQUAL 3
202 #define VER_LESS_EQUAL 5
205 #define VER_CONDITION_MASK 7
206 #define VER_NUM_BITS_PER_CONDITION_MASK 3
211 #define TIME_ZONE_ID_UNKNOWN 0
212 #define TIME_ZONE_ID_STANDARD 1
213 #define TIME_ZONE_ID_DAYLIGHT 2
216 // Maximum Path Length
221 // RTL Lock Type (Critical Section or Resource)
223 #define RTL_CRITSECT_TYPE 0
224 #define RTL_RESOURCE_TYPE 1
227 // RtlAcquirePrivileges Flags
229 #define RTL_ACQUIRE_PRIVILEGE_IMPERSONATE 1
230 #define RTL_ACQUIRE_PRIVILEGE_PROCESS 2
232 #ifdef NTOS_MODE_USER
235 // String Hash Algorithms
237 #define HASH_STRING_ALGORITHM_DEFAULT 0
238 #define HASH_STRING_ALGORITHM_X65599 1
239 #define HASH_STRING_ALGORITHM_INVALID 0xffffffff
242 // RtlDuplicateString Flags
244 #define RTL_DUPLICATE_UNICODE_STRING_NULL_TERMINATE 1
245 #define RTL_DUPLICATE_UNICODE_STRING_ALLOCATE_NULL_STRING 2
248 // RtlFindCharInUnicodeString Flags
250 #define RTL_FIND_CHAR_IN_UNICODE_STRING_START_AT_END 1
251 #define RTL_FIND_CHAR_IN_UNICODE_STRING_COMPLEMENT_CHAR_SET 2
252 #define RTL_FIND_CHAR_IN_UNICODE_STRING_CASE_INSENSITIVE 4
255 // RtlImageNtHeaderEx Flags
257 #define RTL_IMAGE_NT_HEADER_EX_FLAG_NO_RANGE_CHECK 0x00000001
260 // RtlDosApplyFileIsolationRedirection_Ustr Flags
262 #define RTL_DOS_APPLY_FILE_REDIRECTION_USTR_FLAG_RESPECT_DOT_LOCAL 0x01
267 #define NLS_MB_CODE_PAGE_TAG NlsMbCodePageTag
268 #define NLS_MB_OEM_CODE_PAGE_TAG NlsMbOemCodePageTag
269 #define NLS_OEM_LEAD_BYTE_INFO NlsOemLeadByteInfo
272 // Activation Contexts
274 #define INVALID_ACTIVATION_CONTEXT (PVOID)0xFFFFFFFF
279 #if defined(__cplusplus)
280 #define RTL_CONST_CAST(type) const_cast<type>
282 #define RTL_CONST_CAST(type) (type)
286 // Constant String Macro
288 #define RTL_CONSTANT_STRING(__SOURCE_STRING__) \
290 sizeof(__SOURCE_STRING__) - sizeof((__SOURCE_STRING__)[0]), \
291 sizeof(__SOURCE_STRING__), \
292 (__SOURCE_STRING__) \
296 // Constant Object Attributes Macro
298 #define RTL_CONSTANT_OBJECT_ATTRIBUTES(n, a) \
300 sizeof(OBJECT_ATTRIBUTES), \
302 RTL_CONST_CAST(PUNICODE_STRING)(n), \
308 #define RTL_INIT_OBJECT_ATTRIBUTES(n, a) \
309 RTL_CONSTANT_OBJECT_ATTRIBUTES(n, a)
311 #else /* NTOS_MODE_USER */
313 // Message Resource Flag
315 #define MESSAGE_RESOURCE_UNICODE 0x0001
317 #endif /* !NTOS_MODE_USER */
318 #define MAXIMUM_LEADBYTES 12
323 #define RTL_DEBUG_QUERY_MODULES 0x01
324 #define RTL_DEBUG_QUERY_BACKTRACES 0x02
325 #define RTL_DEBUG_QUERY_HEAPS 0x04
326 #define RTL_DEBUG_QUERY_HEAP_TAGS 0x08
327 #define RTL_DEBUG_QUERY_HEAP_BLOCKS 0x10
328 #define RTL_DEBUG_QUERY_LOCKS 0x20
333 #define RTL_HANDLE_VALID 0x1
338 #define RTL_ATOM_IS_PINNED 0x1
341 // Critical section lock bits
343 #define CS_LOCK_BIT 0x1
344 #define CS_LOCK_BIT_V 0x0
345 #define CS_LOCK_WAITER_WOKEN 0x2
346 #define CS_LOCK_WAITER_INC 0x4
351 #ifdef NTOS_MODE_USER
352 extern BOOLEAN NTSYSAPI NLS_MB_CODE_PAGE_TAG
;
353 extern BOOLEAN NTSYSAPI NLS_MB_OEM_CODE_PAGE_TAG
;
356 // Constant String Macro
358 #define RTL_CONSTANT_STRING(__SOURCE_STRING__) \
360 sizeof(__SOURCE_STRING__) - sizeof((__SOURCE_STRING__)[0]), \
361 sizeof(__SOURCE_STRING__), \
362 (__SOURCE_STRING__) \
365 #endif /* NTOS_MODE_USER */
367 #ifdef NTOS_MODE_USER
370 // Boot Status Data Field Types
372 typedef enum _RTL_BSD_ITEM_TYPE
374 RtlBsdItemVersionNumber
,
375 RtlBsdItemProductType
,
376 RtlBsdItemAabEnabled
,
377 RtlBsdItemAabTimeout
,
379 RtlBsdItemBootShutdown
,
381 } RTL_BSD_ITEM_TYPE
, *PRTL_BSD_ITEM_TYPE
;
384 // Table and Compare result types
386 typedef enum _TABLE_SEARCH_RESULT
392 } TABLE_SEARCH_RESULT
;
394 typedef enum _RTL_GENERIC_COMPARE_RESULTS
399 } RTL_GENERIC_COMPARE_RESULTS
;
401 #endif /* NTOS_MODE_USER */
406 typedef enum _RTL_PATH_TYPE
409 RtlPathTypeUncAbsolute
,
410 RtlPathTypeDriveAbsolute
,
411 RtlPathTypeDriveRelative
,
414 RtlPathTypeLocalDevice
,
415 RtlPathTypeRootLocalDevice
,
418 #ifndef NTOS_MODE_USER
421 // Heap Information Class
423 typedef enum _HEAP_INFORMATION_CLASS
425 HeapCompatibilityInformation
,
426 HeapEnableTerminationOnCorruption
427 } HEAP_INFORMATION_CLASS
;
430 // Callback function for RTL Timers or Registered Waits
433 (NTAPI
*WAITORTIMERCALLBACKFUNC
)(
435 BOOLEAN fTimerOrWaitFired
439 // Handler during Vectored RTL Exceptions
442 (NTAPI
*PVECTORED_EXCEPTION_HANDLER
)(
443 PEXCEPTION_POINTERS ExceptionPointers
447 // Worker Thread Callback for Rtl
450 (NTAPI
*WORKERCALLBACKFUNC
)(
454 #else /* !NTOS_MODE_USER */
457 // RTL Library Allocation/Free Routines
460 (NTAPI
*PRTL_ALLOCATE_STRING_ROUTINE
)(
465 (NTAPI
*PRTL_REALLOCATE_STRING_ROUTINE
)(
466 SIZE_T NumberOfBytes
,
472 (NTAPI
*PRTL_FREE_STRING_ROUTINE
)(
476 extern const PRTL_ALLOCATE_STRING_ROUTINE RtlAllocateStringRoutine
;
477 extern const PRTL_FREE_STRING_ROUTINE RtlFreeStringRoutine
;
478 extern const PRTL_REALLOCATE_STRING_ROUTINE RtlReallocateStringRoutine
;
480 #endif /* NTOS_MODE_USER */
483 // Unhandled Exception Filter
486 (NTAPI
*RTLP_UNHANDLED_EXCEPTION_FILTER
)(
487 IN
struct _EXCEPTION_POINTERS
*ExceptionInfo
489 typedef RTLP_UNHANDLED_EXCEPTION_FILTER
*PRTLP_UNHANDLED_EXCEPTION_FILTER
;
492 // Callback for RTL Heap Enumeration
495 (NTAPI
*PHEAP_ENUMERATION_ROUTINE
)(
501 // Thread and Process Start Routines for RtlCreateUserThread/Process
503 typedef ULONG (NTAPI
*PTHREAD_START_ROUTINE
)(
508 (NTAPI
*PRTL_BASE_PROCESS_START_ROUTINE
)(
509 PTHREAD_START_ROUTINE StartAddress
,
514 // Worker Start/Exit Function
517 (NTAPI
*PRTL_START_POOL_THREAD
)(
518 IN PTHREAD_START_ROUTINE Function
,
520 OUT PHANDLE ThreadHandle
524 (NTAPI
*PRTL_EXIT_POOL_THREAD
)(
525 IN NTSTATUS ExitStatus
529 // Declare empty structure definitions so that they may be referenced by
530 // routines before they are defined
532 struct _RTL_AVL_TABLE
;
533 struct _RTL_GENERIC_TABLE
;
537 // Routines and callbacks for the RTL AVL/Generic Table package
539 #ifdef NTOS_MODE_USER
541 (NTAPI RTL_AVL_MATCH_FUNCTION
)(
542 struct _RTL_AVL_TABLE
*Table
,
546 typedef RTL_AVL_MATCH_FUNCTION
*PRTL_AVL_MATCH_FUNCTION
;
548 typedef RTL_GENERIC_COMPARE_RESULTS
549 (NTAPI RTL_AVL_COMPARE_ROUTINE
) (
550 struct _RTL_AVL_TABLE
*Table
,
554 typedef RTL_AVL_COMPARE_ROUTINE
*PRTL_AVL_COMPARE_ROUTINE
;
556 typedef RTL_GENERIC_COMPARE_RESULTS
557 (NTAPI RTL_GENERIC_COMPARE_ROUTINE
) (
558 struct _RTL_GENERIC_TABLE
*Table
,
562 typedef RTL_GENERIC_COMPARE_ROUTINE
*PRTL_GENERIC_COMPARE_ROUTINE
;
565 (NTAPI RTL_GENERIC_ALLOCATE_ROUTINE
) (
566 struct _RTL_GENERIC_TABLE
*Table
,
569 typedef RTL_GENERIC_ALLOCATE_ROUTINE
*PRTL_GENERIC_ALLOCATE_ROUTINE
;
572 (NTAPI RTL_AVL_ALLOCATE_ROUTINE
) (
573 struct _RTL_AVL_TABLE
*Table
,
576 typedef RTL_AVL_ALLOCATE_ROUTINE
*PRTL_AVL_ALLOCATE_ROUTINE
;
579 (NTAPI RTL_GENERIC_FREE_ROUTINE
) (
580 struct _RTL_GENERIC_TABLE
*Table
,
583 typedef RTL_GENERIC_FREE_ROUTINE
*PRTL_GENERIC_FREE_ROUTINE
;
586 (NTAPI RTL_AVL_FREE_ROUTINE
) (
587 struct _RTL_AVL_TABLE
*Table
,
590 typedef RTL_AVL_FREE_ROUTINE
*PRTL_AVL_FREE_ROUTINE
;
592 #ifdef RTL_USE_AVL_TABLES
593 #undef RTL_GENERIC_COMPARE_ROUTINE
594 #undef PRTL_GENERIC_COMPARE_ROUTINE
595 #undef RTL_GENERIC_ALLOCATE_ROUTINE
596 #undef PRTL_GENERIC_ALLOCATE_ROUTINE
597 #undef RTL_GENERIC_FREE_ROUTINE
598 #undef PRTL_GENERIC_FREE_ROUTINE
600 #define RTL_GENERIC_COMPARE_ROUTINE RTL_AVL_COMPARE_ROUTINE
601 #define PRTL_GENERIC_COMPARE_ROUTINE PRTL_AVL_COMPARE_ROUTINE
602 #define RTL_GENERIC_ALLOCATE_ROUTINE RTL_AVL_ALLOCATE_ROUTINE
603 #define PRTL_GENERIC_ALLOCATE_ROUTINE PRTL_AVL_ALLOCATE_ROUTINE
604 #define RTL_GENERIC_FREE_ROUTINE RTL_AVL_FREE_ROUTINE
605 #define PRTL_GENERIC_FREE_ROUTINE PRTL_AVL_FREE_ROUTINE
606 #endif /* RTL_USE_AVL_TABLES */
608 #endif /* NTOS_MODE_USER */
611 // RTL Query Registry callback
613 #ifdef NTOS_MODE_USER
615 (NTAPI
*PRTL_QUERY_REGISTRY_ROUTINE
)(
619 IN ULONG ValueLength
,
621 IN PVOID EntryContext
626 // RTL Secure Memory callbacks
628 #ifdef NTOS_MODE_USER
630 (NTAPI
*PRTL_SECURE_MEMORY_CACHE_CALLBACK
)(
637 // RTL Range List callbacks
639 #ifdef NTOS_MODE_USER
641 (NTAPI
*PRTL_CONFLICT_RANGE_CALLBACK
)(
643 struct _RTL_RANGE
*Range
647 // Custom Heap Commit Routine for RtlCreateHeap
650 (NTAPI
* PRTL_HEAP_COMMIT_ROUTINE
)(
652 IN OUT PVOID
*CommitAddress
,
653 IN OUT PSIZE_T CommitSize
657 // Parameters for RtlCreateHeap
659 typedef struct _RTL_HEAP_PARAMETERS
662 SIZE_T SegmentReserve
;
663 SIZE_T SegmentCommit
;
664 SIZE_T DeCommitFreeBlockThreshold
;
665 SIZE_T DeCommitTotalFreeThreshold
;
666 SIZE_T MaximumAllocationSize
;
667 SIZE_T VirtualMemoryThreshold
;
668 SIZE_T InitialCommit
;
669 SIZE_T InitialReserve
;
670 PRTL_HEAP_COMMIT_ROUTINE CommitRoutine
;
672 } RTL_HEAP_PARAMETERS
, *PRTL_HEAP_PARAMETERS
;
675 // RTL Bitmap structures
677 typedef struct _RTL_BITMAP
681 } RTL_BITMAP
, *PRTL_BITMAP
;
683 typedef struct _RTL_BITMAP_RUN
687 } RTL_BITMAP_RUN
, *PRTL_BITMAP_RUN
;
690 // RtlGenerateXxxName context
692 typedef struct _GENERATE_NAME_CONTEXT
695 BOOLEAN CheckSumInserted
;
698 ULONG ExtensionLength
;
699 WCHAR ExtensionBuffer
[4];
700 ULONG LastIndexValue
;
701 } GENERATE_NAME_CONTEXT
, *PGENERATE_NAME_CONTEXT
;
704 // RTL Splay and Balanced Links structures
706 typedef struct _RTL_SPLAY_LINKS
708 struct _RTL_SPLAY_LINKS
*Parent
;
709 struct _RTL_SPLAY_LINKS
*LeftChild
;
710 struct _RTL_SPLAY_LINKS
*RightChild
;
711 } RTL_SPLAY_LINKS
, *PRTL_SPLAY_LINKS
;
713 typedef struct _RTL_BALANCED_LINKS
715 struct _RTL_BALANCED_LINKS
*Parent
;
716 struct _RTL_BALANCED_LINKS
*LeftChild
;
717 struct _RTL_BALANCED_LINKS
*RightChild
;
720 } RTL_BALANCED_LINKS
, *PRTL_BALANCED_LINKS
;
723 // RTL Avl/Generic Tables
725 #ifndef RTL_USE_AVL_TABLES
726 typedef struct _RTL_GENERIC_TABLE
728 PRTL_SPLAY_LINKS TableRoot
;
729 LIST_ENTRY InsertOrderList
;
730 PLIST_ENTRY OrderedPointer
;
731 ULONG WhichOrderedElement
;
732 ULONG NumberGenericTableElements
;
733 PRTL_GENERIC_COMPARE_ROUTINE CompareRoutine
;
734 PRTL_GENERIC_ALLOCATE_ROUTINE AllocateRoutine
;
735 PRTL_GENERIC_FREE_ROUTINE FreeRoutine
;
737 } RTL_GENERIC_TABLE
, *PRTL_GENERIC_TABLE
;
738 #endif /* !RTL_USE_AVL_TABLES */
740 typedef struct _RTL_AVL_TABLE
742 RTL_BALANCED_LINKS BalancedRoot
;
743 PVOID OrderedPointer
;
744 ULONG WhichOrderedElement
;
745 ULONG NumberGenericTableElements
;
747 PRTL_BALANCED_LINKS RestartKey
;
749 PRTL_AVL_COMPARE_ROUTINE CompareRoutine
;
750 PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine
;
751 PRTL_AVL_FREE_ROUTINE FreeRoutine
;
753 } RTL_AVL_TABLE
, *PRTL_AVL_TABLE
;
755 #ifdef RTL_USE_AVL_TABLES
756 #undef RTL_GENERIC_TABLE
757 #undef PRTL_GENERIC_TABLE
759 #define RTL_GENERIC_TABLE RTL_AVL_TABLE
760 #define PRTL_GENERIC_TABLE PRTL_AVL_TABLE
761 #endif /* RTL_USE_AVL_TABLES */
764 // RTL Compression Buffer
766 typedef struct _COMPRESSED_DATA_INFO
{
767 USHORT CompressionFormatAndEngine
;
768 UCHAR CompressionUnitShift
;
772 USHORT NumberOfChunks
;
773 ULONG CompressedChunkSizes
[ANYSIZE_ARRAY
];
774 } COMPRESSED_DATA_INFO
, *PCOMPRESSED_DATA_INFO
;
777 // RtlQueryRegistry Data
779 typedef struct _RTL_QUERY_REGISTRY_TABLE
781 PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine
;
788 } RTL_QUERY_REGISTRY_TABLE
, *PRTL_QUERY_REGISTRY_TABLE
;
791 // RTL Unicode Table Structures
793 typedef struct _UNICODE_PREFIX_TABLE_ENTRY
797 struct _UNICODE_PREFIX_TABLE_ENTRY
*NextPrefixTree
;
798 struct _UNICODE_PREFIX_TABLE_ENTRY
*CaseMatch
;
799 RTL_SPLAY_LINKS Links
;
800 PUNICODE_STRING Prefix
;
801 } UNICODE_PREFIX_TABLE_ENTRY
, *PUNICODE_PREFIX_TABLE_ENTRY
;
803 typedef struct _UNICODE_PREFIX_TABLE
807 PUNICODE_PREFIX_TABLE_ENTRY NextPrefixTree
;
808 PUNICODE_PREFIX_TABLE_ENTRY LastNextEntry
;
809 } UNICODE_PREFIX_TABLE
, *PUNICODE_PREFIX_TABLE
;
812 // Time Structure for RTL Time calls
814 typedef struct _TIME_FIELDS
824 } TIME_FIELDS
, *PTIME_FIELDS
;
827 // Activation Context
829 typedef PVOID PACTIVATION_CONTEXT
;
832 // Activation Context Frame
834 typedef struct _RTL_ACTIVATION_CONTEXT_STACK_FRAME
836 struct _RTL_ACTIVATION_CONTEXT_STACK_FRAME
*Previous
;
837 PACTIVATION_CONTEXT ActivationContext
;
839 } RTL_ACTIVATION_CONTEXT_STACK_FRAME
, *PRTL_ACTIVATION_CONTEXT_STACK_FRAME
;
841 typedef struct _RTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_BASIC
845 RTL_ACTIVATION_CONTEXT_STACK_FRAME Frame
;
846 } RTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_BASIC
, *PRTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_BASIC
;
848 typedef struct _RTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED
852 RTL_ACTIVATION_CONTEXT_STACK_FRAME Frame
;
857 } RTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED
, *PRTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED
;
859 typedef RTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED RTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME
;
860 typedef PRTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED PRTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME
;
862 #if (NTDDI_VERSION >= NTDDI_WS03)
863 typedef struct _ACTIVATION_CONTEXT_STACK
865 PRTL_ACTIVATION_CONTEXT_STACK_FRAME ActiveFrame
;
866 LIST_ENTRY FrameListCache
;
868 ULONG NextCookieSequenceNumber
;
870 } ACTIVATION_CONTEXT_STACK
, *PACTIVATION_CONTEXT_STACK
;
872 typedef struct _ACTIVATION_CONTEXT_STACK
875 ULONG NextCookieSequenceNumber
;
877 LIST_ENTRY FrameListCache
;
878 } ACTIVATION_CONTEXT_STACK
, *PACTIVATION_CONTEXT_STACK
;
881 #endif /* NTOS_MODE_USER */
889 ACCESS_MASK AccessMask
;
893 // Information Structures for RTL Debug Functions
895 typedef struct _RTL_PROCESS_MODULE_INFORMATION
902 USHORT LoadOrderIndex
;
903 USHORT InitOrderIndex
;
905 USHORT OffsetToFileName
;
906 CHAR FullPathName
[256];
907 } RTL_PROCESS_MODULE_INFORMATION
, *PRTL_PROCESS_MODULE_INFORMATION
;
909 typedef struct _RTL_PROCESS_MODULES
911 ULONG NumberOfModules
;
912 RTL_PROCESS_MODULE_INFORMATION Modules
[1];
913 } RTL_PROCESS_MODULES
, *PRTL_PROCESS_MODULES
;
915 typedef struct _RTL_PROCESS_MODULE_INFORMATION_EX
918 RTL_PROCESS_MODULE_INFORMATION BaseInfo
;
922 } RTL_PROCESS_MODULE_INFORMATION_EX
, *PRTL_PROCESS_MODULE_INFORMATION_EX
;
924 typedef struct _RTL_HEAP_TAG_INFO
926 ULONG NumberOfAllocations
;
928 SIZE_T BytesAllocated
;
929 } RTL_HEAP_TAG_INFO
, *PRTL_HEAP_TAG_INFO
;
931 typedef struct _RTL_HEAP_USAGE_ENTRY
933 struct _RTL_HEAP_USAGE_ENTRY
*Next
;
936 USHORT AllocatorBackTraceIndex
;
938 } RTL_HEAP_USAGE_ENTRY
, *PRTL_HEAP_USAGE_ENTRY
;
940 typedef struct _RTL_HEAP_USAGE
943 SIZE_T BytesAllocated
;
944 SIZE_T BytesCommitted
;
945 SIZE_T BytesReserved
;
946 SIZE_T BytesReservedMaximum
;
947 PRTL_HEAP_USAGE_ENTRY Entries
;
948 PRTL_HEAP_USAGE_ENTRY AddedEntries
;
949 PRTL_HEAP_USAGE_ENTRY RemovedEntries
;
950 ULONG_PTR Reserved
[8];
951 } RTL_HEAP_USAGE
, *PRTL_HEAP_USAGE
;
953 typedef struct _RTL_HEAP_WALK_ENTRY
966 USHORT AllocatorBackTraceIndex
;
971 ULONG_PTR CommittedSize
;
972 ULONG_PTR UnCommittedSize
;
977 } RTL_HEAP_WALK_ENTRY
, *PRTL_HEAP_WALK_ENTRY
;
979 typedef struct _RTL_HEAP_ENTRY
983 USHORT AllocatorBackTraceIndex
;
993 SIZE_T CommittedSize
;
997 } RTL_HEAP_ENTRY
, *PRTL_HEAP_ENTRY
;
999 typedef struct _RTL_HEAP_TAG
1001 ULONG NumberOfAllocations
;
1002 ULONG NumberOfFrees
;
1003 SIZE_T BytesAllocated
;
1005 USHORT CreatorBackTraceIndex
;
1007 } RTL_HEAP_TAG
, *PRTL_HEAP_TAG
;
1009 typedef struct _RTL_HEAP_INFORMATION
1013 USHORT EntryOverhead
;
1014 USHORT CreatorBackTraceIndex
;
1015 SIZE_T BytesAllocated
;
1016 SIZE_T BytesCommitted
;
1018 ULONG NumberOfEntries
;
1019 ULONG NumberOfPseudoTags
;
1020 ULONG PseudoTagGranularity
;
1023 PRTL_HEAP_ENTRY Entries
;
1024 } RTL_HEAP_INFORMATION
, *PRTL_HEAP_INFORMATION
;
1026 typedef struct _RTL_PROCESS_HEAPS
1028 ULONG NumberOfHeaps
;
1029 RTL_HEAP_INFORMATION Heaps
[1];
1030 } RTL_PROCESS_HEAPS
, *PRTL_PROCESS_HEAPS
;
1032 typedef struct _RTL_PROCESS_LOCK_INFORMATION
1036 USHORT CreatorBackTraceIndex
;
1037 ULONG OwnerThreadId
;
1039 ULONG ContentionCount
;
1041 ULONG RecursionCount
;
1042 ULONG NumberOfSharedWaiters
;
1043 ULONG NumberOfExclusiveWaiters
;
1044 } RTL_PROCESS_LOCK_INFORMATION
, *PRTL_PROCESS_LOCK_INFORMATION
;
1046 typedef struct _RTL_PROCESS_LOCKS
1048 ULONG NumberOfLocks
;
1049 RTL_PROCESS_LOCK_INFORMATION Locks
[1];
1050 } RTL_PROCESS_LOCKS
, *PRTL_PROCESS_LOCKS
;
1052 typedef struct _RTL_PROCESS_BACKTRACE_INFORMATION
1054 PVOID SymbolicBackTrace
;
1058 PVOID BackTrace
[16];
1059 } RTL_PROCESS_BACKTRACE_INFORMATION
, *PRTL_PROCESS_BACKTRACE_INFORMATION
;
1061 typedef struct _RTL_PROCESS_BACKTRACES
1063 ULONG CommittedMemory
;
1064 ULONG ReservedMemory
;
1065 ULONG NumberOfBackTraceLookups
;
1066 ULONG NumberOfBackTraces
;
1067 RTL_PROCESS_BACKTRACE_INFORMATION BackTraces
[1];
1068 } RTL_PROCESS_BACKTRACES
, *PRTL_PROCESS_BACKTRACES
;
1070 typedef struct _RTL_PROCESS_VERIFIER_OPTIONS
1074 UCHAR OptionData
[1];
1076 // Option array continues below
1078 } RTL_PROCESS_VERIFIER_OPTIONS
, *PRTL_PROCESS_VERIFIER_OPTIONS
;
1080 typedef struct _RTL_DEBUG_INFORMATION
1082 HANDLE SectionHandleClient
;
1083 PVOID ViewBaseClient
;
1084 PVOID ViewBaseTarget
;
1085 ULONG ViewBaseDelta
;
1086 HANDLE EventPairClient
;
1087 PVOID EventPairTarget
;
1088 HANDLE TargetProcessId
;
1089 HANDLE TargetThreadHandle
;
1096 PRTL_PROCESS_MODULES Modules
;
1097 PRTL_PROCESS_MODULE_INFORMATION_EX ModulesEx
;
1099 PRTL_PROCESS_BACKTRACES BackTraces
;
1100 PRTL_PROCESS_HEAPS Heaps
;
1101 PRTL_PROCESS_LOCKS Locks
;
1102 HANDLE SpecificHeap
;
1103 HANDLE TargetProcessHandle
;
1104 RTL_PROCESS_VERIFIER_OPTIONS VerifierOptions
;
1106 HANDLE CriticalSectionHandle
;
1107 HANDLE CriticalSectionOwnerThread
;
1109 } RTL_DEBUG_INFORMATION
, *PRTL_DEBUG_INFORMATION
;
1112 // Unload Event Trace Structure for RtlGetUnloadEventTrace
1114 typedef struct _RTL_UNLOAD_EVENT_TRACE
1119 ULONG TimeDateStamp
;
1121 WCHAR ImageName
[32];
1122 } RTL_UNLOAD_EVENT_TRACE
, *PRTL_UNLOAD_EVENT_TRACE
;
1125 // RTL Handle Structures
1127 typedef struct _RTL_HANDLE_TABLE_ENTRY
1132 struct _RTL_HANDLE_TABLE_ENTRY
*NextFree
;
1134 } RTL_HANDLE_TABLE_ENTRY
, *PRTL_HANDLE_TABLE_ENTRY
;
1136 typedef struct _RTL_HANDLE_TABLE
1138 ULONG MaximumNumberOfHandles
;
1139 ULONG SizeOfHandleTableEntry
;
1141 PRTL_HANDLE_TABLE_ENTRY FreeHandles
;
1142 PRTL_HANDLE_TABLE_ENTRY CommittedHandles
;
1143 PRTL_HANDLE_TABLE_ENTRY UnCommittedHandles
;
1144 PRTL_HANDLE_TABLE_ENTRY MaxReservedHandles
;
1145 } RTL_HANDLE_TABLE
, *PRTL_HANDLE_TABLE
;
1150 typedef struct _EXCEPTION_REGISTRATION_RECORD
1152 struct _EXCEPTION_REGISTRATION_RECORD
*Next
;
1153 PEXCEPTION_ROUTINE Handler
;
1154 } EXCEPTION_REGISTRATION_RECORD
, *PEXCEPTION_REGISTRATION_RECORD
;
1157 // Current Directory Structures
1159 typedef struct _CURDIR
1161 UNICODE_STRING DosPath
;
1165 typedef struct _RTLP_CURDIR_REF
1169 } RTLP_CURDIR_REF
, *PRTLP_CURDIR_REF
;
1171 typedef struct _RTL_RELATIVE_NAME_U
1173 UNICODE_STRING RelativeName
;
1174 HANDLE ContainingDirectory
;
1175 PRTLP_CURDIR_REF CurDirRef
;
1176 } RTL_RELATIVE_NAME_U
, *PRTL_RELATIVE_NAME_U
;
1178 typedef struct _RTL_DRIVE_LETTER_CURDIR
1183 UNICODE_STRING DosPath
;
1184 } RTL_DRIVE_LETTER_CURDIR
, *PRTL_DRIVE_LETTER_CURDIR
;
1186 typedef struct _RTL_PERTHREAD_CURDIR
1188 PRTL_DRIVE_LETTER_CURDIR CurrentDirectories
;
1189 PUNICODE_STRING ImageName
;
1191 } RTL_PERTHREAD_CURDIR
, *PRTL_PERTHREAD_CURDIR
;
1194 // Private State structure for RtlAcquirePrivilege/RtlReleasePrivilege
1196 typedef struct _RTL_ACQUIRE_STATE
1199 HANDLE OldImpersonationToken
;
1200 PTOKEN_PRIVILEGES OldPrivileges
;
1201 PTOKEN_PRIVILEGES NewPrivileges
;
1203 UCHAR OldPrivBuffer
[1024];
1204 } RTL_ACQUIRE_STATE
, *PRTL_ACQUIRE_STATE
;
1206 #ifndef NTOS_MODE_USER
1209 // RTL Critical Section Structures
1211 typedef struct _RTL_CRITICAL_SECTION_DEBUG
1214 USHORT CreatorBackTraceIndex
;
1215 struct _RTL_CRITICAL_SECTION
*CriticalSection
;
1216 LIST_ENTRY ProcessLocksList
;
1218 ULONG ContentionCount
;
1220 } RTL_CRITICAL_SECTION_DEBUG
, *PRTL_CRITICAL_SECTION_DEBUG
, RTL_RESOURCE_DEBUG
, *PRTL_RESOURCE_DEBUG
;
1222 typedef struct _RTL_CRITICAL_SECTION
1224 PRTL_CRITICAL_SECTION_DEBUG DebugInfo
;
1226 LONG RecursionCount
;
1227 HANDLE OwningThread
;
1228 HANDLE LockSemaphore
;
1229 ULONG_PTR SpinCount
;
1230 } RTL_CRITICAL_SECTION
, *PRTL_CRITICAL_SECTION
;
1232 #endif /* !NTOS_MODE_USER */
1235 // RTL Private Heap Structures
1237 typedef struct _HEAP_LOCK
1241 RTL_CRITICAL_SECTION CriticalSection
;
1242 #ifndef NTOS_MODE_USER
1245 UCHAR Padding
[0x68]; /* Max ERESOURCE size for x64 build. Needed because RTL is built only once */
1247 } HEAP_LOCK
, *PHEAP_LOCK
;
1250 // RTL Range List Structures
1252 typedef struct _RTL_RANGE_LIST
1254 LIST_ENTRY ListHead
;
1258 } RTL_RANGE_LIST
, *PRTL_RANGE_LIST
;
1260 typedef struct _RTL_RANGE
1268 } RTL_RANGE
, *PRTL_RANGE
;
1270 typedef struct _RANGE_LIST_ITERATOR
1272 PLIST_ENTRY RangeListHead
;
1273 PLIST_ENTRY MergedHead
;
1276 } RTL_RANGE_LIST_ITERATOR
, *PRTL_RANGE_LIST_ITERATOR
;
1281 #define RTL_RESOURCE_FLAG_LONG_TERM ((ULONG)0x00000001)
1283 typedef struct _RTL_RESOURCE
1285 RTL_CRITICAL_SECTION Lock
;
1286 HANDLE SharedSemaphore
;
1287 ULONG SharedWaiters
;
1288 HANDLE ExclusiveSemaphore
;
1289 ULONG ExclusiveWaiters
;
1291 HANDLE OwningThread
;
1294 } RTL_RESOURCE
, *PRTL_RESOURCE
;
1297 // Structures for RtlCreateUserProcess
1299 typedef struct _RTL_USER_PROCESS_PARAMETERS
1301 ULONG MaximumLength
;
1305 HANDLE ConsoleHandle
;
1307 HANDLE StandardInput
;
1308 HANDLE StandardOutput
;
1309 HANDLE StandardError
;
1310 CURDIR CurrentDirectory
;
1311 UNICODE_STRING DllPath
;
1312 UNICODE_STRING ImagePathName
;
1313 UNICODE_STRING CommandLine
;
1321 ULONG FillAttribute
;
1323 ULONG ShowWindowFlags
;
1324 UNICODE_STRING WindowTitle
;
1325 UNICODE_STRING DesktopInfo
;
1326 UNICODE_STRING ShellInfo
;
1327 UNICODE_STRING RuntimeData
;
1328 RTL_DRIVE_LETTER_CURDIR CurrentDirectories
[RTL_MAX_DRIVE_LETTERS
];
1329 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
1330 SIZE_T EnvironmentSize
;
1332 #if (NTDDI_VERSION >= NTDDI_WIN7)
1333 SIZE_T EnvironmentVersion
;
1335 } RTL_USER_PROCESS_PARAMETERS
, *PRTL_USER_PROCESS_PARAMETERS
;
1337 typedef struct _RTL_USER_PROCESS_INFORMATION
1340 HANDLE ProcessHandle
;
1341 HANDLE ThreadHandle
;
1343 SECTION_IMAGE_INFORMATION ImageInformation
;
1344 } RTL_USER_PROCESS_INFORMATION
, *PRTL_USER_PROCESS_INFORMATION
;
1347 // RTL Atom Table Structures
1349 typedef struct _RTL_ATOM_TABLE_ENTRY
1351 struct _RTL_ATOM_TABLE_ENTRY
*HashLink
;
1354 USHORT ReferenceCount
;
1358 } RTL_ATOM_TABLE_ENTRY
, *PRTL_ATOM_TABLE_ENTRY
;
1360 typedef struct _RTL_ATOM_TABLE
1365 #ifdef NTOS_MODE_USER
1366 RTL_CRITICAL_SECTION CriticalSection
;
1368 FAST_MUTEX FastMutex
;
1373 #ifdef NTOS_MODE_USER
1374 RTL_HANDLE_TABLE RtlHandleTable
;
1376 PHANDLE_TABLE ExHandleTable
;
1379 ULONG NumberOfBuckets
;
1380 PRTL_ATOM_TABLE_ENTRY Buckets
[1];
1381 } RTL_ATOM_TABLE
, *PRTL_ATOM_TABLE
;
1385 // System Time and Timezone Structures
1387 typedef struct _SYSTEMTIME
1396 USHORT wMilliseconds
;
1397 } SYSTEMTIME
, *PSYSTEMTIME
, *LPSYSTEMTIME
;
1399 typedef struct _TIME_ZONE_INFORMATION
1402 WCHAR StandardName
[32];
1403 SYSTEMTIME StandardDate
;
1405 WCHAR DaylightName
[32];
1406 SYSTEMTIME DaylightDate
;
1408 } TIME_ZONE_INFORMATION
, *PTIME_ZONE_INFORMATION
, *LPTIME_ZONE_INFORMATION
;
1409 #endif /* !_WINBASE_ */
1412 // Native version of Timezone Structure
1414 typedef LPTIME_ZONE_INFORMATION PRTL_TIME_ZONE_INFORMATION
;
1419 typedef struct _RTL_PATCH_HEADER
1421 LIST_ENTRY PatchList
;
1422 PVOID PatchImageBase
;
1423 struct _RTL_PATCH_HEADER
*NextPath
;
1426 struct _HOTPATCH_HEADER
*HotpatchHeader
;
1427 UNICODE_STRING TargetDllName
;
1428 PVOID TargetDllBase
;
1429 PLDR_DATA_TABLE_ENTRY TargetLdrDataTableEntry
;
1430 PLDR_DATA_TABLE_ENTRY PatchLdrDataTableEntry
;
1431 struct _SYSTEM_HOTPATCH_CODE_INFORMATION
*CodeInfo
;
1432 } RTL_PATCH_HEADER
, *PRTL_PATCH_HEADER
;
1435 // Header for NLS Files
1437 typedef struct _NLS_FILE_HEADER
1441 USHORT MaximumCharacterSize
;
1443 USHORT UniDefaultChar
;
1444 USHORT TransDefaultChar
;
1445 USHORT TransUniDefaultChar
;
1446 UCHAR LeadByte
[MAXIMUM_LEADBYTES
];
1447 } NLS_FILE_HEADER
, *PNLS_FILE_HEADER
;
1452 typedef struct _RTL_STACK_TRACE_ENTRY
1454 struct _RTL_STACK_TRACE_ENTRY
*HashChain
;
1458 PVOID BackTrace
[32];
1459 } RTL_STACK_TRACE_ENTRY
, *PRTL_STACK_TRACE_ENTRY
;
1461 typedef struct _STACK_TRACE_DATABASE
1463 RTL_CRITICAL_SECTION CriticalSection
;
1464 } STACK_TRACE_DATABASE
, *PSTACK_TRACE_DATABASE
;
1466 typedef struct _RTL_TRACE_BLOCK
1474 struct _RTL_TRACE_BLOCK
*Next
;
1476 } RTL_TRACE_BLOCK
, *PRTL_TRACE_BLOCK
;
1479 // Auto-Managed Rtl* String Buffer
1481 typedef struct _RTL_BUFFER
1484 PUCHAR StaticBuffer
;
1487 SIZE_T ReservedForAllocatedSize
;
1488 PVOID ReservedForIMalloc
;
1489 } RTL_BUFFER
, *PRTL_BUFFER
;
1491 typedef struct _RTL_UNICODE_STRING_BUFFER
1493 UNICODE_STRING String
;
1494 RTL_BUFFER ByteBuffer
;
1495 WCHAR MinimumStaticBufferForTerminalNul
;
1496 } RTL_UNICODE_STRING_BUFFER
, *PRTL_UNICODE_STRING_BUFFER
;
1498 #ifndef NTOS_MODE_USER
1501 // Message Resource Entry, Block and Data
1503 typedef struct _MESSAGE_RESOURCE_ENTRY
1507 UCHAR Text
[ANYSIZE_ARRAY
];
1508 } MESSAGE_RESOURCE_ENTRY
, *PMESSAGE_RESOURCE_ENTRY
;
1510 typedef struct _MESSAGE_RESOURCE_BLOCK
1514 ULONG OffsetToEntries
;
1515 } MESSAGE_RESOURCE_BLOCK
, *PMESSAGE_RESOURCE_BLOCK
;
1517 typedef struct _MESSAGE_RESOURCE_DATA
1519 ULONG NumberOfBlocks
;
1520 MESSAGE_RESOURCE_BLOCK Blocks
[ANYSIZE_ARRAY
];
1521 } MESSAGE_RESOURCE_DATA
, *PMESSAGE_RESOURCE_DATA
;
1523 #endif /* !NTOS_MODE_USER */
1524 #endif /* !_RTLTYPES_H */