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
34 // Maximum Atom Length
36 #define RTL_MAXIMUM_ATOM_LENGTH 255
39 // Process Parameters Flags
41 #define RTL_USER_PROCESS_PARAMETERS_NORMALIZED 0x01
42 #define RTL_USER_PROCESS_PARAMETERS_PROFILE_USER 0x02
43 #define RTL_USER_PROCESS_PARAMETERS_PROFILE_KERNEL 0x04
44 #define RTL_USER_PROCESS_PARAMETERS_PROFILE_SERVER 0x08
45 #define RTL_USER_PROCESS_PARAMETERS_UNKNOWN 0x10
46 #define RTL_USER_PROCESS_PARAMETERS_RESERVE_1MB 0x20
47 #define RTL_USER_PROCESS_PARAMETERS_RESERVE_16MB 0x40
48 #define RTL_USER_PROCESS_PARAMETERS_CASE_SENSITIVE 0x80
49 #define RTL_USER_PROCESS_PARAMETERS_DISABLE_HEAP_CHECKS 0x100
50 #define RTL_USER_PROCESS_PARAMETERS_PROCESS_OR_1 0x200
51 #define RTL_USER_PROCESS_PARAMETERS_PROCESS_OR_2 0x400
52 #define RTL_USER_PROCESS_PARAMETERS_PRIVATE_DLL_PATH 0x1000
53 #define RTL_USER_PROCESS_PARAMETERS_LOCAL_DLL_PATH 0x2000
54 #define RTL_USER_PROCESS_PARAMETERS_IMAGE_KEY_MISSING 0x4000
55 #define RTL_USER_PROCESS_PARAMETERS_NX 0x20000
57 #define RTL_MAX_DRIVE_LETTERS 32
58 #define RTL_DRIVE_LETTER_VALID (USHORT)0x0001
61 // End of Exception List
63 #define EXCEPTION_CHAIN_END ((PEXCEPTION_REGISTRATION_RECORD)-1)
66 // Thread Error Mode Flags
68 /* Also defined in psdk/winbase.h */
69 #define SEM_FAILCRITICALERRORS 0x0001
70 #define SEM_NOGPFAULTERRORBOX 0x0002
71 #define SEM_NOALIGNMENTFAULTEXCEPT 0x0004
72 #define SEM_NOOPENFILEERRORBOX 0x8000
74 #define RTL_SEM_FAILCRITICALERRORS (SEM_FAILCRITICALERRORS << 4)
75 #define RTL_SEM_NOGPFAULTERRORBOX (SEM_NOGPFAULTERRORBOX << 4)
76 #define RTL_SEM_NOALIGNMENTFAULTEXCEPT (SEM_NOALIGNMENTFAULTEXCEPT << 4)
79 // Range and Range List Flags
81 #define RTL_RANGE_LIST_ADD_IF_CONFLICT 0x00000001
82 #define RTL_RANGE_LIST_ADD_SHARED 0x00000002
84 #define RTL_RANGE_SHARED 0x01
85 #define RTL_RANGE_CONFLICT 0x02
88 // Flags in RTL_ACTIVATION_CONTEXT_STACK_FRAME (from Checked NTDLL)
90 #define RTL_ACTIVATION_CONTEXT_STACK_FRAME_FLAG_RELEASE_ON_DEACTIVATION 0x01
91 #define RTL_ACTIVATION_CONTEXT_STACK_FRAME_FLAG_NO_DEACTIVATE 0x02
92 #define RTL_ACTIVATION_CONTEXT_STACK_FRAME_FLAG_ON_FREE_LIST 0x04
93 #define RTL_ACTIVATION_CONTEXT_STACK_FRAME_FLAG_HEAP_ALLOCATED 0x08
94 #define RTL_ACTIVATION_CONTEXT_STACK_FRAME_FLAG_NOT_REALLY_ACTIVATED 0x10
95 #define RTL_ACTIVATION_CONTEXT_STACK_FRAME_FLAG_ACTIVATED 0x20
96 #define RTL_ACTIVATION_CONTEXT_STACK_FRAME_FLAG_DEACTIVATED 0x40
99 // Activation Context Frame Flags (from Checked NTDLL)
101 #define RTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_FORMAT_WHISTLER 0x01
104 // RtlActivateActivationContextEx Flags (from Checked NTDLL)
106 #define RTL_ACTIVATE_ACTIVATION_CONTEXT_EX_FLAG_RELEASE_ON_STACK_DEALLOCATION 0x01
109 // RtlDeactivateActivationContext Flags (based on Win32 flag and name of above)
111 #define RTL_DEACTIVATE_ACTIVATION_CONTEXT_FLAG_FORCE_EARLY_DEACTIVATION 0x01
114 // RtlQueryActivationContext Flags (based on Win32 flag and name of above)
116 #define RTL_QUERY_ACTIVATION_CONTEXT_FLAG_USE_ACTIVE_ACTIVATION_CONTEXT 0x01
117 #define RTL_QUERY_ACTIVATION_CONTEXT_FLAG_IS_HMODULE 0x02
118 #define RTL_QUERY_ACTIVATION_CONTEXT_FLAG_IS_ADDRESS 0x04
119 #define RTL_QUERY_ACTIVATION_CONTEXT_FLAG_NO_ADDREF 0x80000000
124 #if !defined(NTOS_MODE_USER) && !defined(_NTIFS_)
125 #define HEAP_NO_SERIALIZE 0x00000001
126 #define HEAP_GROWABLE 0x00000002
127 #define HEAP_GENERATE_EXCEPTIONS 0x00000004
128 #define HEAP_ZERO_MEMORY 0x00000008
129 #define HEAP_REALLOC_IN_PLACE_ONLY 0x00000010
130 #define HEAP_TAIL_CHECKING_ENABLED 0x00000020
131 #define HEAP_FREE_CHECKING_ENABLED 0x00000040
132 #define HEAP_DISABLE_COALESCE_ON_FREE 0x00000080
133 #define HEAP_CREATE_ALIGN_16 0x00010000
134 #define HEAP_CREATE_ENABLE_TRACING 0x00020000
135 #define HEAP_CREATE_ENABLE_EXECUTE 0x00040000
139 // User-Defined Heap Flags and Classes
141 #define HEAP_SETTABLE_USER_VALUE 0x00000100
142 #define HEAP_SETTABLE_USER_FLAG1 0x00000200
143 #define HEAP_SETTABLE_USER_FLAG2 0x00000400
144 #define HEAP_SETTABLE_USER_FLAG3 0x00000800
145 #define HEAP_SETTABLE_USER_FLAGS 0x00000E00
146 #define HEAP_CLASS_0 0x00000000
147 #define HEAP_CLASS_1 0x00001000
148 #define HEAP_CLASS_2 0x00002000
149 #define HEAP_CLASS_3 0x00003000
150 #define HEAP_CLASS_4 0x00004000
151 #define HEAP_CLASS_5 0x00005000
152 #define HEAP_CLASS_6 0x00006000
153 #define HEAP_CLASS_7 0x00007000
154 #define HEAP_CLASS_8 0x00008000
155 #define HEAP_CLASS_MASK 0x0000F000
158 // Internal HEAP Structure Flags
160 #define HEAP_FLAG_PAGE_ALLOCS 0x01000000
161 #define HEAP_PROTECTION_ENABLED 0x02000000
162 #define HEAP_BREAK_WHEN_OUT_OF_VM 0x04000000
163 #define HEAP_NO_ALIGNMENT 0x08000000
164 #define HEAP_CAPTURE_STACK_BACKTRACES 0x08000000
165 #define HEAP_SKIP_VALIDATION_CHECKS 0x10000000
166 #define HEAP_VALIDATE_ALL_ENABLED 0x20000000
167 #define HEAP_VALIDATE_PARAMETERS_ENABLED 0x40000000
168 #define HEAP_LOCK_USER_ALLOCATED 0x80000000
171 // Heap Validation Flags
173 #define HEAP_CREATE_VALID_MASK \
174 (HEAP_NO_SERIALIZE | \
176 HEAP_GENERATE_EXCEPTIONS | \
178 HEAP_REALLOC_IN_PLACE_ONLY | \
179 HEAP_TAIL_CHECKING_ENABLED | \
180 HEAP_FREE_CHECKING_ENABLED | \
181 HEAP_DISABLE_COALESCE_ON_FREE | \
183 HEAP_CREATE_ALIGN_16 | \
184 HEAP_CREATE_ENABLE_TRACING | \
185 HEAP_CREATE_ENABLE_EXECUTE)
187 C_ASSERT(HEAP_CREATE_VALID_MASK
== 0x0007F0FF);
191 // Native image architecture
194 #define IMAGE_FILE_MACHINE_NATIVE IMAGE_FILE_MACHINE_I386
195 #elif defined(_M_ARM)
196 #define IMAGE_FILE_MACHINE_NATIVE IMAGE_FILE_MACHINE_ARM
197 #elif defined(_M_AMD64)
198 #define IMAGE_FILE_MACHINE_NATIVE IMAGE_FILE_MACHINE_AMD64
200 #error Define these please!
206 #define RTL_REGISTRY_ABSOLUTE 0
207 #define RTL_REGISTRY_SERVICES 1
208 #define RTL_REGISTRY_CONTROL 2
209 #define RTL_REGISTRY_WINDOWS_NT 3
210 #define RTL_REGISTRY_DEVICEMAP 4
211 #define RTL_REGISTRY_USER 5
212 #define RTL_REGISTRY_MAXIMUM 6
213 #define RTL_REGISTRY_HANDLE 0x40000000
214 #define RTL_REGISTRY_OPTIONAL 0x80000000
215 #define RTL_QUERY_REGISTRY_SUBKEY 0x00000001
216 #define RTL_QUERY_REGISTRY_TOPKEY 0x00000002
217 #define RTL_QUERY_REGISTRY_REQUIRED 0x00000004
218 #define RTL_QUERY_REGISTRY_NOVALUE 0x00000008
219 #define RTL_QUERY_REGISTRY_NOEXPAND 0x00000010
220 #define RTL_QUERY_REGISTRY_DIRECT 0x00000020
221 #define RTL_QUERY_REGISTRY_DELETE 0x00000040
226 #define VER_MINORVERSION 0x0000001
227 #define VER_MAJORVERSION 0x0000002
228 #define VER_BUILDNUMBER 0x0000004
229 #define VER_PLATFORMID 0x0000008
230 #define VER_SERVICEPACKMINOR 0x0000010
231 #define VER_SERVICEPACKMAJOR 0x0000020
232 #define VER_SUITENAME 0x0000040
233 #define VER_PRODUCT_TYPE 0x0000080
234 #define VER_PLATFORM_WIN32s 0
235 #define VER_PLATFORM_WIN32_WINDOWS 1
236 #define VER_PLATFORM_WIN32_NT 2
238 #define VER_GREATER 2
239 #define VER_GREATER_EQUAL 3
241 #define VER_LESS_EQUAL 5
244 #define VER_CONDITION_MASK 7
245 #define VER_NUM_BITS_PER_CONDITION_MASK 3
250 #define TIME_ZONE_ID_UNKNOWN 0
251 #define TIME_ZONE_ID_STANDARD 1
252 #define TIME_ZONE_ID_DAYLIGHT 2
255 // Maximum Path Length
260 // RTL Lock Type (Critical Section or Resource)
262 #define RTL_CRITSECT_TYPE 0
263 #define RTL_RESOURCE_TYPE 1
266 // RtlAcquirePrivileges Flags
268 #define RTL_ACQUIRE_PRIVILEGE_IMPERSONATE 1
269 #define RTL_ACQUIRE_PRIVILEGE_PROCESS 2
271 #ifdef NTOS_MODE_USER
274 // String Hash Algorithms
276 #define HASH_STRING_ALGORITHM_DEFAULT 0
277 #define HASH_STRING_ALGORITHM_X65599 1
278 #define HASH_STRING_ALGORITHM_INVALID 0xffffffff
281 // RtlDuplicateString Flags
283 #define RTL_DUPLICATE_UNICODE_STRING_NULL_TERMINATE 1
284 #define RTL_DUPLICATE_UNICODE_STRING_ALLOCATE_NULL_STRING 2
287 // RtlFindCharInUnicodeString Flags
289 #define RTL_FIND_CHAR_IN_UNICODE_STRING_START_AT_END 1
290 #define RTL_FIND_CHAR_IN_UNICODE_STRING_COMPLEMENT_CHAR_SET 2
291 #define RTL_FIND_CHAR_IN_UNICODE_STRING_CASE_INSENSITIVE 4
294 // RtlImageNtHeaderEx Flags
296 #define RTL_IMAGE_NT_HEADER_EX_FLAG_NO_RANGE_CHECK 0x00000001
299 // RtlDosApplyFileIsolationRedirection_Ustr Flags
301 #define RTL_DOS_APPLY_FILE_REDIRECTION_USTR_FLAG_RESPECT_DOT_LOCAL 0x01
306 #define NLS_MB_CODE_PAGE_TAG NlsMbCodePageTag
307 #define NLS_MB_OEM_CODE_PAGE_TAG NlsMbOemCodePageTag
308 #define NLS_OEM_LEAD_BYTE_INFO NlsOemLeadByteInfo
311 // Activation Contexts
313 #define INVALID_ACTIVATION_CONTEXT ((PVOID)(LONG_PTR)-1)
318 #if defined(__cplusplus)
319 #define RTL_CONST_CAST(type) const_cast<type>
321 #define RTL_CONST_CAST(type) (type)
325 // Constant String Macro
327 #define RTL_CONSTANT_STRING(__SOURCE_STRING__) \
329 sizeof(__SOURCE_STRING__) - sizeof((__SOURCE_STRING__)[0]), \
330 sizeof(__SOURCE_STRING__), \
331 (__SOURCE_STRING__) \
335 // Constant Object Attributes Macro
337 #define RTL_CONSTANT_OBJECT_ATTRIBUTES(n, a) \
339 sizeof(OBJECT_ATTRIBUTES), \
341 RTL_CONST_CAST(PUNICODE_STRING)(n), \
347 #define RTL_INIT_OBJECT_ATTRIBUTES(n, a) \
348 RTL_CONSTANT_OBJECT_ATTRIBUTES(n, a)
350 #else /* NTOS_MODE_USER */
352 // Message Resource Flag
354 #define MESSAGE_RESOURCE_UNICODE 0x0001
356 #endif /* !NTOS_MODE_USER */
357 #define MAXIMUM_LEADBYTES 12
362 #define RTL_DEBUG_QUERY_MODULES 0x01
363 #define RTL_DEBUG_QUERY_BACKTRACES 0x02
364 #define RTL_DEBUG_QUERY_HEAPS 0x04
365 #define RTL_DEBUG_QUERY_HEAP_TAGS 0x08
366 #define RTL_DEBUG_QUERY_HEAP_BLOCKS 0x10
367 #define RTL_DEBUG_QUERY_LOCKS 0x20
372 #define RTL_HANDLE_VALID 0x1
377 #define RTL_ATOM_IS_PINNED 0x1
380 // Critical section lock bits
382 #define CS_LOCK_BIT 0x1
383 #define CS_LOCK_BIT_V 0x0
384 #define CS_LOCK_WAITER_WOKEN 0x2
385 #define CS_LOCK_WAITER_INC 0x4
390 #ifdef NTOS_MODE_USER
391 extern BOOLEAN NTSYSAPI NLS_MB_CODE_PAGE_TAG
;
392 extern BOOLEAN NTSYSAPI NLS_MB_OEM_CODE_PAGE_TAG
;
395 // Constant String Macro
397 #define RTL_CONSTANT_STRING(__SOURCE_STRING__) \
399 sizeof(__SOURCE_STRING__) - sizeof((__SOURCE_STRING__)[0]), \
400 sizeof(__SOURCE_STRING__), \
401 (__SOURCE_STRING__) \
404 #endif /* NTOS_MODE_USER */
407 // Constant Large Integer Macro
409 #ifdef NONAMELESSUNION
410 C_ASSERT(FIELD_OFFSET(LARGE_INTEGER
, u
.LowPart
) == 0);
412 C_ASSERT(FIELD_OFFSET(LARGE_INTEGER
, LowPart
) == 0);
414 #define RTL_CONSTANT_LARGE_INTEGER(quad_part) { { (quad_part), (quad_part)>>32 } }
415 #define RTL_MAKE_LARGE_INTEGER(low_part, high_part) { { (low_part), (high_part) } }
418 // Boot Status Data Field Types
420 typedef enum _RTL_BSD_ITEM_TYPE
422 RtlBsdItemVersionNumber
,
423 RtlBsdItemProductType
,
424 RtlBsdItemAabEnabled
,
425 RtlBsdItemAabTimeout
,
427 RtlBsdItemBootShutdown
,
428 RtlBsdSleepInProgress
,
429 RtlBsdPowerTransition
,
430 RtlBsdItemBootAttemptCount
,
431 RtlBsdItemBootCheckpoint
,
433 RtlBsdItemShutdownBootId
,
434 RtlBsdItemReportedAbnormalShutdownBootId
,
436 RtlBsdItemPowerButtonPressInfo
,
439 } RTL_BSD_ITEM_TYPE
, *PRTL_BSD_ITEM_TYPE
;
441 #ifdef NTOS_MODE_USER
443 // Table and Compare result types
445 typedef enum _TABLE_SEARCH_RESULT
451 } TABLE_SEARCH_RESULT
;
453 typedef enum _RTL_GENERIC_COMPARE_RESULTS
458 } RTL_GENERIC_COMPARE_RESULTS
;
460 #endif /* NTOS_MODE_USER */
465 typedef enum _RTL_PATH_TYPE
468 RtlPathTypeUncAbsolute
,
469 RtlPathTypeDriveAbsolute
,
470 RtlPathTypeDriveRelative
,
473 RtlPathTypeLocalDevice
,
474 RtlPathTypeRootLocalDevice
,
477 #ifndef NTOS_MODE_USER
480 // Heap Information Class
482 typedef enum _HEAP_INFORMATION_CLASS
484 HeapCompatibilityInformation
,
485 HeapEnableTerminationOnCorruption
486 } HEAP_INFORMATION_CLASS
;
489 // Callback function for RTL Timers or Registered Waits
492 (NTAPI
*WAITORTIMERCALLBACKFUNC
)(
494 BOOLEAN fTimerOrWaitFired
498 // Handler during Vectored RTL Exceptions
501 (NTAPI
*PVECTORED_EXCEPTION_HANDLER
)(
502 PEXCEPTION_POINTERS ExceptionPointers
506 // Worker Thread Callback for Rtl
509 (NTAPI
*WORKERCALLBACKFUNC
)(
513 #else /* !NTOS_MODE_USER */
516 // RTL Library Allocation/Free Routines
519 (NTAPI
*PRTL_ALLOCATE_STRING_ROUTINE
)(
524 (NTAPI
*PRTL_REALLOCATE_STRING_ROUTINE
)(
525 SIZE_T NumberOfBytes
,
531 (NTAPI
*PRTL_FREE_STRING_ROUTINE
)(
535 extern const PRTL_ALLOCATE_STRING_ROUTINE RtlAllocateStringRoutine
;
536 extern const PRTL_FREE_STRING_ROUTINE RtlFreeStringRoutine
;
537 extern const PRTL_REALLOCATE_STRING_ROUTINE RtlReallocateStringRoutine
;
539 #endif /* NTOS_MODE_USER */
542 // Unhandled Exception Filter
545 (NTAPI
*RTLP_UNHANDLED_EXCEPTION_FILTER
)(
546 _In_
struct _EXCEPTION_POINTERS
*ExceptionInfo
548 typedef RTLP_UNHANDLED_EXCEPTION_FILTER
*PRTLP_UNHANDLED_EXCEPTION_FILTER
;
551 // Callback for RTL Heap Enumeration
554 (NTAPI
*PHEAP_ENUMERATION_ROUTINE
)(
555 _In_ PVOID HeapHandle
,
560 // Thread and Process Start Routines for RtlCreateUserThread/Process
562 typedef ULONG (NTAPI
*PTHREAD_START_ROUTINE
)(
567 (NTAPI
*PRTL_BASE_PROCESS_START_ROUTINE
)(
568 PTHREAD_START_ROUTINE StartAddress
,
573 // Worker Start/Exit Function
576 (NTAPI
*PRTL_START_POOL_THREAD
)(
577 _In_ PTHREAD_START_ROUTINE Function
,
578 _In_ PVOID Parameter
,
579 _Out_ PHANDLE ThreadHandle
583 (NTAPI
*PRTL_EXIT_POOL_THREAD
)(
584 _In_ NTSTATUS ExitStatus
588 // Declare empty structure definitions so that they may be referenced by
589 // routines before they are defined
591 struct _RTL_AVL_TABLE
;
592 struct _RTL_GENERIC_TABLE
;
596 // Routines and callbacks for the RTL AVL/Generic Table package
598 #ifdef NTOS_MODE_USER
600 (NTAPI RTL_AVL_MATCH_FUNCTION
)(
601 struct _RTL_AVL_TABLE
*Table
,
605 typedef RTL_AVL_MATCH_FUNCTION
*PRTL_AVL_MATCH_FUNCTION
;
607 typedef RTL_GENERIC_COMPARE_RESULTS
608 (NTAPI RTL_AVL_COMPARE_ROUTINE
) (
609 struct _RTL_AVL_TABLE
*Table
,
613 typedef RTL_AVL_COMPARE_ROUTINE
*PRTL_AVL_COMPARE_ROUTINE
;
615 typedef RTL_GENERIC_COMPARE_RESULTS
616 (NTAPI RTL_GENERIC_COMPARE_ROUTINE
) (
617 struct _RTL_GENERIC_TABLE
*Table
,
621 typedef RTL_GENERIC_COMPARE_ROUTINE
*PRTL_GENERIC_COMPARE_ROUTINE
;
624 (NTAPI RTL_GENERIC_ALLOCATE_ROUTINE
) (
625 struct _RTL_GENERIC_TABLE
*Table
,
628 typedef RTL_GENERIC_ALLOCATE_ROUTINE
*PRTL_GENERIC_ALLOCATE_ROUTINE
;
631 (NTAPI RTL_AVL_ALLOCATE_ROUTINE
) (
632 struct _RTL_AVL_TABLE
*Table
,
635 typedef RTL_AVL_ALLOCATE_ROUTINE
*PRTL_AVL_ALLOCATE_ROUTINE
;
638 (NTAPI RTL_GENERIC_FREE_ROUTINE
) (
639 struct _RTL_GENERIC_TABLE
*Table
,
642 typedef RTL_GENERIC_FREE_ROUTINE
*PRTL_GENERIC_FREE_ROUTINE
;
645 (NTAPI RTL_AVL_FREE_ROUTINE
) (
646 struct _RTL_AVL_TABLE
*Table
,
649 typedef RTL_AVL_FREE_ROUTINE
*PRTL_AVL_FREE_ROUTINE
;
651 #ifdef RTL_USE_AVL_TABLES
652 #undef RTL_GENERIC_COMPARE_ROUTINE
653 #undef PRTL_GENERIC_COMPARE_ROUTINE
654 #undef RTL_GENERIC_ALLOCATE_ROUTINE
655 #undef PRTL_GENERIC_ALLOCATE_ROUTINE
656 #undef RTL_GENERIC_FREE_ROUTINE
657 #undef PRTL_GENERIC_FREE_ROUTINE
659 #define RTL_GENERIC_COMPARE_ROUTINE RTL_AVL_COMPARE_ROUTINE
660 #define PRTL_GENERIC_COMPARE_ROUTINE PRTL_AVL_COMPARE_ROUTINE
661 #define RTL_GENERIC_ALLOCATE_ROUTINE RTL_AVL_ALLOCATE_ROUTINE
662 #define PRTL_GENERIC_ALLOCATE_ROUTINE PRTL_AVL_ALLOCATE_ROUTINE
663 #define RTL_GENERIC_FREE_ROUTINE RTL_AVL_FREE_ROUTINE
664 #define PRTL_GENERIC_FREE_ROUTINE PRTL_AVL_FREE_ROUTINE
665 #endif /* RTL_USE_AVL_TABLES */
667 #endif /* NTOS_MODE_USER */
670 // RTL Query Registry callback
672 #ifdef NTOS_MODE_USER
674 (NTAPI
*PRTL_QUERY_REGISTRY_ROUTINE
)(
675 _In_ PWSTR ValueName
,
676 _In_ ULONG ValueType
,
677 _In_ PVOID ValueData
,
678 _In_ ULONG ValueLength
,
680 _In_ PVOID EntryContext
685 // RTL Secure Memory callbacks
687 #ifdef NTOS_MODE_USER
689 (NTAPI
*PRTL_SECURE_MEMORY_CACHE_CALLBACK
)(
696 // RTL Range List callbacks
698 #ifdef NTOS_MODE_USER
700 (NTAPI
*PRTL_CONFLICT_RANGE_CALLBACK
)(
702 struct _RTL_RANGE
*Range
706 // Custom Heap Commit Routine for RtlCreateHeap
709 (NTAPI
* PRTL_HEAP_COMMIT_ROUTINE
)(
711 _Inout_ PVOID
*CommitAddress
,
712 _Inout_ PSIZE_T CommitSize
716 // Parameters for RtlCreateHeap
718 typedef struct _RTL_HEAP_PARAMETERS
721 SIZE_T SegmentReserve
;
722 SIZE_T SegmentCommit
;
723 SIZE_T DeCommitFreeBlockThreshold
;
724 SIZE_T DeCommitTotalFreeThreshold
;
725 SIZE_T MaximumAllocationSize
;
726 SIZE_T VirtualMemoryThreshold
;
727 SIZE_T InitialCommit
;
728 SIZE_T InitialReserve
;
729 PRTL_HEAP_COMMIT_ROUTINE CommitRoutine
;
731 } RTL_HEAP_PARAMETERS
, *PRTL_HEAP_PARAMETERS
;
734 // RTL Bitmap structures
736 typedef struct _RTL_BITMAP
740 } RTL_BITMAP
, *PRTL_BITMAP
;
742 typedef struct _RTL_BITMAP_RUN
746 } RTL_BITMAP_RUN
, *PRTL_BITMAP_RUN
;
749 // RtlGenerateXxxName context
751 typedef struct _GENERATE_NAME_CONTEXT
754 BOOLEAN CheckSumInserted
;
757 ULONG ExtensionLength
;
758 WCHAR ExtensionBuffer
[4];
759 ULONG LastIndexValue
;
760 } GENERATE_NAME_CONTEXT
, *PGENERATE_NAME_CONTEXT
;
763 // RTL Splay and Balanced Links structures
765 typedef struct _RTL_SPLAY_LINKS
767 struct _RTL_SPLAY_LINKS
*Parent
;
768 struct _RTL_SPLAY_LINKS
*LeftChild
;
769 struct _RTL_SPLAY_LINKS
*RightChild
;
770 } RTL_SPLAY_LINKS
, *PRTL_SPLAY_LINKS
;
772 typedef struct _RTL_BALANCED_LINKS
774 struct _RTL_BALANCED_LINKS
*Parent
;
775 struct _RTL_BALANCED_LINKS
*LeftChild
;
776 struct _RTL_BALANCED_LINKS
*RightChild
;
779 } RTL_BALANCED_LINKS
, *PRTL_BALANCED_LINKS
;
782 // RTL Avl/Generic Tables
784 #ifndef RTL_USE_AVL_TABLES
785 typedef struct _RTL_GENERIC_TABLE
787 PRTL_SPLAY_LINKS TableRoot
;
788 LIST_ENTRY InsertOrderList
;
789 PLIST_ENTRY OrderedPointer
;
790 ULONG WhichOrderedElement
;
791 ULONG NumberGenericTableElements
;
792 PRTL_GENERIC_COMPARE_ROUTINE CompareRoutine
;
793 PRTL_GENERIC_ALLOCATE_ROUTINE AllocateRoutine
;
794 PRTL_GENERIC_FREE_ROUTINE FreeRoutine
;
796 } RTL_GENERIC_TABLE
, *PRTL_GENERIC_TABLE
;
797 #endif /* !RTL_USE_AVL_TABLES */
799 typedef struct _RTL_AVL_TABLE
801 RTL_BALANCED_LINKS BalancedRoot
;
802 PVOID OrderedPointer
;
803 ULONG WhichOrderedElement
;
804 ULONG NumberGenericTableElements
;
806 PRTL_BALANCED_LINKS RestartKey
;
808 PRTL_AVL_COMPARE_ROUTINE CompareRoutine
;
809 PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine
;
810 PRTL_AVL_FREE_ROUTINE FreeRoutine
;
812 } RTL_AVL_TABLE
, *PRTL_AVL_TABLE
;
814 #ifdef RTL_USE_AVL_TABLES
815 #undef RTL_GENERIC_TABLE
816 #undef PRTL_GENERIC_TABLE
818 #define RTL_GENERIC_TABLE RTL_AVL_TABLE
819 #define PRTL_GENERIC_TABLE PRTL_AVL_TABLE
820 #endif /* RTL_USE_AVL_TABLES */
823 // RTL Compression Buffer
825 typedef struct _COMPRESSED_DATA_INFO
{
826 USHORT CompressionFormatAndEngine
;
827 UCHAR CompressionUnitShift
;
831 USHORT NumberOfChunks
;
832 ULONG CompressedChunkSizes
[ANYSIZE_ARRAY
];
833 } COMPRESSED_DATA_INFO
, *PCOMPRESSED_DATA_INFO
;
836 // RtlQueryRegistry Data
838 typedef struct _RTL_QUERY_REGISTRY_TABLE
840 PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine
;
847 } RTL_QUERY_REGISTRY_TABLE
, *PRTL_QUERY_REGISTRY_TABLE
;
850 // RTL Unicode Table Structures
852 typedef struct _UNICODE_PREFIX_TABLE_ENTRY
856 struct _UNICODE_PREFIX_TABLE_ENTRY
*NextPrefixTree
;
857 struct _UNICODE_PREFIX_TABLE_ENTRY
*CaseMatch
;
858 RTL_SPLAY_LINKS Links
;
859 PUNICODE_STRING Prefix
;
860 } UNICODE_PREFIX_TABLE_ENTRY
, *PUNICODE_PREFIX_TABLE_ENTRY
;
862 typedef struct _UNICODE_PREFIX_TABLE
866 PUNICODE_PREFIX_TABLE_ENTRY NextPrefixTree
;
867 PUNICODE_PREFIX_TABLE_ENTRY LastNextEntry
;
868 } UNICODE_PREFIX_TABLE
, *PUNICODE_PREFIX_TABLE
;
871 // Pfx* routines' table structures
873 typedef struct _PREFIX_TABLE_ENTRY
877 struct _PREFIX_TABLE_ENTRY
*NextPrefixTree
;
878 RTL_SPLAY_LINKS Links
;
880 } PREFIX_TABLE_ENTRY
, *PPREFIX_TABLE_ENTRY
;
882 typedef struct _PREFIX_TABLE
886 PPREFIX_TABLE_ENTRY NextPrefixTree
;
887 } PREFIX_TABLE
, *PPREFIX_TABLE
;
890 // Time Structure for RTL Time calls
892 typedef struct _TIME_FIELDS
902 } TIME_FIELDS
, *PTIME_FIELDS
;
905 // Activation Context Frame
907 typedef struct _RTL_ACTIVATION_CONTEXT_STACK_FRAME
909 struct _RTL_ACTIVATION_CONTEXT_STACK_FRAME
*Previous
;
910 PACTIVATION_CONTEXT ActivationContext
;
912 } RTL_ACTIVATION_CONTEXT_STACK_FRAME
, *PRTL_ACTIVATION_CONTEXT_STACK_FRAME
;
914 typedef struct _RTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_BASIC
918 RTL_ACTIVATION_CONTEXT_STACK_FRAME Frame
;
919 } RTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_BASIC
, *PRTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_BASIC
;
921 typedef struct _RTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED
925 RTL_ACTIVATION_CONTEXT_STACK_FRAME Frame
;
930 } RTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED
, *PRTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED
;
932 typedef RTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED RTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME
;
933 typedef PRTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED PRTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME
;
935 typedef struct _RTL_HEAP_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME
937 RTL_ACTIVATION_CONTEXT_STACK_FRAME Frame
;
939 PVOID ActivationStackBackTrace
[8];
940 } RTL_HEAP_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME
, *PRTL_HEAP_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME
;
942 typedef struct _ACTIVATION_CONTEXT_DATA
948 ULONG DefaultTocOffset
;
949 ULONG ExtendedTocOffset
;
950 ULONG AssemblyRosterOffset
;
952 } ACTIVATION_CONTEXT_DATA
, *PACTIVATION_CONTEXT_DATA
;
954 typedef struct _ACTIVATION_CONTEXT_STACK_FRAMELIST
960 ULONG NotFramesInUse
;
961 RTL_HEAP_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME Frames
[32];
962 } ACTIVATION_CONTEXT_STACK_FRAMELIST
, *PACTIVATION_CONTEXT_STACK_FRAMELIST
;
964 #endif /* NTOS_MODE_USER */
966 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
967 typedef struct _ACTIVATION_CONTEXT_STACK
969 struct _RTL_ACTIVATION_CONTEXT_STACK_FRAME
*ActiveFrame
;
970 LIST_ENTRY FrameListCache
;
972 ULONG NextCookieSequenceNumber
;
974 } ACTIVATION_CONTEXT_STACK
, *PACTIVATION_CONTEXT_STACK
;
976 typedef struct _ACTIVATION_CONTEXT_STACK
979 ULONG NextCookieSequenceNumber
;
980 struct _RTL_ACTIVATION_CONTEXT_STACK_FRAME
*ActiveFrame
;
981 LIST_ENTRY FrameListCache
;
982 } ACTIVATION_CONTEXT_STACK
, *PACTIVATION_CONTEXT_STACK
;
991 ACCESS_MASK AccessMask
;
995 // Information Structures for RTL Debug Functions
997 typedef struct _RTL_PROCESS_MODULE_INFORMATION
1004 USHORT LoadOrderIndex
;
1005 USHORT InitOrderIndex
;
1007 USHORT OffsetToFileName
;
1008 CHAR FullPathName
[256];
1009 } RTL_PROCESS_MODULE_INFORMATION
, *PRTL_PROCESS_MODULE_INFORMATION
;
1011 typedef struct _RTL_PROCESS_MODULES
1013 ULONG NumberOfModules
;
1014 RTL_PROCESS_MODULE_INFORMATION Modules
[1];
1015 } RTL_PROCESS_MODULES
, *PRTL_PROCESS_MODULES
;
1017 typedef struct _RTL_PROCESS_MODULE_INFORMATION_EX
1020 RTL_PROCESS_MODULE_INFORMATION BaseInfo
;
1021 ULONG ImageCheckSum
;
1022 ULONG TimeDateStamp
;
1024 } RTL_PROCESS_MODULE_INFORMATION_EX
, *PRTL_PROCESS_MODULE_INFORMATION_EX
;
1026 typedef struct _RTL_HEAP_TAG_INFO
1028 ULONG NumberOfAllocations
;
1029 ULONG NumberOfFrees
;
1030 SIZE_T BytesAllocated
;
1031 } RTL_HEAP_TAG_INFO
, *PRTL_HEAP_TAG_INFO
;
1033 typedef struct _RTL_HEAP_USAGE_ENTRY
1035 struct _RTL_HEAP_USAGE_ENTRY
*Next
;
1038 USHORT AllocatorBackTraceIndex
;
1040 } RTL_HEAP_USAGE_ENTRY
, *PRTL_HEAP_USAGE_ENTRY
;
1042 typedef struct _RTL_HEAP_USAGE
1045 SIZE_T BytesAllocated
;
1046 SIZE_T BytesCommitted
;
1047 SIZE_T BytesReserved
;
1048 SIZE_T BytesReservedMaximum
;
1049 PRTL_HEAP_USAGE_ENTRY Entries
;
1050 PRTL_HEAP_USAGE_ENTRY AddedEntries
;
1051 PRTL_HEAP_USAGE_ENTRY RemovedEntries
;
1052 ULONG_PTR Reserved
[8];
1053 } RTL_HEAP_USAGE
, *PRTL_HEAP_USAGE
;
1055 typedef struct _RTL_HEAP_WALK_ENTRY
1059 UCHAR OverheadBytes
;
1068 USHORT AllocatorBackTraceIndex
;
1073 ULONG_PTR CommittedSize
;
1074 ULONG_PTR UnCommittedSize
;
1079 } RTL_HEAP_WALK_ENTRY
, *PRTL_HEAP_WALK_ENTRY
;
1081 typedef struct _RTL_HEAP_ENTRY
1085 USHORT AllocatorBackTraceIndex
;
1095 SIZE_T CommittedSize
;
1099 } RTL_HEAP_ENTRY
, *PRTL_HEAP_ENTRY
;
1101 typedef struct _RTL_HEAP_TAG
1103 ULONG NumberOfAllocations
;
1104 ULONG NumberOfFrees
;
1105 SIZE_T BytesAllocated
;
1107 USHORT CreatorBackTraceIndex
;
1109 } RTL_HEAP_TAG
, *PRTL_HEAP_TAG
;
1111 typedef struct _RTL_HEAP_INFORMATION
1115 USHORT EntryOverhead
;
1116 USHORT CreatorBackTraceIndex
;
1117 SIZE_T BytesAllocated
;
1118 SIZE_T BytesCommitted
;
1120 ULONG NumberOfEntries
;
1121 ULONG NumberOfPseudoTags
;
1122 ULONG PseudoTagGranularity
;
1125 PRTL_HEAP_ENTRY Entries
;
1126 } RTL_HEAP_INFORMATION
, *PRTL_HEAP_INFORMATION
;
1128 typedef struct _RTL_PROCESS_HEAPS
1130 ULONG NumberOfHeaps
;
1131 RTL_HEAP_INFORMATION Heaps
[1];
1132 } RTL_PROCESS_HEAPS
, *PRTL_PROCESS_HEAPS
;
1134 typedef struct _RTL_PROCESS_LOCK_INFORMATION
1138 USHORT CreatorBackTraceIndex
;
1139 ULONG OwnerThreadId
;
1141 ULONG ContentionCount
;
1143 ULONG RecursionCount
;
1144 ULONG NumberOfSharedWaiters
;
1145 ULONG NumberOfExclusiveWaiters
;
1146 } RTL_PROCESS_LOCK_INFORMATION
, *PRTL_PROCESS_LOCK_INFORMATION
;
1148 typedef struct _RTL_PROCESS_LOCKS
1150 ULONG NumberOfLocks
;
1151 RTL_PROCESS_LOCK_INFORMATION Locks
[1];
1152 } RTL_PROCESS_LOCKS
, *PRTL_PROCESS_LOCKS
;
1154 typedef struct _RTL_PROCESS_BACKTRACE_INFORMATION
1156 PVOID SymbolicBackTrace
;
1160 PVOID BackTrace
[16];
1161 } RTL_PROCESS_BACKTRACE_INFORMATION
, *PRTL_PROCESS_BACKTRACE_INFORMATION
;
1163 typedef struct _RTL_PROCESS_BACKTRACES
1165 ULONG CommittedMemory
;
1166 ULONG ReservedMemory
;
1167 ULONG NumberOfBackTraceLookups
;
1168 ULONG NumberOfBackTraces
;
1169 RTL_PROCESS_BACKTRACE_INFORMATION BackTraces
[1];
1170 } RTL_PROCESS_BACKTRACES
, *PRTL_PROCESS_BACKTRACES
;
1172 typedef struct _RTL_PROCESS_VERIFIER_OPTIONS
1176 UCHAR OptionData
[1];
1178 // Option array continues below
1180 } RTL_PROCESS_VERIFIER_OPTIONS
, *PRTL_PROCESS_VERIFIER_OPTIONS
;
1182 typedef struct _RTL_DEBUG_INFORMATION
1184 HANDLE SectionHandleClient
;
1185 PVOID ViewBaseClient
;
1186 PVOID ViewBaseTarget
;
1187 ULONG ViewBaseDelta
;
1188 HANDLE EventPairClient
;
1189 PVOID EventPairTarget
;
1190 HANDLE TargetProcessId
;
1191 HANDLE TargetThreadHandle
;
1198 PRTL_PROCESS_MODULES Modules
;
1199 PRTL_PROCESS_MODULE_INFORMATION_EX ModulesEx
;
1201 PRTL_PROCESS_BACKTRACES BackTraces
;
1202 PRTL_PROCESS_HEAPS Heaps
;
1203 PRTL_PROCESS_LOCKS Locks
;
1204 HANDLE SpecificHeap
;
1205 HANDLE TargetProcessHandle
;
1206 RTL_PROCESS_VERIFIER_OPTIONS VerifierOptions
;
1208 HANDLE CriticalSectionHandle
;
1209 HANDLE CriticalSectionOwnerThread
;
1211 } RTL_DEBUG_INFORMATION
, *PRTL_DEBUG_INFORMATION
;
1214 // Fiber local storage data
1216 #define RTL_FLS_MAXIMUM_AVAILABLE 128
1217 typedef struct _RTL_FLS_DATA
1219 LIST_ENTRY ListEntry
;
1220 PVOID Data
[RTL_FLS_MAXIMUM_AVAILABLE
];
1221 } RTL_FLS_DATA
, *PRTL_FLS_DATA
;
1225 // Unload Event Trace Structure for RtlGetUnloadEventTrace
1227 typedef struct _RTL_UNLOAD_EVENT_TRACE
1232 ULONG TimeDateStamp
;
1234 WCHAR ImageName
[32];
1235 } RTL_UNLOAD_EVENT_TRACE
, *PRTL_UNLOAD_EVENT_TRACE
;
1238 // RTL Handle Structures
1240 typedef struct _RTL_HANDLE_TABLE_ENTRY
1245 struct _RTL_HANDLE_TABLE_ENTRY
*NextFree
;
1247 } RTL_HANDLE_TABLE_ENTRY
, *PRTL_HANDLE_TABLE_ENTRY
;
1249 typedef struct _RTL_HANDLE_TABLE
1251 ULONG MaximumNumberOfHandles
;
1252 ULONG SizeOfHandleTableEntry
;
1254 PRTL_HANDLE_TABLE_ENTRY FreeHandles
;
1255 PRTL_HANDLE_TABLE_ENTRY CommittedHandles
;
1256 PRTL_HANDLE_TABLE_ENTRY UnCommittedHandles
;
1257 PRTL_HANDLE_TABLE_ENTRY MaxReservedHandles
;
1258 } RTL_HANDLE_TABLE
, *PRTL_HANDLE_TABLE
;
1261 // RTL Boot Status Data Item
1263 typedef struct _RTL_BSD_ITEM
1265 RTL_BSD_ITEM_TYPE Type
;
1268 } RTL_BSD_ITEM
, *PRTL_BSD_ITEM
;
1271 // Data Sub-Structures for "bootstat.dat" RTL Data File
1273 typedef struct _RTL_BSD_DATA_POWER_TRANSITION
1275 LARGE_INTEGER PowerButtonTimestamp
;
1278 UCHAR SystemRunning
: 1;
1279 UCHAR ConnectedStandbyInProgress
: 1;
1280 UCHAR UserShutdownInProgress
: 1;
1281 UCHAR SystemShutdownInProgress
: 1;
1282 UCHAR SleepInProgress
: 4;
1284 UCHAR ConnectedStandbyScenarioInstanceId
;
1285 UCHAR ConnectedStandbyEntryReason
;
1286 UCHAR ConnectedStandbyExitReason
;
1287 USHORT SystemSleepTransitionCount
;
1288 LARGE_INTEGER LastReferenceTime
;
1289 ULONG LastReferenceTimeChecksum
;
1290 ULONG LastUpdateBootId
;
1291 } RTL_BSD_DATA_POWER_TRANSITION
, *PRTL_BSD_DATA_POWER_TRANSITION
;
1293 typedef struct _RTL_BSD_DATA_ERROR_INFO
1297 ULONG OtherErrorCount
;
1299 ULONG OtherErrorCount2
;
1300 } RTL_BSD_DATA_ERROR_INFO
, *PRTL_BSD_DATA_ERROR_INFO
;
1302 typedef struct _RTL_BSD_POWER_BUTTON_PRESS_INFO
1304 LARGE_INTEGER LastPressTime
;
1305 ULONG CumulativePressCount
;
1306 USHORT LastPressBootId
;
1307 UCHAR LastPowerWatchdogStage
;
1310 UCHAR WatchdogArmed
: 1;
1311 UCHAR ShutdownInProgress
: 1;
1313 LARGE_INTEGER LastReleaseTime
;
1314 ULONG CumulativeReleaseCount
;
1315 USHORT LastReleaseBootId
;
1317 UCHAR CurrentConnectedStandbyPhase
;
1318 ULONG TransitionLatestCheckpointId
;
1319 ULONG TransitionLatestCheckpointType
;
1320 ULONG TransitionLatestCheckpointSequenceNumber
;
1321 } RTL_BSD_POWER_BUTTON_PRESS_INFO
, *PRTL_BSD_POWER_BUTTON_PRESS_INFO
;
1324 // Main Structure for "bootstat.dat" RTL Data File
1326 typedef struct _RTL_BSD_DATA
1328 ULONG Version
; // RtlBsdItemVersionNumber
1329 ULONG ProductType
; // RtlBsdItemProductType
1330 BOOLEAN AabEnabled
; // RtlBsdItemAabEnabled
1331 UCHAR AabTimeout
; // RtlBsdItemAabTimeout
1332 BOOLEAN LastBootSucceeded
; // RtlBsdItemBootGood
1333 BOOLEAN LastBootShutdown
; // RtlBsdItemBootShutdown
1334 BOOLEAN SleepInProgress
; // RtlBsdSleepInProgress
1335 RTL_BSD_DATA_POWER_TRANSITION PowerTransition
; // RtlBsdPowerTransition
1336 UCHAR BootAttemptCount
; // RtlBsdItemBootAttemptCount
1337 UCHAR LastBootCheckpoint
; // RtlBsdItemBootCheckpoint
1338 UCHAR Checksum
; // RtlBsdItemChecksum
1339 ULONG LastBootId
; // RtlBsdItemBootId
1340 ULONG LastSuccessfulShutdownBootId
; // RtlBsdItemShutdownBootId
1341 ULONG LastReportedAbnormalShutdownBootId
; // RtlBsdItemReportedAbnormalShutdownBootId
1342 RTL_BSD_DATA_ERROR_INFO ErrorInfo
; // RtlBsdItemErrorInfo
1343 RTL_BSD_POWER_BUTTON_PRESS_INFO PowerButtonPressInfo
; // RtlBsdItemPowerButtonPressInfo
1344 } RTL_BSD_DATA
, *PRTL_BSD_DATA
;
1346 #ifdef NTOS_MODE_USER
1350 typedef struct _EXCEPTION_REGISTRATION_RECORD
1352 struct _EXCEPTION_REGISTRATION_RECORD
*Next
;
1353 PEXCEPTION_ROUTINE Handler
;
1354 } EXCEPTION_REGISTRATION_RECORD
, *PEXCEPTION_REGISTRATION_RECORD
;
1355 #endif /* NTOS_MODE_USER */
1358 // Current Directory Structures
1360 typedef struct _CURDIR
1362 UNICODE_STRING DosPath
;
1366 typedef struct _RTLP_CURDIR_REF
1370 } RTLP_CURDIR_REF
, *PRTLP_CURDIR_REF
;
1372 typedef struct _RTL_RELATIVE_NAME_U
1374 UNICODE_STRING RelativeName
;
1375 HANDLE ContainingDirectory
;
1376 PRTLP_CURDIR_REF CurDirRef
;
1377 } RTL_RELATIVE_NAME_U
, *PRTL_RELATIVE_NAME_U
;
1379 typedef struct _RTL_DRIVE_LETTER_CURDIR
1384 UNICODE_STRING DosPath
;
1385 } RTL_DRIVE_LETTER_CURDIR
, *PRTL_DRIVE_LETTER_CURDIR
;
1387 typedef struct _RTL_PERTHREAD_CURDIR
1389 PRTL_DRIVE_LETTER_CURDIR CurrentDirectories
;
1390 PUNICODE_STRING ImageName
;
1392 } RTL_PERTHREAD_CURDIR
, *PRTL_PERTHREAD_CURDIR
;
1395 // Private State structure for RtlAcquirePrivilege/RtlReleasePrivilege
1397 typedef struct _RTL_ACQUIRE_STATE
1400 HANDLE OldImpersonationToken
;
1401 PTOKEN_PRIVILEGES OldPrivileges
;
1402 PTOKEN_PRIVILEGES NewPrivileges
;
1404 UCHAR OldPrivBuffer
[1024];
1405 } RTL_ACQUIRE_STATE
, *PRTL_ACQUIRE_STATE
;
1407 #ifndef NTOS_MODE_USER
1410 // RTL Critical Section Structures
1412 typedef struct _RTL_CRITICAL_SECTION_DEBUG
1415 USHORT CreatorBackTraceIndex
;
1416 struct _RTL_CRITICAL_SECTION
*CriticalSection
;
1417 LIST_ENTRY ProcessLocksList
;
1419 ULONG ContentionCount
;
1421 } RTL_CRITICAL_SECTION_DEBUG
, *PRTL_CRITICAL_SECTION_DEBUG
, RTL_RESOURCE_DEBUG
, *PRTL_RESOURCE_DEBUG
;
1423 typedef struct _RTL_CRITICAL_SECTION
1425 PRTL_CRITICAL_SECTION_DEBUG DebugInfo
;
1427 LONG RecursionCount
;
1428 HANDLE OwningThread
;
1429 HANDLE LockSemaphore
;
1430 ULONG_PTR SpinCount
;
1431 } RTL_CRITICAL_SECTION
, *PRTL_CRITICAL_SECTION
;
1433 #endif /* !NTOS_MODE_USER */
1436 // RTL Private Heap Structures
1438 typedef struct _HEAP_LOCK
1442 RTL_CRITICAL_SECTION CriticalSection
;
1443 #ifndef NTOS_MODE_USER
1446 UCHAR Padding
[0x68]; /* Max ERESOURCE size for x64 build. Needed because RTL is built only once */
1448 } HEAP_LOCK
, *PHEAP_LOCK
;
1451 // RTL Range List Structures
1453 typedef struct _RTL_RANGE_LIST
1455 LIST_ENTRY ListHead
;
1459 } RTL_RANGE_LIST
, *PRTL_RANGE_LIST
;
1461 typedef struct _RTL_RANGE
1469 } RTL_RANGE
, *PRTL_RANGE
;
1471 typedef struct _RANGE_LIST_ITERATOR
1473 PLIST_ENTRY RangeListHead
;
1474 PLIST_ENTRY MergedHead
;
1477 } RTL_RANGE_LIST_ITERATOR
, *PRTL_RANGE_LIST_ITERATOR
;
1482 #define RTL_RESOURCE_FLAG_LONG_TERM ((ULONG)0x00000001)
1484 typedef struct _RTL_RESOURCE
1486 RTL_CRITICAL_SECTION Lock
;
1487 HANDLE SharedSemaphore
;
1488 ULONG SharedWaiters
;
1489 HANDLE ExclusiveSemaphore
;
1490 ULONG ExclusiveWaiters
;
1492 HANDLE OwningThread
;
1495 } RTL_RESOURCE
, *PRTL_RESOURCE
;
1498 // Structures for RtlCreateUserProcess
1500 typedef struct _RTL_USER_PROCESS_PARAMETERS
1502 ULONG MaximumLength
;
1506 HANDLE ConsoleHandle
;
1508 HANDLE StandardInput
;
1509 HANDLE StandardOutput
;
1510 HANDLE StandardError
;
1511 CURDIR CurrentDirectory
;
1512 UNICODE_STRING DllPath
;
1513 UNICODE_STRING ImagePathName
;
1514 UNICODE_STRING CommandLine
;
1522 ULONG FillAttribute
;
1524 ULONG ShowWindowFlags
;
1525 UNICODE_STRING WindowTitle
;
1526 UNICODE_STRING DesktopInfo
;
1527 UNICODE_STRING ShellInfo
;
1528 UNICODE_STRING RuntimeData
;
1529 RTL_DRIVE_LETTER_CURDIR CurrentDirectories
[RTL_MAX_DRIVE_LETTERS
];
1530 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
1531 SIZE_T EnvironmentSize
;
1533 #if (NTDDI_VERSION >= NTDDI_WIN7)
1534 SIZE_T EnvironmentVersion
;
1536 } RTL_USER_PROCESS_PARAMETERS
, *PRTL_USER_PROCESS_PARAMETERS
;
1538 typedef struct _RTL_USER_PROCESS_INFORMATION
1541 HANDLE ProcessHandle
;
1542 HANDLE ThreadHandle
;
1544 SECTION_IMAGE_INFORMATION ImageInformation
;
1545 } RTL_USER_PROCESS_INFORMATION
, *PRTL_USER_PROCESS_INFORMATION
;
1547 #if (NTDDI_VERSION >= NTDDI_WIN7)
1549 typedef enum _RTL_UMS_SCHEDULER_REASON
1551 UmsSchedulerStartup
= 0,
1552 UmsSchedulerThreadBlocked
= 1,
1553 UmsSchedulerThreadYield
= 2,
1554 } RTL_UMS_SCHEDULER_REASON
, *PRTL_UMS_SCHEDULER_REASON
;
1556 typedef enum _RTL_UMSCTX_FLAGS
1558 UMSCTX_SCHEDULED_THREAD_BIT
= 0,
1559 #if (NTDDI_VERSION < NTDDI_WIN8)
1560 UMSCTX_HAS_QUANTUM_REQ_BIT
,
1561 UMSCTX_HAS_AFFINITY_REQ_BIT
,
1562 UMSCTX_HAS_PRIORITY_REQ_BIT
,
1564 UMSCTX_SUSPENDED_BIT
,
1565 UMSCTX_VOLATILE_CONTEXT_BIT
,
1566 UMSCTX_TERMINATED_BIT
,
1567 UMSCTX_DEBUG_ACTIVE_BIT
,
1568 UMSCTX_RUNNING_ON_SELF_THREAD_BIT
,
1569 UMSCTX_DENY_RUNNING_ON_SELF_THREAD_BIT
1571 } RTL_UMSCTX_FLAGS
, *PRTL_UMSCTX_FLAGS
;
1573 #define UMSCTX_SCHEDULED_THREAD_MASK (1 << UMSCTX_SCHEDULED_THREAD_BIT)
1574 #define UMSCTX_SUSPENDED_MASK (1 << UMSCTX_SUSPENDED_BIT)
1575 #define UMSCTX_VOLATILE_CONTEXT_MASK (1 << UMSCTX_VOLATILE_CONTEXT_BIT)
1576 #define UMSCTX_TERMINATED_MASK (1 << UMSCTX_TERMINATED_BIT)
1577 #define UMSCTX_DEBUG_ACTIVE_MASK (1 << UMSCTX_DEBUG_ACTIVE_BIT)
1578 #define UMSCTX_RUNNING_ON_SELF_THREAD_MASK (1 << UMSCTX_RUNNING_ON_SELF_THREAD_BIT)
1579 #define UMSCTX_DENY_RUNNING_ON_SELF_THREAD_MASK (1 << UMSCTX_DENY_RUNNING_ON_SELF_THREAD_BIT)
1584 typedef struct DECLSPEC_ALIGN(16) _RTL_UMS_CONTEXT
1586 SINGLE_LIST_ENTRY Link
;
1594 ULONG ScheduledThread
: 1;
1595 #if (NTDDI_VERSION < NTDDI_WIN8)
1596 ULONG HasQuantumReq
: 1;
1597 ULONG HasAffinityReq
: 1;
1598 ULONG HasPriorityReq
: 1;
1600 ULONG Suspended
: 1;
1601 ULONG VolatileContext
: 1;
1602 ULONG Terminated
: 1;
1603 ULONG DebugActive
: 1;
1604 ULONG RunningOnSelfThread
: 1;
1605 ULONG DenyRunningOnSelfThread
: 1;
1606 #if (NTDDI_VERSION < NTDDI_WIN8)
1607 ULONG ReservedFlags
: 22;
1616 #if (NTDDI_VERSION >= NTDDI_WIN8)
1617 ULONG64 KernelUpdateLock
: 2;
1619 ULONG64 KernelUpdateLock
: 1;
1620 ULONG64 Reserved
: 1;
1622 ULONG64 PrimaryClientID
: 62;
1624 ULONG64 ContextLock
;
1626 #if (NTDDI_VERSION < NTDDI_WIN8)
1627 ULONG64 QuantumValue
;
1628 GROUP_AFFINITY AffinityMask
;
1631 struct _RTL_UMS_CONTEXT
* PrimaryUmsContext
;
1633 ULONG KernelYieldCount
;
1634 ULONG MixedYieldCount
;
1636 } RTL_UMS_CONTEXT
, *PRTL_UMS_CONTEXT
;
1637 #endif // #if (NTDDI_VERSION >= NTDDI_WIN7)
1640 // RTL Atom Table Structures
1642 typedef struct _RTL_ATOM_TABLE_ENTRY
1644 struct _RTL_ATOM_TABLE_ENTRY
*HashLink
;
1647 USHORT ReferenceCount
;
1651 } RTL_ATOM_TABLE_ENTRY
, *PRTL_ATOM_TABLE_ENTRY
;
1653 typedef struct _RTL_ATOM_TABLE
1658 #ifdef NTOS_MODE_USER
1659 RTL_CRITICAL_SECTION CriticalSection
;
1661 FAST_MUTEX FastMutex
;
1666 #ifdef NTOS_MODE_USER
1667 RTL_HANDLE_TABLE RtlHandleTable
;
1669 PHANDLE_TABLE ExHandleTable
;
1672 ULONG NumberOfBuckets
;
1673 PRTL_ATOM_TABLE_ENTRY Buckets
[1];
1674 } RTL_ATOM_TABLE
, *PRTL_ATOM_TABLE
;
1677 // Timezone Information
1679 typedef struct _RTL_TIME_ZONE_INFORMATION
1682 WCHAR StandardName
[32];
1683 TIME_FIELDS StandardDate
;
1685 WCHAR DaylightName
[32];
1686 TIME_FIELDS DaylightDate
;
1688 } RTL_TIME_ZONE_INFORMATION
, *PRTL_TIME_ZONE_INFORMATION
;
1693 typedef struct _RTL_PATCH_HEADER
1695 LIST_ENTRY PatchList
;
1696 PVOID PatchImageBase
;
1697 struct _RTL_PATCH_HEADER
*NextPath
;
1700 struct _HOTPATCH_HEADER
*HotpatchHeader
;
1701 UNICODE_STRING TargetDllName
;
1702 PVOID TargetDllBase
;
1703 PLDR_DATA_TABLE_ENTRY TargetLdrDataTableEntry
;
1704 PLDR_DATA_TABLE_ENTRY PatchLdrDataTableEntry
;
1705 struct _SYSTEM_HOTPATCH_CODE_INFORMATION
*CodeInfo
;
1706 } RTL_PATCH_HEADER
, *PRTL_PATCH_HEADER
;
1709 // Header for NLS Files
1711 typedef struct _NLS_FILE_HEADER
1715 USHORT MaximumCharacterSize
;
1717 USHORT UniDefaultChar
;
1718 USHORT TransDefaultChar
;
1719 USHORT TransUniDefaultChar
;
1720 UCHAR LeadByte
[MAXIMUM_LEADBYTES
];
1721 } NLS_FILE_HEADER
, *PNLS_FILE_HEADER
;
1726 typedef struct _RTL_STACK_TRACE_ENTRY
1728 struct _RTL_STACK_TRACE_ENTRY
*HashChain
;
1732 PVOID BackTrace
[32];
1733 } RTL_STACK_TRACE_ENTRY
, *PRTL_STACK_TRACE_ENTRY
;
1735 typedef struct _STACK_TRACE_DATABASE
1737 RTL_CRITICAL_SECTION CriticalSection
;
1738 } STACK_TRACE_DATABASE
, *PSTACK_TRACE_DATABASE
;
1744 typedef ULONG (NTAPI
*RTL_TRACE_HASH_FUNCTION
) (ULONG Count
, PVOID
*Trace
);
1746 typedef struct _RTL_TRACE_BLOCK
1754 struct _RTL_TRACE_BLOCK
*Next
;
1756 } RTL_TRACE_BLOCK
, *PRTL_TRACE_BLOCK
;
1758 typedef struct _RTL_TRACE_DATABASE
1763 struct _RTL_TRACE_SEGMENT
*SegmentList
;
1767 #ifdef NTOS_MODE_USER
1768 RTL_CRITICAL_SECTION Lock
;
1772 KSPIN_LOCK SpinLock
;
1773 FAST_MUTEX FastMutex
;
1777 struct _RTL_TRACE_BLOCK
**Buckets
;
1778 RTL_TRACE_HASH_FUNCTION HashFunction
;
1781 ULONG HashCounter
[16];
1782 } RTL_TRACE_DATABASE
, *PRTL_TRACE_DATABASE
;
1784 typedef struct _RTL_TRACE_SEGMENT
1787 struct _RTL_TRACE_DATABASE
*Database
;
1788 struct _RTL_TRACE_SEGMENT
*NextSegment
;
1793 } RTL_TRACE_SEGMENT
, *PRTL_TRACE_SEGMENT
;
1795 typedef struct _RTL_TRACE_ENUMERATE
1797 struct _RTL_TRACE_DATABASE
*Database
;
1799 struct _RTL_TRACE_BLOCK
*Block
;
1800 } RTL_TRACE_ENUMERATE
, * PRTL_TRACE_ENUMERATE
;
1803 // Auto-Managed Rtl* String Buffer
1805 typedef struct _RTL_BUFFER
1808 PUCHAR StaticBuffer
;
1811 SIZE_T ReservedForAllocatedSize
;
1812 PVOID ReservedForIMalloc
;
1813 } RTL_BUFFER
, *PRTL_BUFFER
;
1815 typedef struct _RTL_UNICODE_STRING_BUFFER
1817 UNICODE_STRING String
;
1818 RTL_BUFFER ByteBuffer
;
1819 WCHAR MinimumStaticBufferForTerminalNul
;
1820 } RTL_UNICODE_STRING_BUFFER
, *PRTL_UNICODE_STRING_BUFFER
;
1822 #ifndef NTOS_MODE_USER
1825 // Message Resource Entry, Block and Data
1827 typedef struct _MESSAGE_RESOURCE_ENTRY
1831 UCHAR Text
[ANYSIZE_ARRAY
];
1832 } MESSAGE_RESOURCE_ENTRY
, *PMESSAGE_RESOURCE_ENTRY
;
1834 typedef struct _MESSAGE_RESOURCE_BLOCK
1838 ULONG OffsetToEntries
;
1839 } MESSAGE_RESOURCE_BLOCK
, *PMESSAGE_RESOURCE_BLOCK
;
1841 typedef struct _MESSAGE_RESOURCE_DATA
1843 ULONG NumberOfBlocks
;
1844 MESSAGE_RESOURCE_BLOCK Blocks
[ANYSIZE_ARRAY
];
1845 } MESSAGE_RESOURCE_DATA
, *PMESSAGE_RESOURCE_DATA
;
1847 #endif /* !NTOS_MODE_USER */
1849 #ifdef NTOS_MODE_USER
1856 #define CONST_VTBL const
1866 typedef struct _RTL_MEMORY_STREAM RTL_MEMORY_STREAM
, *PRTL_MEMORY_STREAM
;
1869 (NTAPI
*PRTL_MEMORY_STREAM_FINAL_RELEASE_ROUTINE
)(
1870 _In_ PRTL_MEMORY_STREAM Stream
1873 struct _RTL_MEMORY_STREAM
1875 CONST_VTBL
struct IStreamVtbl
*Vtbl
;
1881 PRTL_MEMORY_STREAM_FINAL_RELEASE_ROUTINE FinalRelease
;
1882 HANDLE ProcessHandle
;
1885 #endif /* NTOS_MODE_USER */
1891 #endif /* !_RTLTYPES_H */