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