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