Fix some NDK things and missing w32api defines.
[reactos.git] / reactos / include / ndk / umtypes.h
1 /*
2 * PROJECT: ReactOS Native Headers
3 * FILE: include/ndk/umtypes.h
4 * PURPOSE: Definitions needed for Native Headers if target is not Kernel-Mode.
5 * PROGRAMMER: Alex Ionescu (alex@relsoft.net)
6 * UPDATE HISTORY:
7 * Created 06/10/04
8 */
9
10 #ifndef _UMTYPES_H
11 #define _UMTYPES_H
12
13 /* DEPENDENCIES **************************************************************/
14 #include <winioctl.h>
15 #include <ntstatus.h>
16 #include <ddk/ntnls.h>
17 #define STATIC static
18
19 /* EXPORTED DATA *************************************************************/
20
21 /* CONSTANTS *****************************************************************/
22
23 /* NTAPI/NTOSAPI Define */
24 #define NTAPI __stdcall
25 #define NTOSAPI
26
27 /* Definitions for Object Creation -- winternl.h */
28 #define OBJ_INHERIT 2L
29 #define OBJ_PERMANENT 16L
30 #define OBJ_EXCLUSIVE 32L
31 #define OBJ_CASE_INSENSITIVE 64L
32 #define OBJ_OPENIF 128L
33 #define OBJ_OPENLINK 256L
34 #define OBJ_VALID_ATTRIBUTES 498L
35 #define InitializeObjectAttributes(p,n,a,r,s) { \
36 (p)->Length = sizeof(OBJECT_ATTRIBUTES); \
37 (p)->RootDirectory = (r); \
38 (p)->Attributes = (a); \
39 (p)->ObjectName = (n); \
40 (p)->SecurityDescriptor = (s); \
41 (p)->SecurityQualityOfService = NULL; \
42 }
43
44 /* Native API Return Value Macros */
45 #define NT_SUCCESS(x) ((x)>=0)
46 #define NT_WARNING(x) ((ULONG)(x)>>30==2)
47 #define NT_ERROR(x) ((ULONG)(x)>>30==3)
48
49 /* Object Access Rights FIXME: Some are in w32api's psdk..,is that normal ?*/
50 #define DIRECTORY_QUERY (0x0001)
51 #define DIRECTORY_TRAVERSE (0x0002)
52 #define DIRECTORY_CREATE_OBJECT (0x0004)
53 #define DIRECTORY_CREATE_SUBDIRECTORY (0x0008)
54 #define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF)
55 #define EVENT_QUERY_STATE (0x0001)
56 #define SEMAPHORE_QUERY_STATE (0x0001)
57 #define SYMBOLIC_LINK_QUERY 0x0001
58 #define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
59
60 /* I/O Control Codes for communicating with Mailslots */
61 #define FSCTL_MAILSLOT_PEEK \
62 CTL_CODE(FILE_DEVICE_MAILSLOT, 0, METHOD_NEITHER, FILE_READ_DATA)
63
64 /* I/O Control Codes for communicating with Pipes */
65 #define FSCTL_PIPE_ASSIGN_EVENT \
66 CTL_CODE(FILE_DEVICE_NAMED_PIPE, 0, METHOD_BUFFERED, FILE_ANY_ACCESS)
67
68 #define FSCTL_PIPE_DISCONNECT \
69 CTL_CODE(FILE_DEVICE_NAMED_PIPE, 1, METHOD_BUFFERED, FILE_ANY_ACCESS)
70
71 #define FSCTL_PIPE_LISTEN \
72 CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2, METHOD_BUFFERED, FILE_ANY_ACCESS)
73
74 #define FSCTL_PIPE_PEEK \
75 CTL_CODE(FILE_DEVICE_NAMED_PIPE, 3, METHOD_BUFFERED, FILE_READ_DATA)
76
77 #define FSCTL_PIPE_QUERY_EVENT \
78 CTL_CODE(FILE_DEVICE_NAMED_PIPE, 4, METHOD_BUFFERED, FILE_ANY_ACCESS)
79
80 #define FSCTL_PIPE_TRANSCEIVE \
81 CTL_CODE(FILE_DEVICE_NAMED_PIPE, 5, METHOD_NEITHER, FILE_READ_DATA | FILE_WRITE_DATA)
82
83 #define FSCTL_PIPE_WAIT \
84 CTL_CODE(FILE_DEVICE_NAMED_PIPE, 6, METHOD_BUFFERED, FILE_ANY_ACCESS)
85
86 #define FSCTL_PIPE_IMPERSONATE \
87 CTL_CODE(FILE_DEVICE_NAMED_PIPE, 7, METHOD_BUFFERED, FILE_ANY_ACCESS)
88
89 #define FSCTL_PIPE_SET_CLIENT_PROCESS \
90 CTL_CODE(FILE_DEVICE_NAMED_PIPE, 8, METHOD_BUFFERED, FILE_ANY_ACCESS)
91
92 #define FSCTL_PIPE_QUERY_CLIENT_PROCESS \
93 CTL_CODE(FILE_DEVICE_NAMED_PIPE, 9, METHOD_BUFFERED, FILE_ANY_ACCESS)
94
95 #define FSCTL_PIPE_INTERNAL_READ \
96 CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2045, METHOD_BUFFERED, FILE_READ_DATA)
97
98 #define FSCTL_PIPE_INTERNAL_WRITE \
99 CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2046, METHOD_BUFFERED, FILE_WRITE_DATA)
100
101 #define FSCTL_PIPE_INTERNAL_TRANSCEIVE \
102 CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2047, METHOD_NEITHER, FILE_READ_DATA | FILE_WRITE_DATA)
103
104 #define FSCTL_PIPE_INTERNAL_READ_OVFLOW \
105 CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2048, METHOD_BUFFERED, FILE_READ_DATA)
106
107 /* Macros for getting the current Process or Thread */
108 #define NtCurrentProcess() ( (HANDLE)(LONG_PTR) -1 )
109 #define ZwCurrentProcess() NtCurrentProcess()
110 #define NtCurrentThread() ( (HANDLE)(LONG_PTR) -2 )
111 #define ZwCurrentThread() NtCurrentThread()
112
113 /* Kernel Shared Data Constants */
114 #define PROCESSOR_FEATURE_MAX 64
115 #define SharedUserData ((KUSER_SHARED_DATA * CONST) USER_SHARED_DATA)
116
117 /* Paging Values on x86 */
118 #define PAGE_SIZE 0x1000
119 #define PAGE_SHIFT 12L
120
121 /* Run-Time Library (RTL) Registry Constants */
122 #define RTL_REGISTRY_ABSOLUTE 0
123 #define RTL_REGISTRY_SERVICES 1
124 #define RTL_REGISTRY_CONTROL 2
125 #define RTL_REGISTRY_WINDOWS_NT 3
126 #define RTL_REGISTRY_DEVICEMAP 4
127 #define RTL_REGISTRY_USER 5
128 #define RTL_REGISTRY_MAXIMUM 6
129 #define RTL_REGISTRY_HANDLE 0x40000000
130 #define RTL_REGISTRY_OPTIONAL 0x80000000
131 #define RTL_QUERY_REGISTRY_SUBKEY 0x00000001
132 #define RTL_QUERY_REGISTRY_TOPKEY 0x00000002
133 #define RTL_QUERY_REGISTRY_REQUIRED 0x00000004
134 #define RTL_QUERY_REGISTRY_NOVALUE 0x00000008
135 #define RTL_QUERY_REGISTRY_NOEXPAND 0x00000010
136 #define RTL_QUERY_REGISTRY_DIRECT 0x00000020
137 #define RTL_QUERY_REGISTRY_DELETE 0x00000040
138
139 /* File Result Flags */
140 #define FILE_SUPERSEDED 0x00000000
141 #define FILE_OPENED 0x00000001
142 #define FILE_CREATED 0x00000002
143 #define FILE_OVERWRITTEN 0x00000003
144 #define FILE_EXISTS 0x00000004
145 #define FILE_DOES_NOT_EXIST 0x00000005
146
147 /* Pipe Flags */
148 #define FILE_PIPE_BYTE_STREAM_MODE 0x00000000
149 #define FILE_PIPE_MESSAGE_MODE 0x00000001
150 #define FILE_PIPE_QUEUE_OPERATION 0x00000000
151 #define FILE_PIPE_COMPLETE_OPERATION 0x00000001
152 #define FILE_PIPE_INBOUND 0x00000000
153 #define FILE_PIPE_OUTBOUND 0x00000001
154 #define FILE_PIPE_FULL_DUPLEX 0x00000002
155 #define FILE_PIPE_CLIENT_END 0x00000000
156 #define FILE_PIPE_SERVER_END 0x00000001
157
158 /* Device Charactertics */
159 #define FILE_REMOVABLE_MEDIA 0x00000001
160 #define FILE_REMOTE_DEVICE 0x00000010
161
162 /* SID Constants */
163 #define SID_MAX_SUB_AUTHORITIES 15
164
165 /* Version Constants */
166 #define VER_MINORVERSION 0x0000001
167 #define VER_MAJORVERSION 0x0000002
168 #define VER_BUILDNUMBER 0x0000004
169 #define VER_PLATFORMID 0x0000008
170 #define VER_SERVICEPACKMINOR 0x0000010
171 #define VER_SERVICEPACKMAJOR 0x0000020
172 #define VER_SUITENAME 0x0000040
173 #define VER_PRODUCT_TYPE 0x0000080
174 #define VER_PLATFORM_WIN32s 0
175 #define VER_PLATFORM_WIN32_WINDOWS 1
176 #define VER_PLATFORM_WIN32_NT 2
177 #define VER_EQUAL 1
178 #define VER_GREATER 2
179 #define VER_GREATER_EQUAL 3
180 #define VER_LESS 4
181 #define VER_LESS_EQUAL 5
182 #define VER_AND 6
183 #define VER_OR 7
184 #define VER_CONDITION_MASK 7
185 #define VER_NUM_BITS_PER_CONDITION_MASK 3
186
187 /* RTL String Hash Algorithms */
188 #define HASH_STRING_ALGORITHM_DEFAULT 0
189 #define HASH_STRING_ALGORITHM_X65599 1
190 #define HASH_STRING_ALGORITHM_INVALID 0xffffffff
191
192 /* List Macros */
193 static __inline
194 VOID
195 InitializeListHead(
196 IN PLIST_ENTRY ListHead)
197 {
198 ListHead->Flink = ListHead->Blink = ListHead;
199 }
200
201 static __inline
202 VOID
203 InsertHeadList(
204 IN PLIST_ENTRY ListHead,
205 IN PLIST_ENTRY Entry)
206 {
207 PLIST_ENTRY OldFlink;
208 OldFlink = ListHead->Flink;
209 Entry->Flink = OldFlink;
210 Entry->Blink = ListHead;
211 OldFlink->Blink = Entry;
212 ListHead->Flink = Entry;
213 }
214
215 static __inline
216 VOID
217 InsertTailList(
218 IN PLIST_ENTRY ListHead,
219 IN PLIST_ENTRY Entry)
220 {
221 PLIST_ENTRY OldBlink;
222 OldBlink = ListHead->Blink;
223 Entry->Flink = ListHead;
224 Entry->Blink = OldBlink;
225 OldBlink->Flink = Entry;
226 ListHead->Blink = Entry;
227 }
228
229 #define IsListEmpty(ListHead) \
230 ((ListHead)->Flink == (ListHead))
231
232 #define PopEntryList(ListHead) \
233 (ListHead)->Next; \
234 { \
235 PSINGLE_LIST_ENTRY _FirstEntry; \
236 _FirstEntry = (ListHead)->Next; \
237 if (_FirstEntry != NULL) \
238 (ListHead)->Next = _FirstEntry->Next; \
239 }
240
241 #define PushEntryList(_ListHead, _Entry) \
242 (_Entry)->Next = (_ListHead)->Next; \
243 (_ListHead)->Next = (_Entry); \
244
245 static __inline
246 BOOLEAN
247 RemoveEntryList(
248 IN PLIST_ENTRY Entry)
249 {
250 PLIST_ENTRY OldFlink;
251 PLIST_ENTRY OldBlink;
252
253 OldFlink = Entry->Flink;
254 OldBlink = Entry->Blink;
255 OldFlink->Blink = OldBlink;
256 OldBlink->Flink = OldFlink;
257 return (OldFlink == OldBlink);
258 }
259
260 static __inline
261 PLIST_ENTRY
262 RemoveHeadList(
263 IN PLIST_ENTRY ListHead)
264 {
265 PLIST_ENTRY Flink;
266 PLIST_ENTRY Entry;
267
268 Entry = ListHead->Flink;
269 Flink = Entry->Flink;
270 ListHead->Flink = Flink;
271 Flink->Blink = ListHead;
272 return Entry;
273 }
274
275 static __inline
276 PLIST_ENTRY
277 RemoveTailList(
278 IN PLIST_ENTRY ListHead)
279 {
280 PLIST_ENTRY Blink;
281 PLIST_ENTRY Entry;
282
283 Entry = ListHead->Blink;
284 Blink = Entry->Blink;
285 ListHead->Blink = Blink;
286 Blink->Flink = ListHead;
287 return Entry;
288 }
289
290 #define IsFirstEntry(ListHead, Entry) \
291 ((ListHead)->Flink == Entry)
292
293 #define IsLastEntry(ListHead, Entry) \
294 ((ListHead)->Blink == Entry)
295
296 /*
297 * Constant String Macro
298 */
299 #define RTL_CONSTANT_STRING(__SOURCE_STRING__) \
300 { \
301 sizeof(__SOURCE_STRING__) - sizeof((__SOURCE_STRING__)[0]), \
302 sizeof(__SOURCE_STRING__), \
303 (__SOURCE_STRING__) \
304 }
305
306 /* ENUMERATIONS **************************************************************/
307
308 /* Kernel Shared Data Values */
309 typedef enum _NT_PRODUCT_TYPE
310 {
311 NtProductWinNt = 1,
312 NtProductLanManNt,
313 NtProductServer
314 } NT_PRODUCT_TYPE, *PNT_PRODUCT_TYPE;
315
316 typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE
317 {
318 StandardDesign,
319 NEC98x86,
320 EndAlternatives
321 } ALTERNATIVE_ARCHITECTURE_TYPE;
322
323 /* Run-Time Library (RTL) Enumerations */
324 typedef enum _TABLE_SEARCH_RESULT
325 {
326 TableEmptyTree,
327 TableFoundNode,
328 TableInsertAsLeft,
329 TableInsertAsRight
330 } TABLE_SEARCH_RESULT;
331
332 typedef enum _RTL_GENERIC_COMPARE_RESULTS
333 {
334 GenericLessThan,
335 GenericGreaterThan,
336 GenericEqual
337 } RTL_GENERIC_COMPARE_RESULTS;
338
339 /* Kernel or Native Enumerations used by Native API */
340 typedef enum _SECTION_INHERIT
341 {
342 ViewShare = 1,
343 ViewUnmap = 2
344 } SECTION_INHERIT;
345
346 typedef enum _POOL_TYPE
347 {
348 NonPagedPool,
349 PagedPool,
350 NonPagedPoolMustSucceed,
351 DontUseThisType,
352 NonPagedPoolCacheAligned,
353 PagedPoolCacheAligned,
354 NonPagedPoolCacheAlignedMustS,
355 MaxPoolType,
356 NonPagedPoolSession = 32,
357 PagedPoolSession,
358 NonPagedPoolMustSucceedSession,
359 DontUseThisTypeSession,
360 NonPagedPoolCacheAlignedSession,
361 PagedPoolCacheAlignedSession,
362 NonPagedPoolCacheAlignedMustSSession
363 } POOL_TYPE;
364
365 typedef enum _EVENT_TYPE
366 {
367 NotificationEvent,
368 SynchronizationEvent
369 } EVENT_TYPE;
370
371 typedef enum _TIMER_TYPE
372 {
373 NotificationTimer,
374 SynchronizationTimer
375 } TIMER_TYPE;
376
377 typedef enum _WAIT_TYPE
378 {
379 WaitAll,
380 WaitAny
381 } WAIT_TYPE;
382
383 typedef enum _INTERFACE_TYPE
384 {
385 InterfaceTypeUndefined = -1,
386 Internal,
387 Isa,
388 Eisa,
389 MicroChannel,
390 TurboChannel,
391 PCIBus,
392 VMEBus,
393 NuBus,
394 PCMCIABus,
395 CBus,
396 MPIBus,
397 MPSABus,
398 ProcessorInternal,
399 InternalPowerBus,
400 PNPISABus,
401 PNPBus,
402 MaximumInterfaceType
403 }INTERFACE_TYPE, *PINTERFACE_TYPE;
404
405 typedef enum _MODE
406 {
407 KernelMode,
408 UserMode,
409 MaximumMode
410 } MODE;
411
412 typedef enum _KWAIT_REASON
413 {
414 Executive,
415 FreePage,
416 PageIn,
417 PoolAllocation,
418 DelayExecution,
419 Suspended,
420 UserRequest,
421 WrExecutive,
422 WrFreePage,
423 WrPageIn,
424 WrPoolAllocation,
425 WrDelayExecution,
426 WrSuspended,
427 WrUserRequest,
428 WrEventPair,
429 WrQueue,
430 WrLpcReceive,
431 WrLpcReply,
432 WrVirtualMemory,
433 WrPageOut,
434 WrRendezvous,
435 Spare2,
436 WrGuardedMutex,
437 Spare4,
438 Spare5,
439 Spare6,
440 WrKernel,
441 WrResource,
442 WrPushLock,
443 WrMutex,
444 WrQuantumEnd,
445 WrDispatchInt,
446 WrPreempted,
447 WrYieldExecution,
448 MaximumWaitReason
449 } KWAIT_REASON;
450
451 typedef enum _KPROFILE_SOURCE
452 {
453 ProfileTime,
454 ProfileAlignmentFixup,
455 ProfileTotalIssues,
456 ProfilePipelineDry,
457 ProfileLoadInstructions,
458 ProfilePipelineFrozen,
459 ProfileBranchInstructions,
460 ProfileTotalNonissues,
461 ProfileDcacheMisses,
462 ProfileIcacheMisses,
463 ProfileCacheMisses,
464 ProfileBranchMispredictions,
465 ProfileStoreInstructions,
466 ProfileFpInstructions,
467 ProfileIntegerInstructions,
468 Profile2Issue,
469 Profile3Issue,
470 Profile4Issue,
471 ProfileSpecialInstructions,
472 ProfileTotalCycles,
473 ProfileIcacheIssues,
474 ProfileDcacheAccesses,
475 ProfileMemoryBarrierCycles,
476 ProfileLoadLinkedIssues,
477 ProfileMaximum
478 } KPROFILE_SOURCE;
479
480 /**** Information Classes ****/
481
482 /*
483 * File
484 */
485 typedef enum _FILE_INFORMATION_CLASS
486 {
487 FileDirectoryInformation = 1,
488 FileFullDirectoryInformation,
489 FileBothDirectoryInformation,
490 FileBasicInformation,
491 FileStandardInformation,
492 FileInternalInformation,
493 FileEaInformation,
494 FileAccessInformation,
495 FileNameInformation,
496 FileRenameInformation,
497 FileLinkInformation,
498 FileNamesInformation,
499 FileDispositionInformation,
500 FilePositionInformation,
501 FileFullEaInformation,
502 FileModeInformation,
503 FileAlignmentInformation,
504 FileAllInformation,
505 FileAllocationInformation,
506 FileEndOfFileInformation,
507 FileAlternateNameInformation,
508 FileStreamInformation,
509 FilePipeInformation,
510 FilePipeLocalInformation,
511 FilePipeRemoteInformation,
512 FileMailslotQueryInformation,
513 FileMailslotSetInformation,
514 FileCompressionInformation,
515 FileObjectIdInformation,
516 FileCompletionInformation,
517 FileMoveClusterInformation,
518 FileQuotaInformation,
519 FileReparsePointInformation,
520 FileNetworkOpenInformation,
521 FileAttributeTagInformation,
522 FileTrackingInformation,
523 FileIdBothDirectoryInformation,
524 FileIdFullDirectoryInformation,
525 FileValidDataLengthInformation,
526 FileShortNameInformation,
527 FileMaximumInformation
528 } FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;
529
530 /*
531 * File System
532 */
533 typedef enum _FSINFOCLASS
534 {
535 FileFsVolumeInformation = 1,
536 FileFsLabelInformation,
537 FileFsSizeInformation,
538 FileFsDeviceInformation,
539 FileFsAttributeInformation,
540 FileFsControlInformation,
541 FileFsFullSizeInformation,
542 FileFsObjectIdInformation,
543 FileFsDriverPathInformation,
544 FileFsMaximumInformation
545 } FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS;
546
547 /*
548 * Registry Key
549 */
550 typedef enum _KEY_INFORMATION_CLASS
551 {
552 KeyBasicInformation,
553 KeyNodeInformation,
554 KeyFullInformation,
555 KeyNameInformation,
556 KeyCachedInformation,
557 KeyFlagsInformation
558 } KEY_INFORMATION_CLASS;
559
560 /*
561 * Registry Key Value
562 */
563 typedef enum _KEY_VALUE_INFORMATION_CLASS
564 {
565 KeyValueBasicInformation,
566 KeyValueFullInformation,
567 KeyValuePartialInformation,
568 KeyValueFullInformationAlign64,
569 KeyValuePartialInformationAlign64
570 } KEY_VALUE_INFORMATION_CLASS;
571
572 /*
573 * Registry Key Set
574 */
575 typedef enum _KEY_SET_INFORMATION_CLASS
576 {
577 KeyWriteTimeInformation,
578 KeyUserFlagsInformation,
579 MaxKeySetInfoClass
580 } KEY_SET_INFORMATION_CLASS;
581
582 /*
583 * Process
584 */
585 typedef enum _PROCESSINFOCLASS
586 {
587 ProcessBasicInformation,
588 ProcessQuotaLimits,
589 ProcessIoCounters,
590 ProcessVmCounters,
591 ProcessTimes,
592 ProcessBasePriority,
593 ProcessRaisePriority,
594 ProcessDebugPort,
595 ProcessExceptionPort,
596 ProcessAccessToken,
597 ProcessLdtInformation,
598 ProcessLdtSize,
599 ProcessDefaultHardErrorMode,
600 ProcessIoPortHandlers,
601 ProcessPooledUsageAndLimits,
602 ProcessWorkingSetWatch,
603 ProcessUserModeIOPL,
604 ProcessEnableAlignmentFaultFixup,
605 ProcessPriorityClass,
606 ProcessWx86Information,
607 ProcessHandleCount,
608 ProcessAffinityMask,
609 ProcessPriorityBoost,
610 ProcessDeviceMap,
611 ProcessSessionInformation,
612 ProcessForegroundInformation,
613 ProcessWow64Information,
614 ProcessImageFileName,
615 ProcessLUIDDeviceMapsEnabled,
616 ProcessBreakOnTermination,
617 ProcessDebugObjectHandle,
618 ProcessDebugFlags,
619 ProcessHandleTracing,
620 MaxProcessInfoClass
621 } PROCESSINFOCLASS;
622
623 /*
624 * Thread
625 */
626 typedef enum _THREADINFOCLASS
627 {
628 ThreadBasicInformation,
629 ThreadTimes,
630 ThreadPriority,
631 ThreadBasePriority,
632 ThreadAffinityMask,
633 ThreadImpersonationToken,
634 ThreadDescriptorTableEntry,
635 ThreadEnableAlignmentFaultFixup,
636 ThreadEventPair_Reusable,
637 ThreadQuerySetWin32StartAddress,
638 ThreadZeroTlsCell,
639 ThreadPerformanceCount,
640 ThreadAmILastThread,
641 ThreadIdealProcessor,
642 ThreadPriorityBoost,
643 ThreadSetTlsArrayAddress,
644 ThreadIsIoPending,
645 ThreadHideFromDebugger,
646 ThreadBreakOnTermination,
647 MaxThreadInfoClass
648 } THREADINFOCLASS;
649
650 /* TYPES *********************************************************************/
651
652 /* Basic Types that aren't defined in User-Mode Headers */
653 typedef CONST int CINT;
654 typedef CONST char *PCSZ;
655 typedef short CSHORT;
656 typedef CSHORT *PCSHORT;
657 typedef LARGE_INTEGER PHYSICAL_ADDRESS, *PPHYSICAL_ADDRESS;
658
659 /* Kernel Types used by Native APIs */
660 typedef LONG KPRIORITY;
661 typedef LONG NTSTATUS, *PNTSTATUS;
662 typedef UCHAR KIRQL, *PKIRQL;
663 typedef ULONG KAFFINITY, *PKAFFINITY;
664 typedef ULONG_PTR KSPIN_LOCK, *PKSPIN_LOCK;
665 typedef struct _PEB *PPEB;
666 typedef ULONG KPROCESSOR_MODE;
667 typedef struct _OBJECT_TYPE *POBJECT_TYPE;
668 struct _ETHREAD;
669 struct _CSR_API_MESSAGE;
670 typedef ULONG EXECUTION_STATE;
671
672 /* Basic NT Types */
673 #if !defined(_NTSECAPI_H) && !defined(_SUBAUTH_H)
674 typedef struct _UNICODE_STRING
675 {
676 USHORT Length;
677 USHORT MaximumLength;
678 PWSTR Buffer;
679 } UNICODE_STRING, *PUNICODE_STRING;
680 typedef const UNICODE_STRING* PCUNICODE_STRING;
681
682 typedef struct _STRING
683 {
684 USHORT Length;
685 USHORT MaximumLength;
686 PCHAR Buffer;
687 } STRING, *PSTRING;
688
689 typedef struct _OBJECT_ATTRIBUTES
690 {
691 ULONG Length;
692 HANDLE RootDirectory;
693 PUNICODE_STRING ObjectName;
694 ULONG Attributes;
695 PVOID SecurityDescriptor;
696 PVOID SecurityQualityOfService;
697 } OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;
698 #endif
699
700 typedef STRING ANSI_STRING;
701 typedef PSTRING PANSI_STRING;
702 typedef STRING OEM_STRING;
703 typedef PSTRING POEM_STRING;
704
705 typedef struct _IO_STATUS_BLOCK
706 {
707 union
708 {
709 NTSTATUS Status;
710 PVOID Pointer;
711 };
712 ULONG_PTR Information;
713 } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
714
715 typedef VOID NTAPI
716 (*PIO_APC_ROUTINE)(
717 IN PVOID ApcContext,
718 IN PIO_STATUS_BLOCK IoStatusBlock,
719 IN ULONG Reserved);
720
721 typedef VOID NTAPI
722 (*PKNORMAL_ROUTINE)(
723 IN PVOID NormalContext,
724 IN PVOID SystemArgument1,
725 IN PVOID SystemArgument2);
726
727 typedef VOID NTAPI
728 (*PTIMER_APC_ROUTINE)(
729 IN PVOID TimerContext,
730 IN ULONG TimerLowValue,
731 IN LONG TimerHighValue);
732
733 /* Kernel Types which are returned or used by Native API */
734 typedef struct _OBJECT_NAME_INFORMATION
735 {
736 UNICODE_STRING Name;
737 } OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
738
739 typedef struct _CLIENT_ID
740 {
741 HANDLE UniqueProcess;
742 HANDLE UniqueThread;
743 } CLIENT_ID, *PCLIENT_ID;
744
745 typedef struct _KSYSTEM_TIME
746 {
747 ULONG LowPart;
748 LONG High1Time;
749 LONG High2Time;
750 } KSYSTEM_TIME, *PKSYSTEM_TIME;
751
752 typedef struct _TIME_FIELDS
753 {
754 CSHORT Year;
755 CSHORT Month;
756 CSHORT Day;
757 CSHORT Hour;
758 CSHORT Minute;
759 CSHORT Second;
760 CSHORT Milliseconds;
761 CSHORT Weekday;
762 } TIME_FIELDS, *PTIME_FIELDS;
763
764 typedef struct _VM_COUNTERS
765 {
766 SIZE_T PeakVirtualSize;
767 SIZE_T VirtualSize;
768 ULONG PageFaultCount;
769 SIZE_T PeakWorkingSetSize;
770 SIZE_T WorkingSetSize;
771 SIZE_T QuotaPeakPagedPoolUsage;
772 SIZE_T QuotaPagedPoolUsage;
773 SIZE_T QuotaPeakNonPagedPoolUsage;
774 SIZE_T QuotaNonPagedPoolUsage;
775 SIZE_T PagefileUsage;
776 SIZE_T PeakPagefileUsage;
777 } VM_COUNTERS, *PVM_COUNTERS;
778
779 typedef struct _VM_COUNTERS_EX
780 {
781 SIZE_T PeakVirtualSize;
782 SIZE_T VirtualSize;
783 ULONG PageFaultCount;
784 SIZE_T PeakWorkingSetSize;
785 SIZE_T WorkingSetSize;
786 SIZE_T QuotaPeakPagedPoolUsage;
787 SIZE_T QuotaPagedPoolUsage;
788 SIZE_T QuotaPeakNonPagedPoolUsage;
789 SIZE_T QuotaNonPagedPoolUsage;
790 SIZE_T PagefileUsage;
791 SIZE_T PeakPagefileUsage;
792 SIZE_T PrivateUsage;
793 } VM_COUNTERS_EX, *PVM_COUNTERS_EX;
794
795 /**** Information Types ****/
796
797 /*
798 * Registry Key Set
799 */
800
801 /* Class 0 */
802 typedef struct _KEY_WRITE_TIME_INFORMATION
803 {
804 LARGE_INTEGER LastWriteTime;
805 } KEY_WRITE_TIME_INFORMATION, *PKEY_WRITE_TIME_INFORMATION;
806
807 /* Class 1 */
808 typedef struct _KEY_USER_FLAGS_INFORMATION
809 {
810 ULONG UserFlags;
811 } KEY_USER_FLAGS_INFORMATION, *PKEY_USER_FLAGS_INFORMATION;
812
813 typedef struct _KEY_FULL_INFORMATION
814 {
815 LARGE_INTEGER LastWriteTime;
816 ULONG TitleIndex;
817 ULONG ClassOffset;
818 ULONG ClassLength;
819 ULONG SubKeys;
820 ULONG MaxNameLen;
821 ULONG MaxClassLen;
822 ULONG Values;
823 ULONG MaxValueNameLen;
824 ULONG MaxValueDataLen;
825 WCHAR Class[1];
826 } KEY_FULL_INFORMATION, *PKEY_FULL_INFORMATION;
827
828 typedef struct _KEY_NODE_INFORMATION
829 {
830 LARGE_INTEGER LastWriteTime;
831 ULONG TitleIndex;
832 ULONG ClassOffset;
833 ULONG ClassLength;
834 ULONG NameLength;
835 WCHAR Name[1];
836 } KEY_NODE_INFORMATION, *PKEY_NODE_INFORMATION;
837
838 /*
839 * File
840 */
841
842 /* Class 1 */
843 typedef struct _FILE_BASIC_INFORMATION
844 {
845 LARGE_INTEGER CreationTime;
846 LARGE_INTEGER LastAccessTime;
847 LARGE_INTEGER LastWriteTime;
848 LARGE_INTEGER ChangeTime;
849 ULONG FileAttributes;
850 } FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION;
851
852 /* Class 2 */
853 typedef struct _FILE_STANDARD_INFORMATION
854 {
855 LARGE_INTEGER AllocationSize;
856 LARGE_INTEGER EndOfFile;
857 ULONG NumberOfLinks;
858 BOOLEAN DeletePending;
859 BOOLEAN Directory;
860 } FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;
861
862 typedef struct _FILE_NETWORK_OPEN_INFORMATION
863 {
864 LARGE_INTEGER CreationTime;
865 LARGE_INTEGER LastAccessTime;
866 LARGE_INTEGER LastWriteTime;
867 LARGE_INTEGER ChangeTime;
868 LARGE_INTEGER AllocationSize;
869 LARGE_INTEGER EndOfFile;
870 ULONG FileAttributes;
871 } FILE_NETWORK_OPEN_INFORMATION, *PFILE_NETWORK_OPEN_INFORMATION;
872
873 typedef struct _FILE_ZERO_DATA_INFORMATION
874 {
875 LARGE_INTEGER FileOffset;
876 LARGE_INTEGER BeyondFinalZero;
877 } FILE_ZERO_DATA_INFORMATION, *PFILE_ZERO_DATA_INFORMATION;
878
879 typedef struct _FILE_EA_INFORMATION
880 {
881 ULONG EaSize;
882 } FILE_EA_INFORMATION, *PFILE_EA_INFORMATION;
883
884 typedef struct _FILE_COMPRESSION_INFORMATION
885 {
886 LARGE_INTEGER CompressedFileSize;
887 USHORT CompressionFormat;
888 UCHAR CompressionUnitShift;
889 UCHAR ChunkShift;
890 UCHAR ClusterShift;
891 UCHAR Reserved[3];
892 } FILE_COMPRESSION_INFORMATION, *PFILE_COMPRESSION_INFORMATION;
893
894 typedef struct _FILE_POSITION_INFORMATION
895 {
896 LARGE_INTEGER CurrentByteOffset;
897 } FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION;
898
899 typedef struct _FILE_DISPOSITION_INFORMATION
900 {
901 BOOLEAN DeleteFile;
902 } FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION;
903
904 typedef struct FILE_ALLOCATED_RANGE_BUFFER
905 {
906 LARGE_INTEGER FileOffset;
907 LARGE_INTEGER Length;
908 } FILE_ALLOCATED_RANGE_BUFFER, *PFILE_ALLOCATED_RANGE_BUFFER;
909
910 typedef struct _FILE_FULL_EA_INFORMATION
911 {
912 ULONG NextEntryOffset;
913 UCHAR Flags;
914 UCHAR EaNameLength;
915 USHORT EaValueLength;
916 CHAR EaName[1];
917 } FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION;
918
919 typedef struct _FILE_QUOTA_INFORMATION
920 {
921 ULONG NextEntryOffset;
922 ULONG SidLength;
923 LARGE_INTEGER ChangeTime;
924 LARGE_INTEGER QuotaUsed;
925 LARGE_INTEGER QuotaThreshold;
926 LARGE_INTEGER QuotaLimit;
927 SID Sid;
928 } FILE_QUOTA_INFORMATION, *PFILE_QUOTA_INFORMATION;
929
930 typedef struct _FILE_INTERNAL_INFORMATION
931 {
932 LARGE_INTEGER IndexNumber;
933 } FILE_INTERNAL_INFORMATION, *PFILE_INTERNAL_INFORMATION;
934
935 typedef struct _FILE_RENAME_INFORMATION
936 {
937 BOOLEAN ReplaceIfExists;
938 HANDLE RootDirectory;
939 ULONG FileNameLength;
940 WCHAR FileName[1];
941 } FILE_RENAME_INFORMATION, *PFILE_RENAME_INFORMATION;
942
943 typedef struct _FILE_PIPE_INFORMATION
944 {
945 ULONG ReadMode;
946 ULONG CompletionMode;
947 } FILE_PIPE_INFORMATION, *PFILE_PIPE_INFORMATION;
948
949 typedef struct _FILE_PIPE_LOCAL_INFORMATION
950 {
951 ULONG NamedPipeType;
952 ULONG NamedPipeConfiguration;
953 ULONG MaximumInstances;
954 ULONG CurrentInstances;
955 ULONG InboundQuota;
956 ULONG ReadDataAvailable;
957 ULONG OutboundQuota;
958 ULONG WriteQuotaAvailable;
959 ULONG NamedPipeState;
960 ULONG NamedPipeEnd;
961 } FILE_PIPE_LOCAL_INFORMATION, *PFILE_PIPE_LOCAL_INFORMATION;
962
963 typedef struct _FILE_PIPE_REMOTE_INFORMATION
964 {
965 LARGE_INTEGER CollectDataTime;
966 ULONG MaximumCollectionCount;
967 } FILE_PIPE_REMOTE_INFORMATION, *PFILE_PIPE_REMOTE_INFORMATION;
968
969 typedef struct _FILE_MAILSLOT_QUERY_INFORMATION
970 {
971 ULONG MaximumMessageSize;
972 ULONG MailslotQuota;
973 ULONG NextMessageSize;
974 ULONG MessagesAvailable;
975 LARGE_INTEGER ReadTimeout;
976 } FILE_MAILSLOT_QUERY_INFORMATION, *PFILE_MAILSLOT_QUERY_INFORMATION;
977
978 typedef struct _FILE_MAILSLOT_SET_INFORMATION
979 {
980 LARGE_INTEGER ReadTimeout;
981 } FILE_MAILSLOT_SET_INFORMATION, *PFILE_MAILSLOT_SET_INFORMATION;
982
983 typedef struct _FILE_BOTH_DIR_INFORMATION
984 {
985 ULONG NextEntryOffset;
986 ULONG FileIndex;
987 LARGE_INTEGER CreationTime;
988 LARGE_INTEGER LastAccessTime;
989 LARGE_INTEGER LastWriteTime;
990 LARGE_INTEGER ChangeTime;
991 LARGE_INTEGER EndOfFile;
992 LARGE_INTEGER AllocationSize;
993 ULONG FileAttributes;
994 ULONG FileNameLength;
995 ULONG EaSize;
996 CCHAR ShortNameLength;
997 WCHAR ShortName[12];
998 WCHAR FileName[1];
999 } FILE_BOTH_DIR_INFORMATION, *PFILE_BOTH_DIR_INFORMATION;
1000
1001 typedef struct _FILE_COMPLETION_INFORMATION
1002 {
1003 HANDLE Port;
1004 PVOID Key;
1005 } FILE_COMPLETION_INFORMATION, *PFILE_COMPLETION_INFORMATION;
1006
1007 typedef struct _FILE_LINK_INFORMATION
1008 {
1009 BOOLEAN ReplaceIfExists;
1010 HANDLE RootDirectory;
1011 ULONG FileNameLength;
1012 WCHAR FileName[1];
1013 } FILE_LINK_INFORMATION, *PFILE_LINK_INFORMATION;
1014
1015 typedef struct _FILE_NAME_INFORMATION
1016 {
1017 ULONG FileNameLength;
1018 WCHAR FileName[1];
1019 } FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION;
1020
1021 typedef struct _FILE_ALLOCATION_INFORMATION
1022 {
1023 LARGE_INTEGER AllocationSize;
1024 } FILE_ALLOCATION_INFORMATION, *PFILE_ALLOCATION_INFORMATION;
1025
1026 typedef struct _FILE_END_OF_FILE_INFORMATION
1027 {
1028 LARGE_INTEGER EndOfFile;
1029 } FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION;
1030
1031 typedef struct _FILE_VALID_DATA_LENGTH_INFORMATION
1032 {
1033 LARGE_INTEGER ValidDataLength;
1034 } FILE_VALID_DATA_LENGTH_INFORMATION, *PFILE_VALID_DATA_LENGTH_INFORMATION;
1035
1036 /*
1037 * File System
1038 */
1039 typedef struct _FILE_FS_DEVICE_INFORMATION
1040 {
1041 DEVICE_TYPE DeviceType;
1042 ULONG Characteristics;
1043 } FILE_FS_DEVICE_INFORMATION, *PFILE_FS_DEVICE_INFORMATION;
1044
1045 typedef struct _FILE_FS_ATTRIBUTE_INFORMATION
1046 {
1047 ULONG FileSystemAttributes;
1048 ULONG MaximumComponentNameLength;
1049 ULONG FileSystemNameLength;
1050 WCHAR FileSystemName[1];
1051 } FILE_FS_ATTRIBUTE_INFORMATION, *PFILE_FS_ATTRIBUTE_INFORMATION;
1052
1053 typedef struct _FILE_FS_SIZE_INFORMATION
1054 {
1055 LARGE_INTEGER TotalAllocationUnits;
1056 LARGE_INTEGER AvailableAllocationUnits;
1057 ULONG SectorsPerAllocationUnit;
1058 ULONG BytesPerSector;
1059 } FILE_FS_SIZE_INFORMATION, *PFILE_FS_SIZE_INFORMATION;
1060
1061 typedef struct _FILE_FS_LABEL_INFORMATION
1062 {
1063 ULONG VolumeLabelLength;
1064 WCHAR VolumeLabel[1];
1065 } FILE_FS_LABEL_INFORMATION, *PFILE_FS_LABEL_INFORMATION;
1066
1067 typedef struct _FILE_FS_VOLUME_INFORMATION
1068 {
1069 LARGE_INTEGER VolumeCreationTime;
1070 ULONG VolumeSerialNumber;
1071 ULONG VolumeLabelLength;
1072 BOOLEAN SupportsObjects;
1073 WCHAR VolumeLabel[1];
1074 } FILE_FS_VOLUME_INFORMATION, *PFILE_FS_VOLUME_INFORMATION;
1075
1076 /*
1077 * Registry Key Value
1078 */
1079
1080 /* Class 0 */
1081 typedef struct _KEY_VALUE_ENTRY
1082 {
1083 PUNICODE_STRING ValueName;
1084 ULONG DataLength;
1085 ULONG DataOffset;
1086 ULONG Type;
1087 } KEY_VALUE_ENTRY, *PKEY_VALUE_ENTRY;
1088
1089 /* Class 1 */
1090 typedef struct _KEY_VALUE_PARTIAL_INFORMATION
1091 {
1092 ULONG TitleIndex;
1093 ULONG Type;
1094 ULONG DataLength;
1095 UCHAR Data[1];
1096 } KEY_VALUE_PARTIAL_INFORMATION, *PKEY_VALUE_PARTIAL_INFORMATION;
1097
1098 /* Class 2 */
1099 typedef struct _KEY_VALUE_BASIC_INFORMATION
1100 {
1101 ULONG TitleIndex;
1102 ULONG Type;
1103 ULONG NameLength;
1104 WCHAR Name[1];
1105 } KEY_VALUE_BASIC_INFORMATION, *PKEY_VALUE_BASIC_INFORMATION;
1106
1107 /* Class 3 */
1108 typedef struct _KEY_VALUE_FULL_INFORMATION
1109 {
1110 ULONG TitleIndex;
1111 ULONG Type;
1112 ULONG DataOffset;
1113 ULONG DataLength;
1114 ULONG NameLength;
1115 WCHAR Name[1];
1116 } KEY_VALUE_FULL_INFORMATION, *PKEY_VALUE_FULL_INFORMATION;
1117
1118 /*
1119 * Registry Key
1120 */
1121
1122 /* Class 0 */
1123 typedef struct _KEY_BASIC_INFORMATION
1124 {
1125 LARGE_INTEGER LastWriteTime;
1126 ULONG TitleIndex;
1127 ULONG NameLength;
1128 WCHAR Name[1];
1129 } KEY_BASIC_INFORMATION, *PKEY_BASIC_INFORMATION;
1130
1131 /* File Pipe Structures for the FSCTLs */
1132 typedef struct _FILE_PIPE_WAIT_FOR_BUFFER
1133 {
1134 LARGE_INTEGER Timeout;
1135 ULONG NameLength;
1136 BOOLEAN TimeoutSpecified;
1137 WCHAR Name[1];
1138 } FILE_PIPE_WAIT_FOR_BUFFER, *PFILE_PIPE_WAIT_FOR_BUFFER;
1139
1140 typedef struct _FILE_PIPE_PEEK_BUFFER
1141 {
1142 ULONG NamedPipeState;
1143 ULONG ReadDataAvailable;
1144 ULONG NumberOfMessages;
1145 ULONG MessageLength;
1146 CHAR Data[1];
1147 } FILE_PIPE_PEEK_BUFFER, *PFILE_PIPE_PEEK_BUFFER;
1148
1149 /* The Kerner/User Shared Data Structure */
1150 typedef struct _KUSER_SHARED_DATA
1151 {
1152 ULONG TickCountLowDeprecated;
1153 ULONG TickCountMultiplier;
1154 volatile KSYSTEM_TIME InterruptTime;
1155 volatile KSYSTEM_TIME SystemTime;
1156 volatile KSYSTEM_TIME TimeZoneBias;
1157 USHORT ImageNumberLow;
1158 USHORT ImageNumberHigh;
1159 WCHAR NtSystemRoot[260];
1160 ULONG MaxStackTraceDepth;
1161 ULONG CryptoExponent;
1162 ULONG TimeZoneId;
1163 ULONG LargePageMinimum;
1164 ULONG Reserved2[7];
1165 NT_PRODUCT_TYPE NtProductType;
1166 BOOLEAN ProductTypeIsValid;
1167 ULONG NtMajorVersion;
1168 ULONG NtMinorVersion;
1169 BOOLEAN ProcessorFeatures[PROCESSOR_FEATURE_MAX];
1170 ULONG Reserved1;
1171 ULONG Reserved3;
1172 volatile ULONG TimeSlip;
1173 ALTERNATIVE_ARCHITECTURE_TYPE AlternativeArchitecture;
1174 LARGE_INTEGER SystemExpirationDate;
1175 ULONG SuiteMask;
1176 BOOLEAN KdDebuggerEnabled;
1177 volatile ULONG ActiveConsoleId;
1178 volatile ULONG DismountCount;
1179 ULONG ComPlusPackage;
1180 ULONG LastSystemRITEventTickCount;
1181 ULONG NumberOfPhysicalPages;
1182 BOOLEAN SafeBootMode;
1183 ULONG TraceLogging;
1184 ULONGLONG Fill0;
1185 ULONGLONG SystemCall[4];
1186 union {
1187 volatile KSYSTEM_TIME TickCount;
1188 volatile ULONG64 TickCountQuad;
1189 };
1190 } KUSER_SHARED_DATA, *PKUSER_SHARED_DATA;
1191
1192 /* Run-Time Library (RTL) Types */
1193 typedef struct _RTL_BITMAP
1194 {
1195 ULONG SizeOfBitMap;
1196 PULONG Buffer;
1197 } RTL_BITMAP, *PRTL_BITMAP;
1198
1199 typedef struct _RTL_BITMAP_RUN
1200 {
1201 ULONG StartingIndex;
1202 ULONG NumberOfBits;
1203 } RTL_BITMAP_RUN, *PRTL_BITMAP_RUN;
1204
1205 typedef struct _COMPRESSED_DATA_INFO
1206 {
1207 USHORT CompressionFormatAndEngine;
1208 UCHAR CompressionUnitShift;
1209 UCHAR ChunkShift;
1210 UCHAR ClusterShift;
1211 UCHAR Reserved;
1212 USHORT NumberOfChunks;
1213 ULONG CompressedChunkSizes[ANYSIZE_ARRAY];
1214 } COMPRESSED_DATA_INFO, *PCOMPRESSED_DATA_INFO;
1215
1216 typedef struct _GENERATE_NAME_CONTEXT
1217 {
1218 USHORT Checksum;
1219 BOOLEAN CheckSumInserted;
1220 UCHAR NameLength;
1221 WCHAR NameBuffer[8];
1222 ULONG ExtensionLength;
1223 WCHAR ExtensionBuffer[4];
1224 ULONG LastIndexValue;
1225 } GENERATE_NAME_CONTEXT, *PGENERATE_NAME_CONTEXT;
1226
1227 typedef struct _RTL_SPLAY_LINKS
1228 {
1229 struct _RTL_SPLAY_LINKS *Parent;
1230 struct _RTL_SPLAY_LINKS *LeftChild;
1231 struct _RTL_SPLAY_LINKS *RightChild;
1232 } RTL_SPLAY_LINKS, *PRTL_SPLAY_LINKS;
1233
1234 struct _RTL_AVL_TABLE;
1235 struct _RTL_GENERIC_TABLE;
1236
1237 typedef NTSTATUS STDCALL
1238 (*PRTL_AVL_MATCH_FUNCTION)(
1239 struct _RTL_AVL_TABLE *Table,
1240 PVOID UserData,
1241 PVOID MatchData
1242 );
1243
1244 typedef RTL_GENERIC_COMPARE_RESULTS STDCALL
1245 (*PRTL_AVL_COMPARE_ROUTINE) (
1246 struct _RTL_AVL_TABLE *Table,
1247 PVOID FirstStruct,
1248 PVOID SecondStruct
1249 );
1250
1251 typedef RTL_GENERIC_COMPARE_RESULTS STDCALL
1252 (*PRTL_GENERIC_COMPARE_ROUTINE) (
1253 struct _RTL_GENERIC_TABLE *Table,
1254 PVOID FirstStruct,
1255 PVOID SecondStruct
1256 );
1257
1258 typedef PVOID STDCALL
1259 (*PRTL_GENERIC_ALLOCATE_ROUTINE) (
1260 struct _RTL_GENERIC_TABLE *Table,
1261 LONG ByteSize
1262 );
1263
1264 typedef VOID STDCALL
1265 (*PRTL_GENERIC_FREE_ROUTINE) (
1266 struct _RTL_GENERIC_TABLE *Table,
1267 PVOID Buffer
1268 );
1269
1270 typedef VOID STDCALL
1271 (*PRTL_AVL_ALLOCATE_ROUTINE) (
1272 struct _RTL_AVL_TABLE *Table,
1273 LONG ByteSize
1274 );
1275
1276 typedef VOID STDCALL
1277 (*PRTL_AVL_FREE_ROUTINE) (
1278 struct _RTL_AVL_TABLE *Table,
1279 PVOID Buffer
1280 );
1281
1282 typedef struct _RTL_GENERIC_TABLE
1283 {
1284 PRTL_SPLAY_LINKS TableRoot;
1285 LIST_ENTRY InsertOrderList;
1286 PLIST_ENTRY OrderedPointer;
1287 ULONG WhichOrderedElement;
1288 ULONG NumberGenericTableElements;
1289 PRTL_GENERIC_COMPARE_ROUTINE CompareRoutine;
1290 PRTL_GENERIC_ALLOCATE_ROUTINE AllocateRoutine;
1291 PRTL_GENERIC_FREE_ROUTINE FreeRoutine;
1292 PVOID TableContext;
1293 } RTL_GENERIC_TABLE, *PRTL_GENERIC_TABLE;
1294
1295 typedef struct _RTL_BALANCED_LINKS
1296 {
1297 struct _RTL_BALANCED_LINKS *Parent;
1298 struct _RTL_BALANCED_LINKS *LeftChild;
1299 struct _RTL_BALANCED_LINKS *RightChild;
1300 CHAR Balance;
1301 UCHAR Reserved[3];
1302 } RTL_BALANCED_LINKS, *PRTL_BALANCED_LINKS;
1303
1304 typedef struct _RTL_AVL_TABLE
1305 {
1306 RTL_BALANCED_LINKS BalancedRoot;
1307 PVOID OrderedPointer;
1308 ULONG WhichOrderedElement;
1309 ULONG NumberGenericTableElements;
1310 ULONG DepthOfTree;
1311 PRTL_BALANCED_LINKS RestartKey;
1312 ULONG DeleteCount;
1313 PRTL_AVL_COMPARE_ROUTINE CompareRoutine;
1314 PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine;
1315 PRTL_AVL_FREE_ROUTINE FreeRoutine;
1316 PVOID TableContext;
1317 } RTL_AVL_TABLE, *PRTL_AVL_TABLE;
1318
1319 typedef NTSTATUS STDCALL
1320 (*PRTL_QUERY_REGISTRY_ROUTINE)(
1321 IN PWSTR ValueName,
1322 IN ULONG ValueType,
1323 IN PVOID ValueData,
1324 IN ULONG ValueLength,
1325 IN PVOID Context,
1326 IN PVOID EntryContext
1327 );
1328
1329 typedef struct _RTL_QUERY_REGISTRY_TABLE
1330 {
1331 PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine;
1332 ULONG Flags;
1333 PWSTR Name;
1334 PVOID EntryContext;
1335 ULONG DefaultType;
1336 PVOID DefaultData;
1337 ULONG DefaultLength;
1338 } RTL_QUERY_REGISTRY_TABLE, *PRTL_QUERY_REGISTRY_TABLE;
1339
1340 typedef struct _UNICODE_PREFIX_TABLE_ENTRY
1341 {
1342 CSHORT NodeTypeCode;
1343 CSHORT NameLength;
1344 struct _UNICODE_PREFIX_TABLE_ENTRY *NextPrefixTree;
1345 struct _UNICODE_PREFIX_TABLE_ENTRY *CaseMatch;
1346 RTL_SPLAY_LINKS Links;
1347 PUNICODE_STRING Prefix;
1348 } UNICODE_PREFIX_TABLE_ENTRY, *PUNICODE_PREFIX_TABLE_ENTRY;
1349
1350 typedef struct _UNICODE_PREFIX_TABLE
1351 {
1352 CSHORT NodeTypeCode;
1353 CSHORT NameLength;
1354 PUNICODE_PREFIX_TABLE_ENTRY NextPrefixTree;
1355 PUNICODE_PREFIX_TABLE_ENTRY LastNextEntry;
1356 } UNICODE_PREFIX_TABLE, *PUNICODE_PREFIX_TABLE;
1357
1358 typedef OSVERSIONINFOW RTL_OSVERSIONINFOW;
1359 typedef LPOSVERSIONINFOW PRTL_OSVERSIONINFOW;
1360 typedef OSVERSIONINFOEXW RTL_OSVERSIONINFOEXW;
1361 typedef LPOSVERSIONINFOEXW PRTL_OSVERSIONINFOEXW;
1362
1363 #endif