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