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