[BASESRV-CONSRV-WINSRV]
[reactos.git] / include / ndk / rtltypes.h
1 /*++ NDK Version: 0098
2
3 Copyright (c) Alex Ionescu. All rights reserved.
4
5 Header Name:
6
7 rtltypes.h
8
9 Abstract:
10
11 Type 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 _RTLTYPES_H
20 #define _RTLTYPES_H
21
22 //
23 // Dependencies
24 //
25 #include <umtypes.h>
26 #include <mmtypes.h>
27 #include <ldrtypes.h>
28
29 //
30 // Maximum Atom Length
31 //
32 #define RTL_MAXIMUM_ATOM_LENGTH 255
33
34 //
35 // Process Parameters Flags
36 //
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
52
53 #define RTL_MAX_DRIVE_LETTERS 32
54 #define RTL_DRIVE_LETTER_VALID (USHORT)0x0001
55
56 //
57 // End of Exception List
58 //
59 #define EXCEPTION_CHAIN_END ((PEXCEPTION_REGISTRATION_RECORD)-1)
60
61 //
62 // Range and Range List Flags
63 //
64 #define RTL_RANGE_LIST_ADD_IF_CONFLICT 0x00000001
65 #define RTL_RANGE_LIST_ADD_SHARED 0x00000002
66
67 #define RTL_RANGE_SHARED 0x01
68 #define RTL_RANGE_CONFLICT 0x02
69
70 //
71 // Activation Context Frame Flags
72 //
73 #define RTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_FORMAT_WHISTLER \
74 0x1
75
76 //
77 // RtlActivateActivationContextEx Flags
78 //
79 #define RTL_ACTIVATE_ACTIVATION_CONTEXT_EX_FLAG_RELEASE_ON_STACK_DEALLOCATION \
80 0x1
81
82 //
83 // Public Heap Flags
84 //
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
97 #endif
98
99 //
100 // User-Defined Heap Flags and Classes
101 //
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
117
118 //
119 // Internal HEAP Structure Flags
120 //
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
130
131 //
132 // Heap Validation Flags
133 //
134 #define HEAP_CREATE_VALID_MASK \
135 (HEAP_NO_SERIALIZE | \
136 HEAP_GROWABLE | \
137 HEAP_GENERATE_EXCEPTIONS | \
138 HEAP_ZERO_MEMORY | \
139 HEAP_REALLOC_IN_PLACE_ONLY | \
140 HEAP_TAIL_CHECKING_ENABLED | \
141 HEAP_FREE_CHECKING_ENABLED | \
142 HEAP_DISABLE_COALESCE_ON_FREE | \
143 HEAP_CLASS_MASK | \
144 HEAP_CREATE_ALIGN_16 | \
145 HEAP_CREATE_ENABLE_TRACING | \
146 HEAP_CREATE_ENABLE_EXECUTE)
147 #ifdef C_ASSERT
148 C_ASSERT(HEAP_CREATE_VALID_MASK == 0x0007F0FF);
149 #endif
150
151 //
152 // Native image architecture
153 //
154 #if defined(_M_IX86)
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
160 #else
161 #error Define these please!
162 #endif
163
164 //
165 // Registry Keys
166 //
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
183
184 //
185 // Versioning
186 //
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
198 #define VER_EQUAL 1
199 #define VER_GREATER 2
200 #define VER_GREATER_EQUAL 3
201 #define VER_LESS 4
202 #define VER_LESS_EQUAL 5
203 #define VER_AND 6
204 #define VER_OR 7
205 #define VER_CONDITION_MASK 7
206 #define VER_NUM_BITS_PER_CONDITION_MASK 3
207
208 //
209 // Timezone IDs
210 //
211 #define TIME_ZONE_ID_UNKNOWN 0
212 #define TIME_ZONE_ID_STANDARD 1
213 #define TIME_ZONE_ID_DAYLIGHT 2
214
215 //
216 // Maximum Path Length
217 //
218 #define MAX_PATH 260
219
220 //
221 // RTL Lock Type (Critical Section or Resource)
222 //
223 #define RTL_CRITSECT_TYPE 0
224 #define RTL_RESOURCE_TYPE 1
225
226 //
227 // RtlAcquirePrivileges Flags
228 //
229 #define RTL_ACQUIRE_PRIVILEGE_IMPERSONATE 1
230 #define RTL_ACQUIRE_PRIVILEGE_PROCESS 2
231
232 #ifdef NTOS_MODE_USER
233
234 //
235 // String Hash Algorithms
236 //
237 #define HASH_STRING_ALGORITHM_DEFAULT 0
238 #define HASH_STRING_ALGORITHM_X65599 1
239 #define HASH_STRING_ALGORITHM_INVALID 0xffffffff
240
241 //
242 // RtlDuplicateString Flags
243 //
244 #define RTL_DUPLICATE_UNICODE_STRING_NULL_TERMINATE 1
245 #define RTL_DUPLICATE_UNICODE_STRING_ALLOCATE_NULL_STRING 2
246
247 //
248 // RtlFindCharInUnicodeString Flags
249 //
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
253
254 //
255 // RtlImageNtHeaderEx Flags
256 //
257 #define RTL_IMAGE_NT_HEADER_EX_FLAG_NO_RANGE_CHECK 0x00000001
258
259 //
260 // RtlDosApplyFileIsolationRedirection_Ustr Flags
261 //
262 #define RTL_DOS_APPLY_FILE_REDIRECTION_USTR_FLAG_RESPECT_DOT_LOCAL 0x01
263
264 //
265 // Codepages
266 //
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
270
271 //
272 // Activation Contexts
273 //
274 #define INVALID_ACTIVATION_CONTEXT (PVOID)0xFFFFFFFF
275
276 //
277 // C++ CONST casting
278 //
279 #if defined(__cplusplus)
280 #define RTL_CONST_CAST(type) const_cast<type>
281 #else
282 #define RTL_CONST_CAST(type) (type)
283 #endif
284
285 //
286 // Constant String Macro
287 //
288 #define RTL_CONSTANT_STRING(__SOURCE_STRING__) \
289 { \
290 sizeof(__SOURCE_STRING__) - sizeof((__SOURCE_STRING__)[0]), \
291 sizeof(__SOURCE_STRING__), \
292 (__SOURCE_STRING__) \
293 }
294
295 //
296 // Constant Object Attributes Macro
297 //
298 #define RTL_CONSTANT_OBJECT_ATTRIBUTES(n, a) \
299 { \
300 sizeof(OBJECT_ATTRIBUTES), \
301 NULL, \
302 RTL_CONST_CAST(PUNICODE_STRING)(n), \
303 a, \
304 NULL, \
305 NULL \
306 }
307
308 #define RTL_INIT_OBJECT_ATTRIBUTES(n, a) \
309 RTL_CONSTANT_OBJECT_ATTRIBUTES(n, a)
310
311 #else /* NTOS_MODE_USER */
312 //
313 // Message Resource Flag
314 //
315 #define MESSAGE_RESOURCE_UNICODE 0x0001
316
317 #endif /* !NTOS_MODE_USER */
318 #define MAXIMUM_LEADBYTES 12
319
320 //
321 // RTL Debug Queries
322 //
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
329
330 //
331 // RTL Handle Flags
332 //
333 #define RTL_HANDLE_VALID 0x1
334
335 //
336 // RTL Atom Flags
337 //
338 #define RTL_ATOM_IS_PINNED 0x1
339
340 //
341 // Critical section lock bits
342 //
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
347
348 //
349 // Codepage Tags
350 //
351 #ifdef NTOS_MODE_USER
352 extern BOOLEAN NTSYSAPI NLS_MB_CODE_PAGE_TAG;
353 extern BOOLEAN NTSYSAPI NLS_MB_OEM_CODE_PAGE_TAG;
354
355 //
356 // Constant String Macro
357 //
358 #define RTL_CONSTANT_STRING(__SOURCE_STRING__) \
359 { \
360 sizeof(__SOURCE_STRING__) - sizeof((__SOURCE_STRING__)[0]), \
361 sizeof(__SOURCE_STRING__), \
362 (__SOURCE_STRING__) \
363 }
364
365 #endif /* NTOS_MODE_USER */
366
367 #ifdef NTOS_MODE_USER
368
369 //
370 // Boot Status Data Field Types
371 //
372 typedef enum _RTL_BSD_ITEM_TYPE
373 {
374 RtlBsdItemVersionNumber,
375 RtlBsdItemProductType,
376 RtlBsdItemAabEnabled,
377 RtlBsdItemAabTimeout,
378 RtlBsdItemBootGood,
379 RtlBsdItemBootShutdown,
380 RtlBsdItemMax
381 } RTL_BSD_ITEM_TYPE, *PRTL_BSD_ITEM_TYPE;
382
383 //
384 // Table and Compare result types
385 //
386 typedef enum _TABLE_SEARCH_RESULT
387 {
388 TableEmptyTree,
389 TableFoundNode,
390 TableInsertAsLeft,
391 TableInsertAsRight
392 } TABLE_SEARCH_RESULT;
393
394 typedef enum _RTL_GENERIC_COMPARE_RESULTS
395 {
396 GenericLessThan,
397 GenericGreaterThan,
398 GenericEqual
399 } RTL_GENERIC_COMPARE_RESULTS;
400
401 #endif /* NTOS_MODE_USER */
402
403 //
404 // RTL Path Types
405 //
406 typedef enum _RTL_PATH_TYPE
407 {
408 RtlPathTypeUnknown,
409 RtlPathTypeUncAbsolute,
410 RtlPathTypeDriveAbsolute,
411 RtlPathTypeDriveRelative,
412 RtlPathTypeRooted,
413 RtlPathTypeRelative,
414 RtlPathTypeLocalDevice,
415 RtlPathTypeRootLocalDevice,
416 } RTL_PATH_TYPE;
417
418 #ifndef NTOS_MODE_USER
419
420 //
421 // Heap Information Class
422 //
423 typedef enum _HEAP_INFORMATION_CLASS
424 {
425 HeapCompatibilityInformation,
426 HeapEnableTerminationOnCorruption
427 } HEAP_INFORMATION_CLASS;
428
429 //
430 // Callback function for RTL Timers or Registered Waits
431 //
432 typedef VOID
433 (NTAPI *WAITORTIMERCALLBACKFUNC)(
434 PVOID pvContext,
435 BOOLEAN fTimerOrWaitFired
436 );
437
438 //
439 // Handler during Vectored RTL Exceptions
440 //
441 typedef LONG
442 (NTAPI *PVECTORED_EXCEPTION_HANDLER)(
443 PEXCEPTION_POINTERS ExceptionPointers
444 );
445
446 //
447 // Worker Thread Callback for Rtl
448 //
449 typedef VOID
450 (NTAPI *WORKERCALLBACKFUNC)(
451 _In_ PVOID Context
452 );
453
454 #else /* !NTOS_MODE_USER */
455
456 //
457 // RTL Library Allocation/Free Routines
458 //
459 typedef PVOID
460 (NTAPI *PRTL_ALLOCATE_STRING_ROUTINE)(
461 SIZE_T NumberOfBytes
462 );
463
464 typedef PVOID
465 (NTAPI *PRTL_REALLOCATE_STRING_ROUTINE)(
466 SIZE_T NumberOfBytes,
467 PVOID Buffer
468 );
469
470 typedef
471 VOID
472 (NTAPI *PRTL_FREE_STRING_ROUTINE)(
473 PVOID Buffer
474 );
475
476 extern const PRTL_ALLOCATE_STRING_ROUTINE RtlAllocateStringRoutine;
477 extern const PRTL_FREE_STRING_ROUTINE RtlFreeStringRoutine;
478 extern const PRTL_REALLOCATE_STRING_ROUTINE RtlReallocateStringRoutine;
479
480 #endif /* NTOS_MODE_USER */
481
482 //
483 // Unhandled Exception Filter
484 //
485 typedef ULONG
486 (NTAPI *RTLP_UNHANDLED_EXCEPTION_FILTER)(
487 _In_ struct _EXCEPTION_POINTERS *ExceptionInfo
488 );
489 typedef RTLP_UNHANDLED_EXCEPTION_FILTER *PRTLP_UNHANDLED_EXCEPTION_FILTER;
490
491 //
492 // Callback for RTL Heap Enumeration
493 //
494 typedef NTSTATUS
495 (NTAPI *PHEAP_ENUMERATION_ROUTINE)(
496 _In_ PVOID HeapHandle,
497 _In_ PVOID UserParam
498 );
499
500 //
501 // Thread and Process Start Routines for RtlCreateUserThread/Process
502 //
503 typedef ULONG (NTAPI *PTHREAD_START_ROUTINE)(
504 PVOID Parameter
505 );
506
507 typedef VOID
508 (NTAPI *PRTL_BASE_PROCESS_START_ROUTINE)(
509 PTHREAD_START_ROUTINE StartAddress,
510 PVOID Parameter
511 );
512
513 //
514 // Worker Start/Exit Function
515 //
516 typedef NTSTATUS
517 (NTAPI *PRTL_START_POOL_THREAD)(
518 _In_ PTHREAD_START_ROUTINE Function,
519 _In_ PVOID Parameter,
520 _Out_ PHANDLE ThreadHandle
521 );
522
523 typedef NTSTATUS
524 (NTAPI *PRTL_EXIT_POOL_THREAD)(
525 _In_ NTSTATUS ExitStatus
526 );
527
528 //
529 // Declare empty structure definitions so that they may be referenced by
530 // routines before they are defined
531 //
532 struct _RTL_AVL_TABLE;
533 struct _RTL_GENERIC_TABLE;
534 struct _RTL_RANGE;
535
536 //
537 // Routines and callbacks for the RTL AVL/Generic Table package
538 //
539 #ifdef NTOS_MODE_USER
540 typedef NTSTATUS
541 (NTAPI RTL_AVL_MATCH_FUNCTION)(
542 struct _RTL_AVL_TABLE *Table,
543 PVOID UserData,
544 PVOID MatchData
545 );
546 typedef RTL_AVL_MATCH_FUNCTION *PRTL_AVL_MATCH_FUNCTION;
547
548 typedef RTL_GENERIC_COMPARE_RESULTS
549 (NTAPI RTL_AVL_COMPARE_ROUTINE) (
550 struct _RTL_AVL_TABLE *Table,
551 PVOID FirstStruct,
552 PVOID SecondStruct
553 );
554 typedef RTL_AVL_COMPARE_ROUTINE *PRTL_AVL_COMPARE_ROUTINE;
555
556 typedef RTL_GENERIC_COMPARE_RESULTS
557 (NTAPI RTL_GENERIC_COMPARE_ROUTINE) (
558 struct _RTL_GENERIC_TABLE *Table,
559 PVOID FirstStruct,
560 PVOID SecondStruct
561 );
562 typedef RTL_GENERIC_COMPARE_ROUTINE *PRTL_GENERIC_COMPARE_ROUTINE;
563
564 typedef PVOID
565 (NTAPI RTL_GENERIC_ALLOCATE_ROUTINE) (
566 struct _RTL_GENERIC_TABLE *Table,
567 CLONG ByteSize
568 );
569 typedef RTL_GENERIC_ALLOCATE_ROUTINE *PRTL_GENERIC_ALLOCATE_ROUTINE;
570
571 typedef PVOID
572 (NTAPI RTL_AVL_ALLOCATE_ROUTINE) (
573 struct _RTL_AVL_TABLE *Table,
574 CLONG ByteSize
575 );
576 typedef RTL_AVL_ALLOCATE_ROUTINE *PRTL_AVL_ALLOCATE_ROUTINE;
577
578 typedef VOID
579 (NTAPI RTL_GENERIC_FREE_ROUTINE) (
580 struct _RTL_GENERIC_TABLE *Table,
581 PVOID Buffer
582 );
583 typedef RTL_GENERIC_FREE_ROUTINE *PRTL_GENERIC_FREE_ROUTINE;
584
585 typedef VOID
586 (NTAPI RTL_AVL_FREE_ROUTINE) (
587 struct _RTL_AVL_TABLE *Table,
588 PVOID Buffer
589 );
590 typedef RTL_AVL_FREE_ROUTINE *PRTL_AVL_FREE_ROUTINE;
591
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
599
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 */
607
608 #endif /* NTOS_MODE_USER */
609
610 //
611 // RTL Query Registry callback
612 //
613 #ifdef NTOS_MODE_USER
614 typedef NTSTATUS
615 (NTAPI *PRTL_QUERY_REGISTRY_ROUTINE)(
616 _In_ PWSTR ValueName,
617 _In_ ULONG ValueType,
618 _In_ PVOID ValueData,
619 _In_ ULONG ValueLength,
620 _In_ PVOID Context,
621 _In_ PVOID EntryContext
622 );
623 #endif
624
625 //
626 // RTL Secure Memory callbacks
627 //
628 #ifdef NTOS_MODE_USER
629 typedef NTSTATUS
630 (NTAPI *PRTL_SECURE_MEMORY_CACHE_CALLBACK)(
631 _In_ PVOID Address,
632 _In_ SIZE_T Length
633 );
634 #endif
635
636 //
637 // RTL Range List callbacks
638 //
639 #ifdef NTOS_MODE_USER
640 typedef BOOLEAN
641 (NTAPI *PRTL_CONFLICT_RANGE_CALLBACK)(
642 PVOID Context,
643 struct _RTL_RANGE *Range
644 );
645
646 //
647 // Custom Heap Commit Routine for RtlCreateHeap
648 //
649 typedef NTSTATUS
650 (NTAPI * PRTL_HEAP_COMMIT_ROUTINE)(
651 _In_ PVOID Base,
652 _Inout_ PVOID *CommitAddress,
653 _Inout_ PSIZE_T CommitSize
654 );
655
656 //
657 // Parameters for RtlCreateHeap
658 //
659 typedef struct _RTL_HEAP_PARAMETERS
660 {
661 ULONG Length;
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;
671 SIZE_T Reserved[2];
672 } RTL_HEAP_PARAMETERS, *PRTL_HEAP_PARAMETERS;
673
674 //
675 // RTL Bitmap structures
676 //
677 typedef struct _RTL_BITMAP
678 {
679 ULONG SizeOfBitMap;
680 PULONG Buffer;
681 } RTL_BITMAP, *PRTL_BITMAP;
682
683 typedef struct _RTL_BITMAP_RUN
684 {
685 ULONG StartingIndex;
686 ULONG NumberOfBits;
687 } RTL_BITMAP_RUN, *PRTL_BITMAP_RUN;
688
689 //
690 // RtlGenerateXxxName context
691 //
692 typedef struct _GENERATE_NAME_CONTEXT
693 {
694 USHORT Checksum;
695 BOOLEAN CheckSumInserted;
696 UCHAR NameLength;
697 WCHAR NameBuffer[8];
698 ULONG ExtensionLength;
699 WCHAR ExtensionBuffer[4];
700 ULONG LastIndexValue;
701 } GENERATE_NAME_CONTEXT, *PGENERATE_NAME_CONTEXT;
702
703 //
704 // RTL Splay and Balanced Links structures
705 //
706 typedef struct _RTL_SPLAY_LINKS
707 {
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;
712
713 typedef struct _RTL_BALANCED_LINKS
714 {
715 struct _RTL_BALANCED_LINKS *Parent;
716 struct _RTL_BALANCED_LINKS *LeftChild;
717 struct _RTL_BALANCED_LINKS *RightChild;
718 CHAR Balance;
719 UCHAR Reserved[3];
720 } RTL_BALANCED_LINKS, *PRTL_BALANCED_LINKS;
721
722 //
723 // RTL Avl/Generic Tables
724 //
725 #ifndef RTL_USE_AVL_TABLES
726 typedef struct _RTL_GENERIC_TABLE
727 {
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;
736 PVOID TableContext;
737 } RTL_GENERIC_TABLE, *PRTL_GENERIC_TABLE;
738 #endif /* !RTL_USE_AVL_TABLES */
739
740 typedef struct _RTL_AVL_TABLE
741 {
742 RTL_BALANCED_LINKS BalancedRoot;
743 PVOID OrderedPointer;
744 ULONG WhichOrderedElement;
745 ULONG NumberGenericTableElements;
746 ULONG DepthOfTree;
747 PRTL_BALANCED_LINKS RestartKey;
748 ULONG DeleteCount;
749 PRTL_AVL_COMPARE_ROUTINE CompareRoutine;
750 PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine;
751 PRTL_AVL_FREE_ROUTINE FreeRoutine;
752 PVOID TableContext;
753 } RTL_AVL_TABLE, *PRTL_AVL_TABLE;
754
755 #ifdef RTL_USE_AVL_TABLES
756 #undef RTL_GENERIC_TABLE
757 #undef PRTL_GENERIC_TABLE
758
759 #define RTL_GENERIC_TABLE RTL_AVL_TABLE
760 #define PRTL_GENERIC_TABLE PRTL_AVL_TABLE
761 #endif /* RTL_USE_AVL_TABLES */
762
763 //
764 // RTL Compression Buffer
765 //
766 typedef struct _COMPRESSED_DATA_INFO {
767 USHORT CompressionFormatAndEngine;
768 UCHAR CompressionUnitShift;
769 UCHAR ChunkShift;
770 UCHAR ClusterShift;
771 UCHAR Reserved;
772 USHORT NumberOfChunks;
773 ULONG CompressedChunkSizes[ANYSIZE_ARRAY];
774 } COMPRESSED_DATA_INFO, *PCOMPRESSED_DATA_INFO;
775
776 //
777 // RtlQueryRegistry Data
778 //
779 typedef struct _RTL_QUERY_REGISTRY_TABLE
780 {
781 PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine;
782 ULONG Flags;
783 PCWSTR Name;
784 PVOID EntryContext;
785 ULONG DefaultType;
786 PVOID DefaultData;
787 ULONG DefaultLength;
788 } RTL_QUERY_REGISTRY_TABLE, *PRTL_QUERY_REGISTRY_TABLE;
789
790 //
791 // RTL Unicode Table Structures
792 //
793 typedef struct _UNICODE_PREFIX_TABLE_ENTRY
794 {
795 CSHORT NodeTypeCode;
796 CSHORT NameLength;
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;
802
803 typedef struct _UNICODE_PREFIX_TABLE
804 {
805 CSHORT NodeTypeCode;
806 CSHORT NameLength;
807 PUNICODE_PREFIX_TABLE_ENTRY NextPrefixTree;
808 PUNICODE_PREFIX_TABLE_ENTRY LastNextEntry;
809 } UNICODE_PREFIX_TABLE, *PUNICODE_PREFIX_TABLE;
810
811 //
812 // Time Structure for RTL Time calls
813 //
814 typedef struct _TIME_FIELDS
815 {
816 CSHORT Year;
817 CSHORT Month;
818 CSHORT Day;
819 CSHORT Hour;
820 CSHORT Minute;
821 CSHORT Second;
822 CSHORT Milliseconds;
823 CSHORT Weekday;
824 } TIME_FIELDS, *PTIME_FIELDS;
825
826 //
827 // Activation Context
828 //
829 typedef PVOID PACTIVATION_CONTEXT;
830
831 //
832 // Activation Context Frame
833 //
834 typedef struct _RTL_ACTIVATION_CONTEXT_STACK_FRAME
835 {
836 struct _RTL_ACTIVATION_CONTEXT_STACK_FRAME *Previous;
837 PACTIVATION_CONTEXT ActivationContext;
838 ULONG Flags;
839 } RTL_ACTIVATION_CONTEXT_STACK_FRAME, *PRTL_ACTIVATION_CONTEXT_STACK_FRAME;
840
841 typedef struct _RTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_BASIC
842 {
843 SIZE_T Size;
844 ULONG Format;
845 RTL_ACTIVATION_CONTEXT_STACK_FRAME Frame;
846 } RTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_BASIC, *PRTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_BASIC;
847
848 typedef struct _RTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED
849 {
850 SIZE_T Size;
851 ULONG Format;
852 RTL_ACTIVATION_CONTEXT_STACK_FRAME Frame;
853 PVOID Extra1;
854 PVOID Extra2;
855 PVOID Extra3;
856 PVOID Extra4;
857 } RTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED, *PRTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_EXTENDED;
858
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;
861
862 #if (NTDDI_VERSION >= NTDDI_WS03)
863 typedef struct _ACTIVATION_CONTEXT_STACK
864 {
865 PRTL_ACTIVATION_CONTEXT_STACK_FRAME ActiveFrame;
866 LIST_ENTRY FrameListCache;
867 ULONG Flags;
868 ULONG NextCookieSequenceNumber;
869 ULONG StackId;
870 } ACTIVATION_CONTEXT_STACK, *PACTIVATION_CONTEXT_STACK;
871 #else
872 typedef struct _ACTIVATION_CONTEXT_STACK
873 {
874 ULONG Flags;
875 ULONG NextCookieSequenceNumber;
876 PVOID ActiveFrame;
877 LIST_ENTRY FrameListCache;
878 } ACTIVATION_CONTEXT_STACK, *PACTIVATION_CONTEXT_STACK;
879 #endif
880
881 #endif /* NTOS_MODE_USER */
882
883 //
884 // ACE Structure
885 //
886 typedef struct _ACE
887 {
888 ACE_HEADER Header;
889 ACCESS_MASK AccessMask;
890 } ACE, *PACE;
891
892 //
893 // Information Structures for RTL Debug Functions
894 //
895 typedef struct _RTL_PROCESS_MODULE_INFORMATION
896 {
897 ULONG Section;
898 PVOID MappedBase;
899 PVOID ImageBase;
900 ULONG ImageSize;
901 ULONG Flags;
902 USHORT LoadOrderIndex;
903 USHORT InitOrderIndex;
904 USHORT LoadCount;
905 USHORT OffsetToFileName;
906 CHAR FullPathName[256];
907 } RTL_PROCESS_MODULE_INFORMATION, *PRTL_PROCESS_MODULE_INFORMATION;
908
909 typedef struct _RTL_PROCESS_MODULES
910 {
911 ULONG NumberOfModules;
912 RTL_PROCESS_MODULE_INFORMATION Modules[1];
913 } RTL_PROCESS_MODULES, *PRTL_PROCESS_MODULES;
914
915 typedef struct _RTL_PROCESS_MODULE_INFORMATION_EX
916 {
917 ULONG NextOffset;
918 RTL_PROCESS_MODULE_INFORMATION BaseInfo;
919 ULONG ImageCheckSum;
920 ULONG TimeDateStamp;
921 PVOID DefaultBase;
922 } RTL_PROCESS_MODULE_INFORMATION_EX, *PRTL_PROCESS_MODULE_INFORMATION_EX;
923
924 typedef struct _RTL_HEAP_TAG_INFO
925 {
926 ULONG NumberOfAllocations;
927 ULONG NumberOfFrees;
928 SIZE_T BytesAllocated;
929 } RTL_HEAP_TAG_INFO, *PRTL_HEAP_TAG_INFO;
930
931 typedef struct _RTL_HEAP_USAGE_ENTRY
932 {
933 struct _RTL_HEAP_USAGE_ENTRY *Next;
934 PVOID Address;
935 SIZE_T Size;
936 USHORT AllocatorBackTraceIndex;
937 USHORT TagIndex;
938 } RTL_HEAP_USAGE_ENTRY, *PRTL_HEAP_USAGE_ENTRY;
939
940 typedef struct _RTL_HEAP_USAGE
941 {
942 ULONG Length;
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;
952
953 typedef struct _RTL_HEAP_WALK_ENTRY
954 {
955 PVOID DataAddress;
956 SIZE_T DataSize;
957 UCHAR OverheadBytes;
958 UCHAR SegmentIndex;
959 USHORT Flags;
960 union
961 {
962 struct
963 {
964 SIZE_T Settable;
965 USHORT TagIndex;
966 USHORT AllocatorBackTraceIndex;
967 ULONG Reserved[2];
968 } Block;
969 struct
970 {
971 ULONG_PTR CommittedSize;
972 ULONG_PTR UnCommittedSize;
973 PVOID FirstEntry;
974 PVOID LastEntry;
975 } Segment;
976 };
977 } RTL_HEAP_WALK_ENTRY, *PRTL_HEAP_WALK_ENTRY;
978
979 typedef struct _RTL_HEAP_ENTRY
980 {
981 SIZE_T Size;
982 USHORT Flags;
983 USHORT AllocatorBackTraceIndex;
984 union
985 {
986 struct
987 {
988 SIZE_T Settable;
989 ULONG Tag;
990 } s1;
991 struct
992 {
993 SIZE_T CommittedSize;
994 PVOID FirstBlock;
995 } s2;
996 } u;
997 } RTL_HEAP_ENTRY, *PRTL_HEAP_ENTRY;
998
999 typedef struct _RTL_HEAP_TAG
1000 {
1001 ULONG NumberOfAllocations;
1002 ULONG NumberOfFrees;
1003 SIZE_T BytesAllocated;
1004 USHORT TagIndex;
1005 USHORT CreatorBackTraceIndex;
1006 WCHAR TagName[24];
1007 } RTL_HEAP_TAG, *PRTL_HEAP_TAG;
1008
1009 typedef struct _RTL_HEAP_INFORMATION
1010 {
1011 PVOID BaseAddress;
1012 ULONG Flags;
1013 USHORT EntryOverhead;
1014 USHORT CreatorBackTraceIndex;
1015 SIZE_T BytesAllocated;
1016 SIZE_T BytesCommitted;
1017 ULONG NumberOfTags;
1018 ULONG NumberOfEntries;
1019 ULONG NumberOfPseudoTags;
1020 ULONG PseudoTagGranularity;
1021 ULONG Reserved[4];
1022 PRTL_HEAP_TAG Tags;
1023 PRTL_HEAP_ENTRY Entries;
1024 } RTL_HEAP_INFORMATION, *PRTL_HEAP_INFORMATION;
1025
1026 typedef struct _RTL_PROCESS_HEAPS
1027 {
1028 ULONG NumberOfHeaps;
1029 RTL_HEAP_INFORMATION Heaps[1];
1030 } RTL_PROCESS_HEAPS, *PRTL_PROCESS_HEAPS;
1031
1032 typedef struct _RTL_PROCESS_LOCK_INFORMATION
1033 {
1034 PVOID Address;
1035 USHORT Type;
1036 USHORT CreatorBackTraceIndex;
1037 ULONG OwnerThreadId;
1038 ULONG ActiveCount;
1039 ULONG ContentionCount;
1040 ULONG EntryCount;
1041 ULONG RecursionCount;
1042 ULONG NumberOfSharedWaiters;
1043 ULONG NumberOfExclusiveWaiters;
1044 } RTL_PROCESS_LOCK_INFORMATION, *PRTL_PROCESS_LOCK_INFORMATION;
1045
1046 typedef struct _RTL_PROCESS_LOCKS
1047 {
1048 ULONG NumberOfLocks;
1049 RTL_PROCESS_LOCK_INFORMATION Locks[1];
1050 } RTL_PROCESS_LOCKS, *PRTL_PROCESS_LOCKS;
1051
1052 typedef struct _RTL_PROCESS_BACKTRACE_INFORMATION
1053 {
1054 PVOID SymbolicBackTrace;
1055 ULONG TraceCount;
1056 USHORT Index;
1057 USHORT Depth;
1058 PVOID BackTrace[16];
1059 } RTL_PROCESS_BACKTRACE_INFORMATION, *PRTL_PROCESS_BACKTRACE_INFORMATION;
1060
1061 typedef struct _RTL_PROCESS_BACKTRACES
1062 {
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;
1069
1070 typedef struct _RTL_PROCESS_VERIFIER_OPTIONS
1071 {
1072 ULONG SizeStruct;
1073 ULONG Option;
1074 UCHAR OptionData[1];
1075 //
1076 // Option array continues below
1077 //
1078 } RTL_PROCESS_VERIFIER_OPTIONS, *PRTL_PROCESS_VERIFIER_OPTIONS;
1079
1080 typedef struct _RTL_DEBUG_INFORMATION
1081 {
1082 HANDLE SectionHandleClient;
1083 PVOID ViewBaseClient;
1084 PVOID ViewBaseTarget;
1085 ULONG ViewBaseDelta;
1086 HANDLE EventPairClient;
1087 PVOID EventPairTarget;
1088 HANDLE TargetProcessId;
1089 HANDLE TargetThreadHandle;
1090 ULONG Flags;
1091 ULONG OffsetFree;
1092 ULONG CommitSize;
1093 ULONG ViewSize;
1094 union
1095 {
1096 PRTL_PROCESS_MODULES Modules;
1097 PRTL_PROCESS_MODULE_INFORMATION_EX ModulesEx;
1098 };
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;
1105 HANDLE ProcessHeap;
1106 HANDLE CriticalSectionHandle;
1107 HANDLE CriticalSectionOwnerThread;
1108 PVOID Reserved[4];
1109 } RTL_DEBUG_INFORMATION, *PRTL_DEBUG_INFORMATION;
1110
1111 //
1112 // Unload Event Trace Structure for RtlGetUnloadEventTrace
1113 //
1114 typedef struct _RTL_UNLOAD_EVENT_TRACE
1115 {
1116 PVOID BaseAddress;
1117 ULONG SizeOfImage;
1118 ULONG Sequence;
1119 ULONG TimeDateStamp;
1120 ULONG CheckSum;
1121 WCHAR ImageName[32];
1122 } RTL_UNLOAD_EVENT_TRACE, *PRTL_UNLOAD_EVENT_TRACE;
1123
1124 //
1125 // RTL Handle Structures
1126 //
1127 typedef struct _RTL_HANDLE_TABLE_ENTRY
1128 {
1129 union
1130 {
1131 ULONG Flags;
1132 struct _RTL_HANDLE_TABLE_ENTRY *NextFree;
1133 };
1134 } RTL_HANDLE_TABLE_ENTRY, *PRTL_HANDLE_TABLE_ENTRY;
1135
1136 typedef struct _RTL_HANDLE_TABLE
1137 {
1138 ULONG MaximumNumberOfHandles;
1139 ULONG SizeOfHandleTableEntry;
1140 ULONG Reserved[2];
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;
1146
1147 //
1148 // Exception Record
1149 //
1150 typedef struct _EXCEPTION_REGISTRATION_RECORD
1151 {
1152 struct _EXCEPTION_REGISTRATION_RECORD *Next;
1153 PEXCEPTION_ROUTINE Handler;
1154 } EXCEPTION_REGISTRATION_RECORD, *PEXCEPTION_REGISTRATION_RECORD;
1155
1156 //
1157 // Current Directory Structures
1158 //
1159 typedef struct _CURDIR
1160 {
1161 UNICODE_STRING DosPath;
1162 HANDLE Handle;
1163 } CURDIR, *PCURDIR;
1164
1165 typedef struct _RTLP_CURDIR_REF
1166 {
1167 LONG RefCount;
1168 HANDLE Handle;
1169 } RTLP_CURDIR_REF, *PRTLP_CURDIR_REF;
1170
1171 typedef struct _RTL_RELATIVE_NAME_U
1172 {
1173 UNICODE_STRING RelativeName;
1174 HANDLE ContainingDirectory;
1175 PRTLP_CURDIR_REF CurDirRef;
1176 } RTL_RELATIVE_NAME_U, *PRTL_RELATIVE_NAME_U;
1177
1178 typedef struct _RTL_DRIVE_LETTER_CURDIR
1179 {
1180 USHORT Flags;
1181 USHORT Length;
1182 ULONG TimeStamp;
1183 UNICODE_STRING DosPath;
1184 } RTL_DRIVE_LETTER_CURDIR, *PRTL_DRIVE_LETTER_CURDIR;
1185
1186 typedef struct _RTL_PERTHREAD_CURDIR
1187 {
1188 PRTL_DRIVE_LETTER_CURDIR CurrentDirectories;
1189 PUNICODE_STRING ImageName;
1190 PVOID Environment;
1191 } RTL_PERTHREAD_CURDIR, *PRTL_PERTHREAD_CURDIR;
1192
1193 //
1194 // Private State structure for RtlAcquirePrivilege/RtlReleasePrivilege
1195 //
1196 typedef struct _RTL_ACQUIRE_STATE
1197 {
1198 HANDLE Token;
1199 HANDLE OldImpersonationToken;
1200 PTOKEN_PRIVILEGES OldPrivileges;
1201 PTOKEN_PRIVILEGES NewPrivileges;
1202 ULONG Flags;
1203 UCHAR OldPrivBuffer[1024];
1204 } RTL_ACQUIRE_STATE, *PRTL_ACQUIRE_STATE;
1205
1206 #ifndef NTOS_MODE_USER
1207
1208 //
1209 // RTL Critical Section Structures
1210 //
1211 typedef struct _RTL_CRITICAL_SECTION_DEBUG
1212 {
1213 USHORT Type;
1214 USHORT CreatorBackTraceIndex;
1215 struct _RTL_CRITICAL_SECTION *CriticalSection;
1216 LIST_ENTRY ProcessLocksList;
1217 ULONG EntryCount;
1218 ULONG ContentionCount;
1219 ULONG Spare[2];
1220 } RTL_CRITICAL_SECTION_DEBUG, *PRTL_CRITICAL_SECTION_DEBUG, RTL_RESOURCE_DEBUG, *PRTL_RESOURCE_DEBUG;
1221
1222 typedef struct _RTL_CRITICAL_SECTION
1223 {
1224 PRTL_CRITICAL_SECTION_DEBUG DebugInfo;
1225 LONG LockCount;
1226 LONG RecursionCount;
1227 HANDLE OwningThread;
1228 HANDLE LockSemaphore;
1229 ULONG_PTR SpinCount;
1230 } RTL_CRITICAL_SECTION, *PRTL_CRITICAL_SECTION;
1231
1232 #endif /* !NTOS_MODE_USER */
1233
1234 //
1235 // RTL Private Heap Structures
1236 //
1237 typedef struct _HEAP_LOCK
1238 {
1239 union
1240 {
1241 RTL_CRITICAL_SECTION CriticalSection;
1242 #ifndef NTOS_MODE_USER
1243 ERESOURCE Resource;
1244 #endif
1245 UCHAR Padding[0x68]; /* Max ERESOURCE size for x64 build. Needed because RTL is built only once */
1246 };
1247 } HEAP_LOCK, *PHEAP_LOCK;
1248
1249 //
1250 // RTL Range List Structures
1251 //
1252 typedef struct _RTL_RANGE_LIST
1253 {
1254 LIST_ENTRY ListHead;
1255 ULONG Flags;
1256 ULONG Count;
1257 ULONG Stamp;
1258 } RTL_RANGE_LIST, *PRTL_RANGE_LIST;
1259
1260 typedef struct _RTL_RANGE
1261 {
1262 ULONGLONG Start;
1263 ULONGLONG End;
1264 PVOID UserData;
1265 PVOID Owner;
1266 UCHAR Attributes;
1267 UCHAR Flags;
1268 } RTL_RANGE, *PRTL_RANGE;
1269
1270 typedef struct _RANGE_LIST_ITERATOR
1271 {
1272 PLIST_ENTRY RangeListHead;
1273 PLIST_ENTRY MergedHead;
1274 PVOID Current;
1275 ULONG Stamp;
1276 } RTL_RANGE_LIST_ITERATOR, *PRTL_RANGE_LIST_ITERATOR;
1277
1278 //
1279 // RTL Resource
1280 //
1281 #define RTL_RESOURCE_FLAG_LONG_TERM ((ULONG)0x00000001)
1282
1283 typedef struct _RTL_RESOURCE
1284 {
1285 RTL_CRITICAL_SECTION Lock;
1286 HANDLE SharedSemaphore;
1287 ULONG SharedWaiters;
1288 HANDLE ExclusiveSemaphore;
1289 ULONG ExclusiveWaiters;
1290 LONG NumberActive;
1291 HANDLE OwningThread;
1292 ULONG TimeoutBoost;
1293 PVOID DebugInfo;
1294 } RTL_RESOURCE, *PRTL_RESOURCE;
1295
1296 //
1297 // Structures for RtlCreateUserProcess
1298 //
1299 typedef struct _RTL_USER_PROCESS_PARAMETERS
1300 {
1301 ULONG MaximumLength;
1302 ULONG Length;
1303 ULONG Flags;
1304 ULONG DebugFlags;
1305 HANDLE ConsoleHandle;
1306 ULONG ConsoleFlags;
1307 HANDLE StandardInput;
1308 HANDLE StandardOutput;
1309 HANDLE StandardError;
1310 CURDIR CurrentDirectory;
1311 UNICODE_STRING DllPath;
1312 UNICODE_STRING ImagePathName;
1313 UNICODE_STRING CommandLine;
1314 PWSTR Environment;
1315 ULONG StartingX;
1316 ULONG StartingY;
1317 ULONG CountX;
1318 ULONG CountY;
1319 ULONG CountCharsX;
1320 ULONG CountCharsY;
1321 ULONG FillAttribute;
1322 ULONG WindowFlags;
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;
1331 #endif
1332 #if (NTDDI_VERSION >= NTDDI_WIN7)
1333 SIZE_T EnvironmentVersion;
1334 #endif
1335 } RTL_USER_PROCESS_PARAMETERS, *PRTL_USER_PROCESS_PARAMETERS;
1336
1337 typedef struct _RTL_USER_PROCESS_INFORMATION
1338 {
1339 ULONG Size;
1340 HANDLE ProcessHandle;
1341 HANDLE ThreadHandle;
1342 CLIENT_ID ClientId;
1343 SECTION_IMAGE_INFORMATION ImageInformation;
1344 } RTL_USER_PROCESS_INFORMATION, *PRTL_USER_PROCESS_INFORMATION;
1345
1346 //
1347 // RTL Atom Table Structures
1348 //
1349 typedef struct _RTL_ATOM_TABLE_ENTRY
1350 {
1351 struct _RTL_ATOM_TABLE_ENTRY *HashLink;
1352 USHORT HandleIndex;
1353 USHORT Atom;
1354 USHORT ReferenceCount;
1355 UCHAR Flags;
1356 UCHAR NameLength;
1357 WCHAR Name[1];
1358 } RTL_ATOM_TABLE_ENTRY, *PRTL_ATOM_TABLE_ENTRY;
1359
1360 typedef struct _RTL_ATOM_TABLE
1361 {
1362 ULONG Signature;
1363 union
1364 {
1365 #ifdef NTOS_MODE_USER
1366 RTL_CRITICAL_SECTION CriticalSection;
1367 #else
1368 FAST_MUTEX FastMutex;
1369 #endif
1370 };
1371 union
1372 {
1373 #ifdef NTOS_MODE_USER
1374 RTL_HANDLE_TABLE RtlHandleTable;
1375 #else
1376 PHANDLE_TABLE ExHandleTable;
1377 #endif
1378 };
1379 ULONG NumberOfBuckets;
1380 PRTL_ATOM_TABLE_ENTRY Buckets[1];
1381 } RTL_ATOM_TABLE, *PRTL_ATOM_TABLE;
1382
1383 #ifndef _WINBASE_
1384 //
1385 // System Time and Timezone Structures
1386 //
1387 typedef struct _SYSTEMTIME
1388 {
1389 USHORT wYear;
1390 USHORT wMonth;
1391 USHORT wDayOfWeek;
1392 USHORT wDay;
1393 USHORT wHour;
1394 USHORT wMinute;
1395 USHORT wSecond;
1396 USHORT wMilliseconds;
1397 } SYSTEMTIME, *PSYSTEMTIME, *LPSYSTEMTIME;
1398
1399 typedef struct _TIME_ZONE_INFORMATION
1400 {
1401 LONG Bias;
1402 WCHAR StandardName[32];
1403 SYSTEMTIME StandardDate;
1404 LONG StandardBias;
1405 WCHAR DaylightName[32];
1406 SYSTEMTIME DaylightDate;
1407 LONG DaylightBias;
1408 } TIME_ZONE_INFORMATION, *PTIME_ZONE_INFORMATION, *LPTIME_ZONE_INFORMATION;
1409 #endif /* !_WINBASE_ */
1410
1411 //
1412 // Native version of Timezone Structure
1413 //
1414 typedef LPTIME_ZONE_INFORMATION PRTL_TIME_ZONE_INFORMATION;
1415
1416 //
1417 // Hotpatch Header
1418 //
1419 typedef struct _RTL_PATCH_HEADER
1420 {
1421 LIST_ENTRY PatchList;
1422 PVOID PatchImageBase;
1423 struct _RTL_PATCH_HEADER *NextPath;
1424 ULONG PatchFlags;
1425 LONG PatchRefCount;
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;
1433
1434 //
1435 // Header for NLS Files
1436 //
1437 typedef struct _NLS_FILE_HEADER
1438 {
1439 USHORT HeaderSize;
1440 USHORT CodePage;
1441 USHORT MaximumCharacterSize;
1442 USHORT DefaultChar;
1443 USHORT UniDefaultChar;
1444 USHORT TransDefaultChar;
1445 USHORT TransUniDefaultChar;
1446 UCHAR LeadByte[MAXIMUM_LEADBYTES];
1447 } NLS_FILE_HEADER, *PNLS_FILE_HEADER;
1448
1449 //
1450 // Stack Traces
1451 //
1452 typedef struct _RTL_STACK_TRACE_ENTRY
1453 {
1454 struct _RTL_STACK_TRACE_ENTRY *HashChain;
1455 ULONG TraceCount;
1456 USHORT Index;
1457 USHORT Depth;
1458 PVOID BackTrace[32];
1459 } RTL_STACK_TRACE_ENTRY, *PRTL_STACK_TRACE_ENTRY;
1460
1461 typedef struct _STACK_TRACE_DATABASE
1462 {
1463 RTL_CRITICAL_SECTION CriticalSection;
1464 } STACK_TRACE_DATABASE, *PSTACK_TRACE_DATABASE;
1465
1466 typedef struct _RTL_TRACE_BLOCK
1467 {
1468 ULONG Magic;
1469 ULONG Count;
1470 ULONG Size;
1471 ULONG UserCount;
1472 ULONG UserSize;
1473 PVOID UserContext;
1474 struct _RTL_TRACE_BLOCK *Next;
1475 PVOID *Trace;
1476 } RTL_TRACE_BLOCK, *PRTL_TRACE_BLOCK;
1477
1478 //
1479 // Auto-Managed Rtl* String Buffer
1480 //
1481 typedef struct _RTL_BUFFER
1482 {
1483 PUCHAR Buffer;
1484 PUCHAR StaticBuffer;
1485 SIZE_T Size;
1486 SIZE_T StaticSize;
1487 SIZE_T ReservedForAllocatedSize;
1488 PVOID ReservedForIMalloc;
1489 } RTL_BUFFER, *PRTL_BUFFER;
1490
1491 typedef struct _RTL_UNICODE_STRING_BUFFER
1492 {
1493 UNICODE_STRING String;
1494 RTL_BUFFER ByteBuffer;
1495 WCHAR MinimumStaticBufferForTerminalNul;
1496 } RTL_UNICODE_STRING_BUFFER, *PRTL_UNICODE_STRING_BUFFER;
1497
1498 #ifndef NTOS_MODE_USER
1499
1500 //
1501 // Message Resource Entry, Block and Data
1502 //
1503 typedef struct _MESSAGE_RESOURCE_ENTRY
1504 {
1505 USHORT Length;
1506 USHORT Flags;
1507 UCHAR Text[ANYSIZE_ARRAY];
1508 } MESSAGE_RESOURCE_ENTRY, *PMESSAGE_RESOURCE_ENTRY;
1509
1510 typedef struct _MESSAGE_RESOURCE_BLOCK
1511 {
1512 ULONG LowId;
1513 ULONG HighId;
1514 ULONG OffsetToEntries;
1515 } MESSAGE_RESOURCE_BLOCK, *PMESSAGE_RESOURCE_BLOCK;
1516
1517 typedef struct _MESSAGE_RESOURCE_DATA
1518 {
1519 ULONG NumberOfBlocks;
1520 MESSAGE_RESOURCE_BLOCK Blocks[ANYSIZE_ARRAY];
1521 } MESSAGE_RESOURCE_DATA, *PMESSAGE_RESOURCE_DATA;
1522
1523 #endif /* !NTOS_MODE_USER */
1524 #endif /* !_RTLTYPES_H */