+FSCTL_DISMOUNT_VOLUME define
[reactos.git] / include / ntos / zwtypes.h
1 #ifndef __INCLUDE_DDK_ZWTYPES_H
2 #define __INCLUDE_DDK_ZWTYPES_H
3
4 #ifndef __USE_W32API
5
6 typedef enum _DEBUG_CONTROL_CODE
7 {
8   DebugGetTraceInformation = 1,
9   DebugSetInternalBreakpoint,
10   DebugSetSpecialCalls,
11   DebugClearSpecialCalls,
12   DebugQuerySpecialCalls,
13   DebugDbgBreakPoint,
14   DebugDbgLoadSymbols
15 } DEBUG_CONTROL_CODE;
16
17 typedef enum _KPROFILE_SOURCE
18 {
19   ProfileTime
20 } KPROFILE_SOURCE;
21
22 // file disposition values
23
24 #define FILE_SUPERSEDE                  0x0000
25 #define FILE_OPEN                       0x0001
26 #define FILE_CREATE                     0x0002
27 #define FILE_OPEN_IF                    0x0003
28 #define FILE_OVERWRITE                  0x0004
29 #define FILE_OVERWRITE_IF               0x0005
30 #define FILE_MAXIMUM_DISPOSITION        0x0005
31
32 // job query / set information class
33
34 typedef enum _JOBOBJECTINFOCLASS {               // Q S
35     JobObjectBasicAccountingInformation = 1,     // Y N
36     JobObjectBasicLimitInformation,              // Y Y
37     JobObjectBasicProcessIdList,                 // Y N
38     JobObjectBasicUIRestrictions,                // Y Y
39     JobObjectSecurityLimitInformation,           // Y Y
40     JobObjectEndOfJobTimeInformation,            // N Y
41     JobObjectAssociateCompletionPortInformation, // N Y
42     JobObjectBasicAndIoAccountingInformation,    // Y N
43     JobObjectExtendedLimitInformation,           // Y Y
44 } JOBOBJECTINFOCLASS;
45
46 // system information
47 // {Nt|Zw}{Query|Set}SystemInformation
48 // (GN means Gary Nebbet in "NT/W2K Native API Reference")
49
50 typedef
51 enum _SYSTEM_INFORMATION_CLASS
52 {
53         SystemInformationClassMin               = 0,
54         SystemBasicInformation                  = 0,    /* Q */
55         
56         SystemProcessorInformation              = 1,    /* Q */
57         
58         SystemPerformanceInformation            = 2,    /* Q */
59         
60         SystemTimeOfDayInformation              = 3,    /* Q */
61         
62         SystemPathInformation                   = 4,    /* Q (checked build only) */
63         SystemNotImplemented1                   = 4,    /* Q (GN) */
64         
65         SystemProcessInformation                = 5,    /* Q */
66         SystemProcessesAndThreadsInformation    = 5,    /* Q (GN) */
67         
68         SystemCallCountInfoInformation          = 6,    /* Q */
69         SystemCallCounts                        = 6,    /* Q (GN) */
70         
71         SystemDeviceInformation                 = 7,    /* Q */
72 // It conflicts with symbol in ntoskrnl/io/resource.c
73 //      SystemConfigurationInformation          = 7,    /* Q (GN) */
74         
75         SystemProcessorPerformanceInformation   = 8,    /* Q */
76         SystemProcessorTimes                    = 8,    /* Q (GN) */
77         
78         SystemFlagsInformation                  = 9,    /* QS */
79         SystemGlobalFlag                        = 9,    /* QS (GN) */
80         
81         SystemCallTimeInformation               = 10,
82         SystemNotImplemented2                   = 10,   /* (GN) */
83         
84         SystemModuleInformation                 = 11,   /* Q */
85         
86         SystemLocksInformation                  = 12,   /* Q */
87         SystemLockInformation                   = 12,   /* Q (GN) */
88         
89         SystemStackTraceInformation             = 13,
90         SystemNotImplemented3                   = 13,   /* Q (GN) */
91         
92         SystemPagedPoolInformation              = 14,
93         SystemNotImplemented4                   = 14,   /* Q (GN) */
94         
95         SystemNonPagedPoolInformation           = 15,
96         SystemNotImplemented5                   = 15,   /* Q (GN) */
97         
98         SystemHandleInformation                 = 16,   /* Q */
99         
100         SystemObjectInformation                 = 17,   /* Q */
101         
102         SystemPageFileInformation               = 18,   /* Q */
103         SystemPagefileInformation               = 18,   /* Q (GN) */
104         
105         SystemVdmInstemulInformation            = 19,   /* Q */
106         SystemInstructionEmulationCounts        = 19,   /* Q (GN) */
107         
108         SystemVdmBopInformation                 = 20,
109         SystemInvalidInfoClass1                 = 20,   /* (GN) */
110         
111         SystemFileCacheInformation              = 21,   /* QS */
112         SystemCacheInformation                  = 21,   /* QS (GN) */
113         
114         SystemPoolTagInformation                = 22,   /* Q (checked build only) */
115         
116         SystemInterruptInformation              = 23,   /* Q */
117         SystemProcessorStatistics               = 23,   /* Q (GN) */
118         
119         SystemDpcBehaviourInformation           = 24,   /* QS */
120         SystemDpcInformation                    = 24,   /* QS (GN) */
121         
122         SystemFullMemoryInformation             = 25,
123         SystemNotImplemented6                   = 25,   /* (GN) */
124         
125         SystemLoadImage                         = 26,   /* S (callable) (GN) */
126         
127         SystemUnloadImage                       = 27,   /* S (callable) (GN) */
128         
129         SystemTimeAdjustmentInformation         = 28,   /* QS */
130         SystemTimeAdjustment                    = 28,   /* QS (GN) */
131         
132         SystemSummaryMemoryInformation          = 29,
133         SystemNotImplemented7                   = 29,   /* (GN) */
134         
135         SystemNextEventIdInformation            = 30,
136         SystemNotImplemented8                   = 30,   /* (GN) */
137         
138         SystemEventIdsInformation               = 31,
139         SystemNotImplemented9                   = 31,   /* (GN) */
140         
141         SystemCrashDumpInformation              = 32,   /* Q */
142         
143         SystemExceptionInformation              = 33,   /* Q */
144         
145         SystemCrashDumpStateInformation         = 34,   /* Q */
146         
147         SystemKernelDebuggerInformation         = 35,   /* Q */
148         
149         SystemContextSwitchInformation          = 36,   /* Q */
150         
151         SystemRegistryQuotaInformation          = 37,   /* QS */
152         
153         SystemLoadAndCallImage                  = 38,   /* S (GN) */
154         
155         SystemPrioritySeparation                = 39,   /* S */
156         
157         SystemPlugPlayBusInformation            = 40,
158         SystemNotImplemented10                  = 40,   /* Q (GN) */
159         
160         SystemDockInformation                   = 41,
161         SystemNotImplemented11                  = 41,   /* Q (GN) */
162         
163         SystemPowerInformation                  = 42,
164         SystemInvalidInfoClass2                 = 42,   /* (GN) */
165         
166         SystemProcessorSpeedInformation         = 43,
167         SystemInvalidInfoClass3                 = 43,   /* (GN) */
168         
169         SystemCurrentTimeZoneInformation        = 44,   /* QS */
170         SystemTimeZoneInformation               = 44,   /* QS (GN) */
171         
172         SystemLookasideInformation              = 45,   /* Q */
173         
174         SystemSetTimeSlipEvent                  = 46,   /* S (GN) */
175         
176         SystemCreateSession                     = 47,   /* S (GN) */
177         
178         SystemDeleteSession                     = 48,   /* S (GN) */
179         
180         SystemInvalidInfoClass4                 = 49,   /* (GN) */
181         
182         SystemRangeStartInformation             = 50,   /* Q (GN) */
183         
184         SystemVerifierInformation               = 51,   /* QS (GN) */
185         
186         SystemAddVerifier                       = 52,   /* S (GN) */
187         
188         SystemSessionProcessesInformation       = 53,   /* Q (GN) */
189         SystemInformationClassMax
190
191 } SYSTEM_INFORMATION_CLASS;
192
193 // SystemBasicInformation (0)
194 typedef
195 struct _SYSTEM_BASIC_INFORMATION
196 {
197         ULONG           Reserved;
198         ULONG           TimerResolution;
199         ULONG           PageSize;
200         ULONG           NumberOfPhysicalPages;
201         ULONG           LowestPhysicalPageNumber;
202         ULONG           HighestPhysicalPageNumber;
203         ULONG           AllocationGranularity;
204         ULONG           MinimumUserModeAddress;
205         ULONG           MaximumUserModeAddress;
206         KAFFINITY       ActiveProcessorsAffinityMask;
207         CCHAR           NumberOfProcessors;
208 } SYSTEM_BASIC_INFORMATION, *PSYSTEM_BASIC_INFORMATION;
209
210 // SystemProcessorInformation (1)
211 typedef
212 struct _SYSTEM_PROCESSOR_INFORMATION
213 {
214         USHORT  ProcessorArchitecture;
215         USHORT  ProcessorLevel;
216         USHORT  ProcessorRevision;
217         USHORT  Reserved;
218         ULONG   ProcessorFeatureBits;
219 } SYSTEM_PROCESSOR_INFORMATION, *PSYSTEM_PROCESSOR_INFORMATION;
220
221 // SystemPerformanceInfo (2)
222 typedef
223 struct _SYSTEM_PERFORMANCE_INFORMATION
224 {
225         LARGE_INTEGER   IdleProcessorTime;
226         LARGE_INTEGER   IoReadTransferCount;
227         LARGE_INTEGER   IoWriteTransferCount;
228         LARGE_INTEGER   IoOtherTransferCount;
229         ULONG           IoReadOperationCount;
230         ULONG           IoWriteOperationCount;
231         ULONG           IoOtherOperationCount;
232         ULONG           AvailablePages;
233         ULONG           CommitedPages;
234         ULONG           CommitLimit;
235         ULONG           PeakCommitment;
236         ULONG           PageFaultCount;
237         ULONG           CopyOnWriteCount;
238         ULONG           TransitionCount;
239         ULONG           CacheTransitionCount;
240         ULONG           DemandZeroCount;
241         ULONG           PageReadCount;
242         ULONG           PageReadIoCount;
243         ULONG           CacheReadCount;
244         ULONG           CacheIoCount;
245         ULONG           DirtyPagesWriteCount;
246         ULONG           DirtyWriteIoCount;
247         ULONG           MappedPagesWriteCount;
248         ULONG           MappedWriteIoCount;
249         ULONG           PagedPoolPages;
250         ULONG           NonPagedPoolPages;
251         ULONG           Unknown6;
252         ULONG           Unknown7;
253         ULONG           Unknown8;
254         ULONG           Unknown9;
255         ULONG           MmTotalSystemFreePtes;
256         ULONG           MmSystemCodepage;
257         ULONG           MmTotalSystemDriverPages;
258         ULONG           MmTotalSystemCodePages;
259         ULONG           Unknown10;
260         ULONG           Unknown11;
261         ULONG           Unknown12;
262         ULONG           MmSystemCachePage;
263         ULONG           MmPagedPoolPage;
264         ULONG           MmSystemDriverPage;
265         ULONG           CcFastReadNoWait;
266         ULONG           CcFastReadWait;
267         ULONG           CcFastReadResourceMiss;
268         ULONG           CcFastReadNotPossible;
269         ULONG           CcFastMdlReadNoWait;
270         ULONG           CcFastMdlReadWait;
271         ULONG           CcFastMdlReadResourceMiss;
272         ULONG           CcFastMdlReadNotPossible;
273         ULONG           CcMapDataNoWait;
274         ULONG           CcMapDataWait;
275         ULONG           CcMapDataNoWaitMiss;
276         ULONG           CcMapDataWaitMiss;
277         ULONG           CcPinMappedDataCount;
278         ULONG           CcPinReadNoWait;
279         ULONG           CcPinReadWait;
280         ULONG           CcPinReadNoWaitMiss;
281         ULONG           CcPinReadWaitMiss;
282         ULONG           CcCopyReadNoWait;
283         ULONG           CcCopyReadWait;
284         ULONG           CcCopyReadNoWaitMiss;
285         ULONG           CcCopyReadWaitMiss;
286         ULONG           CcMdlReadNoWait;
287         ULONG           CcMdlReadWait;
288         ULONG           CcMdlReadNoWaitMiss;
289         ULONG           CcMdlReadWaitMiss;
290         ULONG           CcReadaheadIos;
291         ULONG           CcLazyWriteIos;
292         ULONG           CcLazyWritePages;
293         ULONG           CcDataFlushes;
294         ULONG           CcDataPages;
295         ULONG           ContextSwitches;
296         ULONG           Unknown13;
297         ULONG           Unknown14;
298         ULONG           SystemCalls;
299
300 } SYSTEM_PERFORMANCE_INFO, *PSYSTEM_PERFORMANCE_INFO;
301
302 // SystemModuleInformation (11)
303 typedef
304 struct _SYSTEM_MODULE_INFORMATION
305 {
306  ULONG Reserved[2];
307  PVOID Base;
308  SIZE_T Size;
309  ULONG Flags;
310  USHORT Index;
311  USHORT Unknown;
312  USHORT LoadCount;
313  USHORT ModuleNameOffset;
314  CHAR ImageName[256];
315 #if 0
316         ULONG   Unknown1;
317         ULONG   Unknown2;
318         PVOID   BaseAddress;
319         ULONG   Size;
320         ULONG   Flags;
321         ULONG   EntryIndex;
322         USHORT  NameLength; /* Length of module name not including the path, this field contains valid value only for NTOSKRNL module*/
323         USHORT  PathLength; /* Length of 'directory path' part of modulename*/
324         CHAR    Name [256];
325 #endif
326 } SYSTEM_MODULE_INFORMATION, * PSYSTEM_MODULE_INFORMATION;
327
328 typedef
329 struct _SYSTEM_MODULES
330 {
331  SIZE_T Count;
332  SYSTEM_MODULE_INFORMATION Modules[ANYSIZE_ARRAY];
333 } SYSTEM_MODULES, *PSYSTEM_MODULES;
334
335 // SystemHandleInformation (16)
336 // (see ontypes.h)
337 typedef
338 struct _SYSTEM_HANDLE_ENTRY
339 {
340         ULONG   OwnerPid;
341         BYTE    ObjectType;
342         BYTE    HandleFlags;
343         USHORT  HandleValue;
344         PVOID   ObjectPointer;
345         ULONG   AccessMask;
346         
347 } SYSTEM_HANDLE_ENTRY, *PSYSTEM_HANDLE_ENTRY;
348
349 typedef
350 struct _SYSTEM_HANDLE_INFORMATION
351 {
352         ULONG                   Count;
353         SYSTEM_HANDLE_ENTRY     Handle [1];
354         
355 } SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
356
357 // SystemObjectInformation (17)
358 typedef
359 struct _SYSTEM_OBJECT_TYPE_INFORMATION
360 {
361         ULONG           NextEntryOffset;
362         ULONG           ObjectCount;
363         ULONG           HandleCount;
364         ULONG           TypeNumber;
365         ULONG           InvalidAttributes;
366         GENERIC_MAPPING GenericMapping;
367         ACCESS_MASK     ValidAccessMask;
368         POOL_TYPE       PoolType;
369         UCHAR           Unknown;
370         UNICODE_STRING  Name;
371         
372 } SYSTEM_OBJECT_TYPE_INFORMATION, *PSYSTEM_OBJECT_TYPE_INFORMATION;
373
374 typedef
375 struct _SYSTEM_OBJECT_INFORMATION
376 {
377         ULONG                   NextEntryOffset;
378         PVOID                   Object;
379         ULONG                   CreatorProcessId;
380         USHORT                  Unknown;
381         USHORT                  Flags;
382         ULONG                   PointerCount;
383         ULONG                   HandleCount;
384         ULONG                   PagedPoolUsage;
385         ULONG                   NonPagedPoolUsage;
386         ULONG                   ExclusiveProcessId;
387         PSECURITY_DESCRIPTOR    SecurityDescriptor;
388         UNICODE_STRING          Name;
389
390 } SYSTEM_OBJECT_INFORMATION, *PSYSTEM_OBJECT_INFORMATION;
391
392 // SystemPageFileInformation (18)
393 typedef
394 struct _SYSTEM_PAGEFILE_INFORMATION
395 {
396         ULONG           RelativeOffset;
397         ULONG           CurrentSizePages;
398         ULONG           TotalUsedPages;
399         ULONG           PeakUsedPages;
400         UNICODE_STRING  PagefileFileName;
401         
402 } SYSTEM_PAGEFILE_INFORMATION, *PSYSTEM_PAGEFILE_INFORMATION;
403
404 // SystemCacheInformation (21)
405 typedef
406 struct _SYSTEM_CACHE_INFORMATION
407 {
408         ULONG   CurrentSize;
409         ULONG   PeakSize;
410         ULONG   PageFaultCount;
411         ULONG   MinimumWorkingSet;
412         ULONG   MaximumWorkingSet;
413         ULONG   Unused[4];
414
415 } SYSTEM_CACHE_INFORMATION;
416
417 // SystemDpcInformation (24)
418 typedef
419 struct _SYSTEM_DPC_INFORMATION
420 {
421         ULONG   Unused;
422         ULONG   KiMaximumDpcQueueDepth;
423         ULONG   KiMinimumDpcRate;
424         ULONG   KiAdjustDpcThreshold;
425         ULONG   KiIdealDpcRate;
426
427 } SYSTEM_DPC_INFORMATION, *PSYSTEM_DPC_INFORMATION;
428
429 // SystemLoadImage (26)
430 typedef struct _SYSTEM_LOAD_IMAGE
431 {
432   UNICODE_STRING ModuleName;
433   PVOID ModuleBase;
434   PVOID SectionPointer;
435   PVOID EntryPoint;
436   PVOID ExportDirectory;
437 } SYSTEM_LOAD_IMAGE, *PSYSTEM_LOAD_IMAGE;
438
439 // SystemUnloadImage (27)
440 typedef struct _SYSTEM_UNLOAD_IMAGE
441 {
442   PVOID ModuleBase;
443 } SYSTEM_UNLOAD_IMAGE, *PSYSTEM_UNLOAD_IMAGE;
444
445 // SystemTimeAdjustmentInformation (28)
446 typedef
447 struct _SYSTEM_QUERY_TIME_ADJUSTMENT
448 {
449         ULONG   TimeAdjustment;
450         ULONG   MaximumIncrement;
451         BOOLEAN TimeSynchronization;
452
453 } SYSTEM_QUERY_TIME_ADJUSTMENT, *PSYSTEM_QUERY_TIME_ADJUSTMENT;
454
455 typedef
456 struct _SYSTEM_SET_TIME_ADJUSTMENT
457 {
458         ULONG   TimeAdjustment;
459         BOOLEAN TimeSynchronization;
460         
461 } SYSTEM_TIME_ADJUSTMENT_INFO, *PSYSTEM_TIME_ADJUSTMENT_INFO;
462
463 // atom information
464
465 typedef enum _ATOM_INFORMATION_CLASS
466 {
467    AtomBasicInformation         = 0,
468    AtomTableInformation         = 1,
469 } ATOM_INFORMATION_CLASS;
470
471 typedef struct _ATOM_BASIC_INFORMATION
472 {
473    USHORT UsageCount;
474    USHORT Flags;
475    USHORT NameLength;
476    WCHAR Name[1];
477 } ATOM_BASIC_INFORMATION, *PATOM_BASIC_INFORMATION;
478
479 // SystemLoadAndCallImage(38)
480 typedef struct _SYSTEM_LOAD_AND_CALL_IMAGE
481 {
482   UNICODE_STRING ModuleName;
483 } SYSTEM_LOAD_AND_CALL_IMAGE, *PSYSTEM_LOAD_AND_CALL_IMAGE;
484
485 // SystemTimeZoneInformation (44)
486 typedef
487 struct _SYSTEM_TIME_ZONE_INFORMATION
488 {
489         LONG    Bias;
490         WCHAR   StandardName [32];
491         TIME    StandardDate;
492         LONG    StandardBias;
493         WCHAR   DaylightName [32];
494         TIME    DaylightDate;
495         LONG    DaylightBias;
496
497 } SYSTEM_TIME_ZONE_INFORMATION, * PSYSTEM_TIME_ZONE_INFORMATION;
498
499 // SystemLookasideInformation (45)
500 typedef
501 struct _SYSTEM_LOOKASIDE_INFORMATION
502 {
503         USHORT          Depth;
504         USHORT          MaximumDepth;
505         ULONG           TotalAllocates;
506         ULONG           AllocatesMisses;
507         ULONG           TotalFrees;
508         ULONG           FreeMisses;
509         POOL_TYPE       Type;
510         ULONG           Tag;
511         ULONG           Size;
512         
513 } SYSTEM_LOOKASIDE_INFORMATION, * PSYSTEM_LOOKASIDE_INFORMATION;
514
515 // SystemSetTimeSlipEvent (46)
516 typedef
517 struct _SYSTEM_SET_TIME_SLIP_EVENT
518 {
519         HANDLE  TimeSlipEvent; /* IN */
520
521 } SYSTEM_SET_TIME_SLIP_EVENT, * PSYSTEM_SET_TIME_SLIP_EVENT;
522
523 // SystemCreateSession (47)
524 // (available only on TSE/NT5+)
525 typedef
526 struct _SYSTEM_CREATE_SESSION
527 {
528         ULONG   SessionId; /* OUT */
529
530 } SYSTEM_CREATE_SESSION, * PSYSTEM_CREATE_SESSION;
531
532 // SystemDeleteSession (48)
533 // (available only on TSE/NT5+)
534 typedef
535 struct _SYSTEM_DELETE_SESSION
536 {
537         ULONG   SessionId; /* IN */
538
539 } SYSTEM_DELETE_SESSION, * PSYSTEM_DELETE_SESSION;
540
541 // SystemRangeStartInformation (50)
542 typedef
543 struct _SYSTEM_RANGE_START_INFORMATION
544 {
545         PVOID   SystemRangeStart;
546
547 } SYSTEM_RANGE_START_INFORMATION, * PSYSTEM_RANGE_START_INFORMATION;
548
549 // SystemSessionProcessesInformation (53)
550 // (available only on TSE/NT5+)
551 typedef
552 struct _SYSTEM_SESSION_PROCESSES_INFORMATION
553 {
554         ULONG   SessionId;
555         ULONG   BufferSize;
556         PVOID   Buffer; /* same format as in SystemProcessInformation */
557
558 } SYSTEM_SESSION_PROCESSES_INFORMATION, * PSYSTEM_SESSION_PROCESSES_INFORMATION;
559
560 // memory information
561
562 typedef enum _MEMORY_INFORMATION_CLASS {
563  MemoryBasicInformation,
564  MemoryWorkingSetList,
565  MemorySectionName //,
566  //MemoryBasicVlmInformation //???
567 } MEMORY_INFORMATION_CLASS;
568
569 typedef struct _MEMORY_BASIC_INFORMATION { // Information Class 0
570  PVOID BaseAddress;
571  PVOID AllocationBase;
572  ULONG AllocationProtect;
573  ULONG RegionSize;
574  ULONG State;
575  ULONG Protect;
576  ULONG Type;
577 } MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION;
578
579 typedef struct _MEMORY_WORKING_SET_LIST { // Information Class 1
580  ULONG NumberOfPages;
581  ULONG WorkingSetList[1];
582 } MEMORY_WORKING_SET_LIST, *PMEMORY_WORKING_SET_LIST;
583
584 // Information Class 2
585 #define _MEMORY_SECTION_NAME_STATIC(__bufsize__) \
586  { \
587  UNICODE_STRING SectionFileName; \
588  WCHAR          NameBuffer[(__bufsize__)]; \
589
590
591 #define MEMORY_SECTION_NAME_STATIC(__bufsize__) \
592  struct _MEMORY_SECTION_NAME_STATIC((__bufsize__) 
593
594 typedef struct _MEMORY_SECTION_NAME_STATIC(ANYSIZE_ARRAY)
595  MEMORY_SECTION_NAME, *PMEMORY_SECTION_NAME;
596
597 // Information class 0
598 typedef struct _PROCESS_BASIC_INFORMATION
599 {
600         NTSTATUS ExitStatus;
601         PPEB PebBaseAddress;
602         KAFFINITY AffinityMask;
603         KPRIORITY BasePriority;
604         ULONG UniqueProcessId;
605         ULONG InheritedFromUniqueProcessId;
606 } PROCESS_BASIC_INFORMATION, *PPROCESS_BASIC_INFORMATION;
607
608 // Information class 1
609 typedef struct _QUOTA_LIMITS
610 {
611         ULONG PagedPoolLimit;
612         ULONG NonPagedPoolLimit;
613         ULONG MinimumWorkingSetSize;
614         ULONG MaximumWorkingSetSize;
615         ULONG PagefileLimit;
616         TIME TimeLimit;
617 } QUOTA_LIMITS, *PQUOTA_LIMITS;
618
619 // Information class 2
620 typedef struct _IO_COUNTERS
621 {
622         LARGE_INTEGER ReadOperationCount;
623         LARGE_INTEGER WriteOperationCount;
624         LARGE_INTEGER OtherOperationCount;
625         LARGE_INTEGER ReadTransferCount;
626         LARGE_INTEGER WriteTransferCount;
627         LARGE_INTEGER OtherTransferCount;
628 } IO_COUNTERS, *PIO_COUNTERS;
629
630 // Information class 3
631 typedef struct _VM_COUNTERS_
632 {
633         ULONG PeakVirtualSize;
634         ULONG VirtualSize;
635         ULONG PageFaultCount;
636         ULONG PeakWorkingSetSize;
637         ULONG WorkingSetSize;
638         ULONG QuotaPeakPagedPoolUsage;
639         ULONG QuotaPagedPoolUsage;
640         ULONG QuotaPeakNonPagedPoolUsage;
641         ULONG QuotaNonPagedPoolUsage;
642         ULONG PagefileUsage;
643         ULONG PeakPagefileUsage;
644 } VM_COUNTERS, *PVM_COUNTERS;
645
646 // Information class 4
647 typedef struct _KERNEL_USER_TIMES
648 {
649         TIME CreateTime;
650         TIME ExitTime;
651         TIME KernelTime;
652         TIME UserTime;
653 } KERNEL_USER_TIMES, *PKERNEL_USER_TIMES;
654
655 // Information class 9
656 typedef struct _PROCESS_ACCESS_TOKEN
657 {
658         HANDLE Token;
659         HANDLE Thread;
660 } PROCESS_ACCESS_TOKEN, *PPROCESS_ACCESS_TOKEN;
661
662 // Information class 14 
663 typedef struct _POOLED_USAGE_AND_LIMITS_
664 {
665         ULONG PeakPagedPoolUsage;
666         ULONG PagedPoolUsage;
667         ULONG PagedPoolLimit;
668         ULONG PeakNonPagedPoolUsage;
669         ULONG NonPagedPoolUsage;
670         ULONG NonPagedPoolLimit;
671         ULONG PeakPagefileUsage;
672         ULONG PagefileUsage;
673         ULONG PagefileLimit;
674 } POOLED_USAGE_AND_LIMITS, *PPOOLED_USAGE_AND_LIMITS;
675
676 // Information class 15
677 typedef struct _PROCESS_WS_WATCH_INFORMATION
678 {
679         PVOID FaultingPc;
680         PVOID FaultingVa;
681 } PROCESS_WS_WATCH_INFORMATION, *PPROCESS_WS_WATCH_INFORMATION;
682
683 // Information class 18
684 typedef struct _PROCESS_PRIORITY_CLASS
685 {
686         BOOLEAN Foreground;
687         UCHAR   PriorityClass;
688 } PROCESS_PRIORITY_CLASS, *PPROCESS_PRIORITY_CLASS;
689
690 // Information class 23
691 typedef struct _PROCESS_DEVICEMAP_INFORMATION
692 {
693         union {
694                 struct {
695                         HANDLE DirectoryHandle;
696                 } Set;
697                 struct {
698                         ULONG DriveMap;
699                         UCHAR DriveType[32];
700                 } Query;
701         };
702 } PROCESS_DEVICEMAP_INFORMATION, *pPROCESS_DEVICEMAP_INFORMATION;
703
704 // Information class 24
705 typedef struct _PROCESS_SESSION_INFORMATION
706 {
707         ULONG SessionId;
708 } PROCESS_SESSION_INFORMATION, *PPROCESS_SESSION_INFORMATION;
709
710 // thread information
711
712 // incompatible with MS NT
713
714 typedef struct _THREAD_BASIC_INFORMATION
715 {
716   NTSTATUS  ExitStatus;
717   PVOID     TebBaseAddress;     // PNT_TIB (GN)
718   CLIENT_ID ClientId;
719   KAFFINITY AffinityMask;
720   KPRIORITY Priority;
721   KPRIORITY BasePriority;
722 } THREAD_BASIC_INFORMATION, *PTHREAD_BASIC_INFORMATION;
723
724 // object information
725
726 typedef struct _OBJECT_NAME_INFORMATION
727 {
728         UNICODE_STRING  Name;
729 } OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
730
731 // file information
732
733 typedef struct _FILE_BASIC_INFORMATION
734 {
735         LARGE_INTEGER CreationTime;
736         LARGE_INTEGER LastAccessTime;
737         LARGE_INTEGER LastWriteTime;
738         LARGE_INTEGER ChangeTime;
739         ULONG FileAttributes;
740 } FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION;
741
742 typedef struct _FILE_STANDARD_INFORMATION
743 {
744         LARGE_INTEGER AllocationSize;
745         LARGE_INTEGER EndOfFile;
746         ULONG NumberOfLinks;
747         BOOLEAN DeletePending;
748         BOOLEAN Directory;
749 } FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;
750
751 typedef struct _FILE_POSITION_INFORMATION
752 {
753         LARGE_INTEGER CurrentByteOffset;
754 } FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION;
755
756 typedef struct _FILE_ALIGNMENT_INFORMATION
757 {
758         ULONG AlignmentRequirement;
759 } FILE_ALIGNMENT_INFORMATION, *PFILE_ALIGNMENT_INFORMATION;
760
761 typedef struct _FILE_DISPOSITION_INFORMATION
762 {
763         BOOLEAN DoDeleteFile;
764 } FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION;
765
766 typedef struct _FILE_END_OF_FILE_INFORMATION
767 {
768         LARGE_INTEGER EndOfFile;
769 } FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION;
770
771 typedef struct _FILE_NETWORK_OPEN_INFORMATION
772 {
773         TIME CreationTime;
774         TIME LastAccessTime;
775         TIME LastWriteTime;
776         TIME ChangeTime;
777         LARGE_INTEGER AllocationSize;
778         LARGE_INTEGER EndOfFile;
779         ULONG FileAttributes;
780 } FILE_NETWORK_OPEN_INFORMATION, *PFILE_NETWORK_OPEN_INFORMATION;
781
782 typedef struct _FILE_FULL_EA_INFORMATION
783 {
784         ULONG NextEntryOffset;
785         UCHAR Flags;
786         UCHAR EaNameLength;
787         USHORT EaValueLength;
788         CHAR  EaName[0];
789 } FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION;
790
791
792 typedef struct _FILE_EA_INFORMATION {
793         ULONG EaSize;
794 } FILE_EA_INFORMATION, *PFILE_EA_INFORMATION;
795
796
797 typedef struct _FILE_GET_EA_INFORMATION {
798         ULONG NextEntryOffset;
799         UCHAR EaNameLength;
800         CHAR EaName[0];
801 } FILE_GET_EA_INFORMATION, *PFILE_GET_EA_INFORMATION;
802
803 typedef struct _FILE_STREAM_INFORMATION {
804         ULONG NextEntryOffset;
805         ULONG StreamNameLength;
806         LARGE_INTEGER StreamSize;
807         LARGE_INTEGER StreamAllocationSize;
808         WCHAR StreamName[0];
809 } FILE_STREAM_INFORMATION, *PFILE_STREAM_INFORMATION;
810
811 typedef struct _FILE_ALLOCATION_INFORMATION {
812         LARGE_INTEGER AllocationSize;
813 } FILE_ALLOCATION_INFORMATION, *PFILE_ALLOCATION_INFORMATION;
814
815 typedef struct _FILE_NAME_INFORMATION {
816         ULONG FileNameLength;
817         WCHAR FileName[0];
818 } FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION;
819
820 typedef struct _FILE_NAMES_INFORMATION 
821 {
822         ULONG NextEntryOffset;
823         ULONG FileIndex;
824         ULONG FileNameLength;
825         WCHAR FileName[0];
826 } FILE_NAMES_INFORMATION, *PFILE_NAMES_INFORMATION;
827
828
829 typedef struct _FILE_RENAME_INFORMATION {
830         BOOLEAN Replace;
831         HANDLE RootDir;
832         ULONG FileNameLength;
833         WCHAR FileName[0];
834 } FILE_RENAME_INFORMATION, *PFILE_RENAME_INFORMATION;
835
836
837 typedef struct _FILE_INTERNAL_INFORMATION {
838         LARGE_INTEGER IndexNumber;
839 } FILE_INTERNAL_INFORMATION, *PFILE_INTERNAL_INFORMATION;
840
841 typedef struct _FILE_ACCESS_INFORMATION {
842         ACCESS_MASK AccessFlags;
843 } FILE_ACCESS_INFORMATION, *PFILE_ACCESS_INFORMATION;
844
845
846 typedef struct _FILE_MODE_INFORMATION {
847         ULONG Mode;
848 } FILE_MODE_INFORMATION, *PFILE_MODE_INFORMATION;
849
850
851 typedef struct _FILE_PIPE_INFORMATION {
852         ULONG ReadMode;
853         ULONG CompletionMode;
854 } FILE_PIPE_INFORMATION, *PFILE_PIPE_INFORMATION;
855
856 typedef struct _FILE_PIPE_LOCAL_INFORMATION {
857         ULONG NamedPipeType;
858         ULONG NamedPipeConfiguration;
859         ULONG MaximumInstances;
860         ULONG CurrentInstances;
861         ULONG InboundQuota;
862         ULONG ReadDataAvailable;
863         ULONG OutboundQuota;
864         ULONG WriteQuotaAvailable;
865         ULONG NamedPipeState;
866         ULONG NamedPipeEnd;
867 } FILE_PIPE_LOCAL_INFORMATION, *PFILE_PIPE_LOCAL_INFORMATION;
868
869 typedef struct _FILE_PIPE_REMOTE_INFORMATION {
870         LARGE_INTEGER CollectDataTime;
871         ULONG MaximumCollectionCount;
872 } FILE_PIPE_REMOTE_INFORMATION, *PFILE_PIPE_REMOTE_INFORMATION;
873
874 typedef struct _FILE_MAILSLOT_QUERY_INFORMATION {
875         ULONG MaxMessageSize;
876         ULONG Unknown; /* ?? */
877         ULONG NextSize;
878         ULONG MessageCount;
879         LARGE_INTEGER Timeout;
880 } FILE_MAILSLOT_QUERY_INFORMATION, *PFILE_MAILSLOT_QUERY_INFORMATION;
881
882 typedef struct _FILE_MAILSLOT_SET_INFORMATION {
883         LARGE_INTEGER Timeout;
884 } FILE_MAILSLOT_SET_INFORMATION, *PFILE_MAILSLOT_SET_INFORMATION;
885
886 typedef struct _FILE_COMPRESSION_INFORMATION {
887         LARGE_INTEGER CompressedFileSize;
888         USHORT CompressionFormat;
889         UCHAR CompressionUnitShift;
890         UCHAR ChunkShift;
891         UCHAR ClusterShift;
892         UCHAR Reserved[3];
893 } FILE_COMPRESSION_INFORMATION, *PFILE_COMPRESSION_INFORMATION;
894
895 typedef struct _FILE_COMPLETION_INFORMATION { // Information Class 30
896    HANDLE IoCompletionHandle;
897    ULONG CompletionKey;
898 } FILE_COMPLETION_INFORMATION, *PFILE_COMPLETION_INFORMATION;
899
900 typedef struct _FILE_ALL_INFORMATION {
901         FILE_BASIC_INFORMATION BasicInformation;
902         FILE_STANDARD_INFORMATION StandardInformation;
903         FILE_INTERNAL_INFORMATION InternalInformation;
904         FILE_EA_INFORMATION EaInformation;
905         FILE_ACCESS_INFORMATION AccessInformation;
906         FILE_POSITION_INFORMATION PositionInformation;
907         FILE_MODE_INFORMATION ModeInformation;
908         FILE_ALIGNMENT_INFORMATION AlignmentInformation;
909         FILE_NAME_INFORMATION NameInformation;
910 } FILE_ALL_INFORMATION, *PFILE_ALL_INFORMATION;
911
912
913 // file system information structures
914
915 typedef struct _FILE_FS_DEVICE_INFORMATION {
916         DEVICE_TYPE DeviceType;
917         ULONG Characteristics;
918 } FILE_FS_DEVICE_INFORMATION,  *PFILE_FS_DEVICE_INFORMATION;
919
920
921 typedef struct _FILE_FS_VOLUME_INFORMATION {
922         TIME VolumeCreationTime;
923         ULONG VolumeSerialNumber;
924         ULONG VolumeLabelLength;
925         BOOLEAN SupportsObjects;
926         WCHAR VolumeLabel[0];
927 } FILE_FS_VOLUME_INFORMATION, *PFILE_FS_VOLUME_INFORMATION;
928
929 typedef struct _FILE_FS_SIZE_INFORMATION {
930         LARGE_INTEGER TotalAllocationUnits;
931         LARGE_INTEGER AvailableAllocationUnits;
932         ULONG SectorsPerAllocationUnit;
933         ULONG BytesPerSector;
934 } FILE_FS_SIZE_INFORMATION, *PFILE_FS_SIZE_INFORMATION;
935
936 typedef struct _FILE_FS_ATTRIBUTE_INFORMATION {
937         ULONG FileSystemAttributes;
938         LONG MaximumComponentNameLength;
939         ULONG FileSystemNameLength;
940         WCHAR FileSystemName[0];
941 } FILE_FS_ATTRIBUTE_INFORMATION, *PFILE_FS_ATTRIBUTE_INFORMATION;
942
943 /*
944         FileSystemAttributes is one of the following values:
945
946         FILE_CASE_SENSITIVE_SEARCH      0x00000001
947         FILE_CASE_PRESERVED_NAMES       0x00000002
948         FILE_UNICODE_ON_DISK            0x00000004
949         FILE_PERSISTENT_ACLS            0x00000008
950         FILE_FILE_COMPRESSION           0x00000010
951         FILE_VOLUME_QUOTAS              0x00000020
952         FILE_VOLUME_IS_COMPRESSED       0x00008000
953 */
954 typedef struct _FILE_FS_LABEL_INFORMATION {
955         ULONG VolumeLabelLength;
956         WCHAR VolumeLabel[0];
957 } FILE_FS_LABEL_INFORMATION, *PFILE_FS_LABEL_INFORMATION;
958
959 // read file scatter / write file scatter
960 //FIXME I am a win32 struct aswell
961
962 typedef union _FILE_SEGMENT_ELEMENT {
963         PVOID Buffer;
964         ULONG Alignment;
965 }FILE_SEGMENT_ELEMENT, *PFILE_SEGMENT_ELEMENT;
966
967 typedef struct _FILE_DIRECTORY_INFORMATION {
968         ULONG   NextEntryOffset;
969         ULONG   FileIndex;
970         TIME CreationTime;
971         TIME LastAccessTime;
972         TIME LastWriteTime;
973         TIME ChangeTime;
974         LARGE_INTEGER EndOfFile;
975         LARGE_INTEGER AllocationSize;
976         ULONG FileAttributes;
977         ULONG FileNameLength;
978         WCHAR FileName[0];
979 } FILE_DIRECTORY_INFORMATION, *PFILE_DIRECTORY_INFORMATION;
980
981 typedef struct _FILE_FULL_DIRECTORY_INFORMATION {
982         ULONG   NextEntryOffset;
983         ULONG   FileIndex;
984         TIME CreationTime;
985         TIME LastAccessTime;
986         TIME LastWriteTime;
987         TIME ChangeTime;
988         LARGE_INTEGER EndOfFile;
989         LARGE_INTEGER AllocationSize;
990         ULONG FileAttributes;
991         ULONG FileNameLength;
992         ULONG EaSize;
993         WCHAR FileName[0]; // variable size
994 } FILE_FULL_DIRECTORY_INFORMATION, *PFILE_FULL_DIRECTORY_INFORMATION,
995   FILE_FULL_DIR_INFORMATION, *PFILE_FULL_DIR_INFORMATION;
996
997
998 typedef struct _FILE_BOTH_DIRECTORY_INFORMATION {
999         ULONG           NextEntryOffset;
1000         ULONG           FileIndex;
1001         TIME            CreationTime;
1002         TIME            LastAccessTime;
1003         TIME            LastWriteTime;
1004         TIME            ChangeTime;
1005         LARGE_INTEGER   EndOfFile;
1006         LARGE_INTEGER   AllocationSize;
1007         ULONG           FileAttributes;
1008         ULONG           FileNameLength;
1009         ULONG           EaSize;
1010         CHAR            ShortNameLength;
1011         WCHAR           ShortName[12]; // 8.3 name
1012         WCHAR           FileName[0];
1013 } FILE_BOTH_DIRECTORY_INFORMATION, *PFILE_BOTH_DIRECTORY_INFORMATION,
1014   FILE_BOTH_DIR_INFORMATION, *PFILE_BOTH_DIR_INFORMATION;
1015
1016 typedef struct _FILE_ID_BOTH_DIR_INFORMATION {
1017         ULONG NextEntryOffset;
1018         ULONG FileIndex;
1019         LARGE_INTEGER CreationTime;
1020         LARGE_INTEGER LastAccessTime;
1021         LARGE_INTEGER LastWriteTime;
1022         LARGE_INTEGER ChangeTime;
1023         LARGE_INTEGER EndOfFile;
1024         LARGE_INTEGER AllocationSize;
1025         ULONG FileAttributes;
1026         ULONG FileNameLength;
1027         ULONG EaSize;
1028         CCHAR ShortNameLength;
1029         WCHAR ShortName[12];
1030         LARGE_INTEGER FileId;
1031         WCHAR FileName[1];
1032 } FILE_ID_BOTH_DIR_INFORMATION, *PFILE_ID_BOTH_DIR_INFORMATION;
1033
1034 /*
1035         NotifyFilter / CompletionFilter:
1036
1037         FILE_NOTIFY_CHANGE_FILE_NAME        0x00000001
1038         FILE_NOTIFY_CHANGE_DIR_NAME         0x00000002
1039         FILE_NOTIFY_CHANGE_NAME             0x00000003
1040         FILE_NOTIFY_CHANGE_ATTRIBUTES       0x00000004
1041         FILE_NOTIFY_CHANGE_SIZE             0x00000008
1042         FILE_NOTIFY_CHANGE_LAST_WRITE       0x00000010
1043         FILE_NOTIFY_CHANGE_LAST_ACCESS      0x00000020
1044         FILE_NOTIFY_CHANGE_CREATION         0x00000040
1045         FILE_NOTIFY_CHANGE_EA               0x00000080
1046         FILE_NOTIFY_CHANGE_SECURITY         0x00000100
1047         FILE_NOTIFY_CHANGE_STREAM_NAME      0x00000200
1048         FILE_NOTIFY_CHANGE_STREAM_SIZE      0x00000400
1049         FILE_NOTIFY_CHANGE_STREAM_WRITE     0x00000800
1050 */
1051
1052 typedef struct _FILE_NOTIFY_INFORMATION {
1053         ULONG Action;
1054         ULONG FileNameLength;
1055         WCHAR FileName[0]; 
1056 } FILE_NOTIFY_INFORMATION;
1057
1058 #define FSCTL_DISMOUNT_VOLUME                   0x90020
1059 #define FSCTL_GET_VOLUME_BITMAP                 0x9006F
1060 #define FSCTL_GET_RETRIEVAL_POINTERS            0x90073
1061 #define FSCTL_MOVE_FILE                         0x90074
1062
1063 typedef struct _MAPPING_PAIR
1064 {
1065         ULONGLONG       Vcn;
1066         ULONGLONG       Lcn;
1067 } MAPPING_PAIR, *PMAPPING_PAIR;
1068
1069 typedef struct _GET_RETRIEVAL_DESCRIPTOR
1070 {
1071         ULONG           NumberOfPairs;
1072         ULONGLONG       StartVcn;
1073         MAPPING_PAIR    Pair[0]; // variable size 
1074 } GET_RETRIEVAL_DESCRIPTOR, *PGET_RETRIEVAL_DESCRIPTOR;
1075
1076 typedef struct _MOVEFILE_DESCRIPTOR
1077 {
1078         HANDLE            FileHandle;
1079         ULONG             Reserved;
1080         LARGE_INTEGER     StartVcn;
1081         LARGE_INTEGER     TargetLcn;
1082         ULONG             NumVcns;
1083         ULONG             Reserved1;
1084 } MOVEFILE_DESCRIPTOR, *PMOVEFILE_DESCRIPTOR;
1085
1086 typedef struct _SECTION_BASIC_INFORMATION
1087 {
1088   PVOID BaseAddress;
1089   ULONG Attributes;
1090   LARGE_INTEGER Size;
1091 } SECTION_BASIC_INFORMATION, *PSECTION_BASIC_INFORMATION;
1092
1093 typedef enum _SECTION_INFORMATION_CLASS 
1094 {
1095   SectionBasicInformation,
1096   SectionImageInformation,
1097 } SECTION_INFORMATION_CLASS;
1098
1099 // shutdown action
1100
1101 typedef enum SHUTDOWN_ACTION_TAG {
1102   ShutdownNoReboot,
1103   ShutdownReboot,
1104   ShutdownPowerOff
1105 } SHUTDOWN_ACTION;
1106
1107 typedef enum _IO_COMPLETION_INFORMATION_CLASS {
1108    IoCompletionBasicInformation
1109 } IO_COMPLETION_INFORMATION_CLASS;
1110
1111 typedef struct _IO_COMPLETION_BASIC_INFORMATION {
1112    LONG SignalState;
1113 } IO_COMPLETION_BASIC_INFORMATION, *PIO_COMPLETION_BASIC_INFORMATION;
1114
1115 #else /* __USE_W32API */
1116
1117 #define DebugDbgLoadSymbols ((DEBUG_CONTROL_CODE)0xffffffff)
1118
1119 #endif /* __USE_W32API */
1120
1121 #define NtCurrentProcess() ( (HANDLE) 0xFFFFFFFF )
1122 #define NtCurrentThread() ( (HANDLE) 0xFFFFFFFE )
1123 #if 1
1124 extern ULONG NtBuildNumber;
1125 #else
1126 #ifdef __NTOSKRNL__
1127 extern ULONG NtBuildNumber;
1128 #else
1129 extern ULONG NtBuildNumber;
1130 #endif
1131 #endif
1132
1133 // event access mask
1134
1135 #define EVENT_READ_ACCESS                       1
1136 #define EVENT_WRITE_ACCESS                      2
1137
1138 //process query / set information class
1139
1140 #define ProcessBasicInformation                 0
1141 #define ProcessQuotaLimits                      1
1142 #define ProcessIoCounters                       2
1143 #define ProcessVmCounters                       3
1144 #define ProcessTimes                            4
1145 #define ProcessBasePriority                     5
1146 #define ProcessRaisePriority                    6
1147 #define ProcessDebugPort                        7
1148 #define ProcessExceptionPort                    8
1149 #define ProcessAccessToken                      9
1150 #define ProcessLdtInformation                   10
1151 #define ProcessLdtSize                          11
1152 #define ProcessDefaultHardErrorMode             12
1153 #define ProcessIoPortHandlers                   13
1154 #define ProcessPooledUsageAndLimits             14
1155 #define ProcessWorkingSetWatch                  15
1156 #define ProcessUserModeIOPL                     16
1157 #define ProcessEnableAlignmentFaultFixup        17
1158 #define ProcessPriorityClass                    18
1159 #define ProcessWx86Information                  19
1160 #define ProcessHandleCount                      20
1161 #define ProcessAffinityMask                     21
1162 #define ProcessPriorityBoost                    22
1163 #define ProcessDeviceMap                        23
1164 #define ProcessSessionInformation               24
1165 #define ProcessForegroundInformation            25
1166 #define ProcessWow64Information                 26
1167 /* ReactOS private. */
1168 #define ProcessImageFileName                    27
1169 #define ProcessDesktop                          28
1170 #define MaxProcessInfoClass                     29
1171
1172 /*
1173  * thread query / set information class
1174  */
1175 #define ThreadBasicInformation                  0
1176 #define ThreadTimes                             1
1177 #define ThreadPriority                          2
1178 #define ThreadBasePriority                      3
1179 #define ThreadAffinityMask                      4
1180 #define ThreadImpersonationToken                5
1181 #define ThreadDescriptorTableEntry              6
1182 #define ThreadEnableAlignmentFaultFixup         7
1183 #define ThreadEventPair                         8
1184 #define ThreadQuerySetWin32StartAddress         9
1185 #define ThreadZeroTlsCell                       10
1186 #define ThreadPerformanceCount                  11
1187 #define ThreadAmILastThread                     12
1188 #define ThreadIdealProcessor                    13
1189 #define ThreadPriorityBoost                     14
1190 #define ThreadSetTlsArrayAddress                15
1191 #define ThreadIsIoPending                       16
1192 #define ThreadHideFromDebugger                  17
1193 #define MaxThreadInfoClass                      17
1194
1195 // object handle information
1196
1197 #define ObjectBasicInformation                  0
1198 #define ObjectNameInformation                   1
1199 #define ObjectTypeInformation                   2
1200 #define ObjectAllInformation                    3
1201 #define ObjectDataInformation                   4
1202
1203 typedef struct _ATOM_TABLE_INFORMATION
1204 {
1205    ULONG NumberOfAtoms;
1206    RTL_ATOM Atoms[1];
1207 } ATOM_TABLE_INFORMATION, *PATOM_TABLE_INFORMATION;
1208
1209
1210 // mutant information
1211
1212 typedef enum _MUTANT_INFORMATION_CLASS
1213 {
1214   MutantBasicInformation = 0
1215 } MUTANT_INFORMATION_CLASS;
1216
1217 typedef struct _MUTANT_BASIC_INFORMATION
1218 {
1219   LONG Count;
1220   BOOLEAN Owned;
1221   BOOLEAN Abandoned;
1222 } MUTANT_BASIC_INFORMATION, *PMUTANT_BASIC_INFORMATION;
1223
1224
1225 // SystemTimeOfDayInformation (3)
1226 typedef
1227 struct _SYSTEM_TIMEOFDAY_INFORMATION
1228 {
1229         LARGE_INTEGER   BootTime;
1230         LARGE_INTEGER   CurrentTime;
1231         LARGE_INTEGER   TimeZoneBias;
1232         ULONG           TimeZoneId;
1233         ULONG           Reserved;
1234 } SYSTEM_TIMEOFDAY_INFORMATION, *PSYSTEM_TIMEOFDAY_INFORMATION;
1235
1236 // SystemPathInformation (4)
1237 // IT DOES NOT WORK
1238 typedef
1239 struct _SYSTEM_PATH_INFORMATION
1240 {
1241         PVOID   Dummy;
1242
1243 } SYSTEM_PATH_INFORMATION, * PSYSTEM_PATH_INFORMATION;
1244
1245 // SystemProcessInformation (5)
1246
1247 typedef struct _SYSTEM_THREADS
1248 {
1249  TIME         KernelTime;
1250  TIME         UserTime;
1251  TIME         CreateTime;
1252  ULONG        WaitTime;
1253  PVOID        StartAddress;
1254  CLIENT_ID    ClientId;
1255  KPRIORITY    Priority;
1256  KPRIORITY    BasePriority;
1257  ULONG        ContextSwitchCount;
1258  ULONG State;
1259  KWAIT_REASON WaitReason;
1260 } SYSTEM_THREADS, *PSYSTEM_THREADS;
1261
1262 typedef struct _SYSTEM_PROCESSES_NT4
1263 {
1264  SIZE_T         NextEntryDelta;
1265  ULONG          ThreadCount;
1266  ULONG          Reserved1[6];
1267  TIME           CreateTime;
1268  TIME           UserTime;
1269  TIME           KernelTime;
1270  UNICODE_STRING ProcessName;
1271  KPRIORITY      BasePriority;
1272  ULONG          ProcessId;
1273  ULONG          InheritedFromProcessId;
1274  ULONG          HandleCount;
1275  ULONG          Reserved2[2];
1276  VM_COUNTERS    VmCounters;
1277  SYSTEM_THREADS Threads[ANYSIZE_ARRAY];
1278 } SYSTEM_PROCESSES_NT4, *PSYSTEM_PROCESSES_NT4;
1279
1280 typedef struct _SYSTEM_PROCESSES_NT5
1281 {
1282  SIZE_T         NextEntryDelta;
1283  ULONG          ThreadCount;
1284  ULONG          Reserved1[6];
1285  TIME           CreateTime;
1286  TIME           UserTime;
1287  TIME           KernelTime;
1288  UNICODE_STRING ProcessName;
1289  KPRIORITY      BasePriority;
1290  ULONG          ProcessId;
1291  ULONG          InheritedFromProcessId;
1292  ULONG          HandleCount;
1293  ULONG          Reserved2[2];
1294  VM_COUNTERS    VmCounters;
1295  IO_COUNTERS    IoCounters;
1296  SYSTEM_THREADS Threads[ANYSIZE_ARRAY];
1297 } SYSTEM_PROCESSES_NT5, *PSYSTEM_PROCESSES_NT5;
1298
1299 /* Not sure. What version are we emulating? */
1300 typedef SYSTEM_PROCESSES_NT5 SYSTEM_PROCESSES, *PSYSTEM_PROCESSES;
1301
1302 // SystemCallCountInformation (6)
1303 typedef
1304 struct _SYSTEM_SDT_INFORMATION
1305 {
1306         ULONG   BufferLength;
1307         ULONG   NumberOfSystemServiceTables;
1308         ULONG   NumberOfServices [1];
1309         ULONG   ServiceCounters [1];
1310
1311 } SYSTEM_SDT_INFORMATION, *PSYSTEM_SDT_INFORMATION;
1312
1313 // SystemDeviceInformation (7)
1314 typedef
1315 struct _SYSTEM_DEVICE_INFORMATION
1316 {
1317         ULONG   NumberOfDisks;
1318         ULONG   NumberOfFloppies;
1319         ULONG   NumberOfCdRoms;
1320         ULONG   NumberOfTapes;
1321         ULONG   NumberOfSerialPorts;
1322         ULONG   NumberOfParallelPorts;
1323 } SYSTEM_DEVICE_INFORMATION, *PSYSTEM_DEVICE_INFORMATION;
1324
1325 // SystemProcessorPerformanceInformation (8)
1326 // (one per processor in the system)
1327 typedef
1328 struct _SYSTEM_PROCESSORTIME_INFO
1329 {
1330         TIME    TotalProcessorRunTime;
1331         TIME    TotalProcessorTime;
1332         TIME    TotalProcessorUserTime;
1333         TIME    TotalDPCTime;
1334         TIME    TotalInterruptTime;
1335         ULONG   TotalInterrupts;
1336         ULONG   Unused;
1337
1338 } SYSTEM_PROCESSORTIME_INFO, *PSYSTEM_PROCESSORTIME_INFO;
1339
1340 // SystemFlagsInformation (9)
1341 typedef
1342 struct _SYSTEM_FLAGS_INFORMATION
1343 {
1344         ULONG   Flags;
1345
1346 } SYSTEM_FLAGS_INFORMATION, * PSYSTEM_FLAGS_INFORMATION;
1347
1348 #define FLG_STOP_ON_EXCEPTION           0x00000001
1349 #define FLG_SHOW_LDR_SNAPS              0x00000002
1350 #define FLG_DEBUG_INITIAL_COMMAND       0x00000004
1351 #define FLG_STOP_ON_HANG_GUI            0x00000008
1352 #define FLG_HEAP_ENABLE_TAIL_CHECK      0x00000010
1353 #define FLG_HEAP_ENABLE_FREE_CHECK      0x00000020
1354 #define FLG_HEAP_VALIDATE_PARAMETERS    0x00000040
1355 #define FLG_HEAP_VALIDATE_ALL           0x00000080
1356 #define FLG_POOL_ENABLE_TAIL_CHECK      0x00000100
1357 #define FLG_POOL_ENABLE_FREE_CHECK      0x00000200
1358 #define FLG_POOL_ENABLE_TAGGING         0x00000400
1359 #define FLG_HEAP_ENABLE_TAGGING         0x00000800
1360 #define FLG_USER_STACK_TRACE_DB         0x00001000
1361 #define FLG_KERNEL_STACK_TRACE_DB       0x00002000
1362 #define FLG_MAINTAIN_OBJECT_TYPELIST    0x00004000
1363 #define FLG_HEAP_ENABLE_TAG_BY_DLL      0x00008000
1364 #define FLG_IGNORE_DEBUG_PRIV           0x00010000
1365 #define FLG_ENABLE_CSRDEBUG             0x00020000
1366 #define FLG_ENABLE_KDEBUG_SYMBOL_LOAD   0x00040000
1367 #define FLG_DISABLE_PAGE_KERNEL_STACKS  0x00080000
1368 #define FLG_HEAP_ENABLE_CALL_TRACING    0x00100000
1369 #define FLG_HEAP_DISABLE_COALESCING     0x00200000
1370 #define FLG_ENABLE_CLOSE_EXCEPTION      0x00400000
1371 #define FLG_ENABLE_EXCEPTION_LOGGING    0x00800000
1372 #define FLG_UNKNOWN_01000000            0x01000000
1373 #define FLG_UNKNOWN_02000000            0x02000000
1374 #define FLG_UNKNOWN_04000000            0x04000000
1375 #define FLG_ENABLE_DBGPRINT_BUFFERING   0x08000000
1376 #define FLG_UNKNOWN_10000000            0x10000000
1377 #define FLG_UNKNOWN_20000000            0x20000000
1378 #define FLG_UNKNOWN_40000000            0x40000000
1379 #define FLG_UNKNOWN_80000000            0x80000000
1380
1381 // SystemCallTimeInformation (10)
1382 // UNKNOWN
1383
1384 // SystemLocksInformation (12)
1385 typedef
1386 struct _SYSTEM_RESOURCE_LOCK_ENTRY
1387 {
1388         ULONG   ResourceAddress;
1389         ULONG   Always1;
1390         ULONG   Unknown;
1391         ULONG   ActiveCount;
1392         ULONG   ContentionCount;
1393         ULONG   Unused[2];
1394         ULONG   NumberOfSharedWaiters;
1395         ULONG   NumberOfExclusiveWaiters;
1396         
1397 } SYSTEM_RESOURCE_LOCK_ENTRY, *PSYSTEM_RESOURCE_LOCK_ENTRY;
1398
1399 typedef
1400 struct _SYSTEM_RESOURCE_LOCK_INFO
1401 {
1402         ULONG                           Count;
1403         SYSTEM_RESOURCE_LOCK_ENTRY      Lock [1];
1404         
1405 } SYSTEM_RESOURCE_LOCK_INFO, *PSYSTEM_RESOURCE_LOCK_INFO;
1406
1407 // SystemInformation13 (13)
1408 // UNKNOWN
1409
1410 // SystemInformation14 (14)
1411 // UNKNOWN
1412
1413 // SystemInformation15 (15)
1414 // UNKNOWN
1415
1416 // SystemInstructionEmulationInfo (19)
1417 typedef
1418 struct _SYSTEM_VDM_INFORMATION
1419 {
1420         ULONG VdmSegmentNotPresentCount;
1421         ULONG VdmINSWCount;
1422         ULONG VdmESPREFIXCount;
1423         ULONG VdmCSPREFIXCount;
1424         ULONG VdmSSPREFIXCount;
1425         ULONG VdmDSPREFIXCount;
1426         ULONG VdmFSPREFIXCount;
1427         ULONG VdmGSPREFIXCount;
1428         ULONG VdmOPER32PREFIXCount;
1429         ULONG VdmADDR32PREFIXCount;
1430         ULONG VdmINSBCount;
1431         ULONG VdmINSWV86Count;
1432         ULONG VdmOUTSBCount;
1433         ULONG VdmOUTSWCount;
1434         ULONG VdmPUSHFCount;
1435         ULONG VdmPOPFCount;
1436         ULONG VdmINTNNCount;
1437         ULONG VdmINTOCount;
1438         ULONG VdmIRETCount;
1439         ULONG VdmINBIMMCount;
1440         ULONG VdmINWIMMCount;
1441         ULONG VdmOUTBIMMCount;
1442         ULONG VdmOUTWIMMCount;
1443         ULONG VdmINBCount;
1444         ULONG VdmINWCount;
1445         ULONG VdmOUTBCount;
1446         ULONG VdmOUTWCount;
1447         ULONG VdmLOCKPREFIXCount;
1448         ULONG VdmREPNEPREFIXCount;
1449         ULONG VdmREPPREFIXCount;
1450         ULONG VdmHLTCount;
1451         ULONG VdmCLICount;
1452         ULONG VdmSTICount;
1453         ULONG VdmBopCount;
1454
1455 } SYSTEM_VDM_INFORMATION, *PSYSTEM_VDM_INFORMATION;
1456
1457 // SystemInformation20 (20)
1458 // UNKNOWN
1459
1460 // SystemPoolTagInformation (22)
1461 // found by Klaus P. Gerlicher
1462 // (implemented only in checked builds)
1463 typedef
1464 struct _POOL_TAG_STATS
1465 {
1466         ULONG AllocationCount;
1467         ULONG FreeCount;
1468         ULONG SizeBytes;
1469         
1470 } POOL_TAG_STATS;
1471
1472 typedef
1473 struct _SYSTEM_POOL_TAG_ENTRY
1474 {
1475         ULONG           Tag;
1476         POOL_TAG_STATS  Paged;
1477         POOL_TAG_STATS  NonPaged;
1478
1479 } SYSTEM_POOL_TAG_ENTRY, * PSYSTEM_POOL_TAG_ENTRY;
1480
1481 typedef
1482 struct _SYSTEM_POOL_TAG_INFO
1483 {
1484         ULONG                   Count;
1485         SYSTEM_POOL_TAG_ENTRY   PoolEntry [1];
1486
1487 } SYSTEM_POOL_TAG_INFO, *PSYSTEM_POOL_TAG_INFO;
1488
1489 // SystemProcessorScheduleInfo (23)
1490 typedef
1491 struct _SYSTEM_PROCESSOR_SCHEDULE_INFO
1492 {
1493         ULONG nContextSwitches;
1494         ULONG nDPCQueued;
1495         ULONG nDPCRate;
1496         ULONG TimerResolution;
1497         ULONG nDPCBypasses;
1498         ULONG nAPCBypasses;
1499         
1500 } SYSTEM_PROCESSOR_SCHEDULE_INFO, *PSYSTEM_PROCESSOR_SCHEDULE_INFO;
1501
1502 // SystemInformation25 (25)
1503 // UNKNOWN
1504
1505 // SystemProcessorFaultCountInfo (33)
1506 typedef
1507 struct _SYSTEM_PROCESSOR_FAULT_INFO
1508 {
1509         ULONG   nAlignmentFixup;
1510         ULONG   nExceptionDispatches;
1511         ULONG   nFloatingEmulation;
1512         ULONG   Unknown;
1513         
1514 } SYSTEM_PROCESSOR_FAULT_INFO, *PSYSTEM_PROCESSOR_FAULT_INFO;
1515
1516 // SystemCrashDumpStateInfo (34)
1517 //
1518
1519 // SystemDebuggerInformation (35)
1520 typedef
1521 struct _SYSTEM_DEBUGGER_INFO
1522 {
1523         BOOLEAN KdDebuggerEnabled;
1524         BOOLEAN KdDebuggerPresent;
1525         
1526 } SYSTEM_DEBUGGER_INFO, *PSYSTEM_DEBUGGER_INFO;
1527
1528 // SystemInformation36 (36)
1529 // UNKNOWN
1530
1531 // SystemQuotaInformation (37)
1532 typedef
1533 struct _SYSTEM_QUOTA_INFORMATION
1534 {
1535         ULONG   CmpGlobalQuota;
1536         ULONG   CmpGlobalQuotaUsed;
1537         ULONG   MmSizeofPagedPoolInBytes;
1538         
1539 } SYSTEM_QUOTA_INFORMATION, *PSYSTEM_QUOTA_INFORMATION;
1540
1541 // (49)
1542 // UNKNOWN
1543
1544 // SystemVerifierInformation (51)
1545 // UNKNOWN
1546
1547 // SystemAddVerifier (52)
1548 // UNKNOWN
1549
1550 // wait type
1551
1552 #define WaitAll                                 0
1553 #define WaitAny                                 1
1554
1555 // number of wait objects
1556
1557 #define THREAD_WAIT_OBJECTS                     3
1558 //#define MAXIMUM_WAIT_OBJECTS                  64
1559
1560 // key restore flags
1561
1562 #define REG_WHOLE_HIVE_VOLATILE                 1
1563 #define REG_REFRESH_HIVE                        2
1564
1565 // object type  access rights
1566
1567 #define OBJECT_TYPE_CREATE              0x0001
1568 #define OBJECT_TYPE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
1569
1570 // directory access rights
1571
1572 #define DIRECTORY_QUERY                         0x0001
1573 #define DIRECTORY_TRAVERSE                      0x0002
1574 #define DIRECTORY_CREATE_OBJECT                 0x0004
1575 #define DIRECTORY_CREATE_SUBDIRECTORY           0x0008
1576
1577 #define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF)
1578
1579 // symbolic link access rights
1580
1581 #define SYMBOLIC_LINK_QUERY                     0x0001
1582 #define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
1583
1584
1585 typedef struct _OBJECT_DATA_INFORMATION
1586 {
1587         BOOLEAN bInheritHandle;
1588         BOOLEAN bProtectFromClose;
1589 } OBJECT_DATA_INFORMATION, *POBJECT_DATA_INFORMATION;
1590
1591
1592 typedef struct _OBJECT_TYPE_INFORMATION
1593 {
1594         UNICODE_STRING  Name;
1595         UNICODE_STRING Type;
1596         ULONG TotalHandles;
1597         ULONG ReferenceCount;
1598 } OBJECT_TYPE_INFORMATION, *POBJECT_TYPE_INFORMATION;
1599
1600
1601 // directory information
1602
1603 typedef struct _OBJDIR_INFORMATION {
1604         UNICODE_STRING ObjectName;
1605         UNICODE_STRING ObjectTypeName; // Directory, Device ...
1606         UCHAR          Data[0];
1607 } OBJDIR_INFORMATION, *POBJDIR_INFORMATION;
1608
1609
1610 /*
1611          Action is one of the following values:
1612
1613         FILE_ACTION_ADDED               0x00000001
1614         FILE_ACTION_REMOVED             0x00000002
1615         FILE_ACTION_MODIFIED            0x00000003
1616         FILE_ACTION_RENAMED_OLD_NAME    0x00000004
1617         FILE_ACTION_RENAMED_NEW_NAME    0x00000005
1618         FILE_ACTION_ADDED_STREAM        0x00000006
1619         FILE_ACTION_REMOVED_STREAM      0x00000007
1620         FILE_ACTION_MODIFIED_STREAM     0x00000008
1621
1622 */
1623
1624
1625 // File System Control commands ( related to defragging )
1626
1627 #define FSCTL_READ_MFT_RECORD                   0x90068 // NTFS only
1628
1629 typedef struct _BITMAP_DESCRIPTOR
1630 {
1631         ULONGLONG       StartLcn;
1632         ULONGLONG       ClustersToEndOfVol;
1633         BYTE            Map[0]; // variable size
1634 } BITMAP_DESCRIPTOR, *PBITMAP_DESCRIPTOR;
1635
1636
1637 //typedef enum _TIMER_TYPE 
1638 //{
1639 //      NotificationTimer,
1640 //      SynchronizationTimer
1641 //} TIMER_TYPE;
1642
1643 typedef struct _TIMER_BASIC_INFORMATION
1644 {
1645   LARGE_INTEGER TimeRemaining;
1646   BOOLEAN SignalState;
1647 } TIMER_BASIC_INFORMATION, *PTIMER_BASIC_INFORMATION;
1648
1649 typedef enum _TIMER_INFORMATION_CLASS
1650 {
1651   TimerBasicInformation
1652 } TIMER_INFORMATION_CLASS;
1653
1654 typedef
1655 struct _LPC_PORT_BASIC_INFORMATION
1656 {
1657         DWORD   Unknown0;
1658         DWORD   Unknown1;
1659         DWORD   Unknown2;
1660         DWORD   Unknown3;
1661         DWORD   Unknown4;
1662         DWORD   Unknown5;
1663         DWORD   Unknown6;
1664         DWORD   Unknown7;
1665         DWORD   Unknown8;
1666         DWORD   Unknown9;
1667         DWORD   Unknown10;
1668         DWORD   Unknown11;
1669         DWORD   Unknown12;
1670         DWORD   Unknown13;
1671
1672 } LPC_PORT_BASIC_INFORMATION, * PLPC_PORT_BASIC_INFORMATION;
1673
1674 #endif