64557d4817bbe5a2691ba34c961111d80b29793e
[reactos.git] / reactos / include / ndk / extypes.h
1 /*++ NDK Version: 0095
2
3 Copyright (c) Alex Ionescu. All rights reserved.
4
5 Header Name:
6
7 extypes.h
8
9 Abstract:
10
11 Type definitions for the Executive.
12
13 Author:
14
15 Alex Ionescu (alex.ionescu@reactos.com) 06-Oct-2004
16
17 --*/
18
19 #ifndef _EXTYPES_H
20 #define _EXTYPES_H
21
22 //
23 // Dependencies
24 //
25 #include <umtypes.h>
26 #include <cfg.h>
27 #if defined(_MSC_VER) && !defined(NTOS_MODE_USER)
28 #include <ntimage.h>
29 #endif
30 #include <cmtypes.h>
31 #include <ketypes.h>
32 #include <potypes.h>
33 #include <lpctypes.h>
34
35 //
36 // Atom and Language IDs
37 //
38 typedef USHORT LANGID, *PLANGID;
39 typedef USHORT RTL_ATOM, *PRTL_ATOM;
40
41 #ifndef NTOS_MODE_USER
42
43 //
44 // Kernel Exported Object Types
45 //
46 extern POBJECT_TYPE NTSYSAPI ExIoCompletionType;
47 extern POBJECT_TYPE NTSYSAPI ExMutantObjectType;
48 extern POBJECT_TYPE NTSYSAPI ExTimerType;
49
50 //
51 // Exported NT Build Number
52 //
53 extern ULONG NTSYSAPI NtBuildNumber;
54
55 //
56 // Invalid Handle Value Constant
57 //
58 #define INVALID_HANDLE_VALUE (HANDLE)-1
59
60 #endif
61
62 //
63 // Increments
64 //
65 #define MUTANT_INCREMENT 1
66
67 //
68 // Callback Object Access Mask
69 //
70 #define CALLBACK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x0001)
71 #define CALLBACK_EXECUTE (STANDARD_RIGHTS_EXECUTE|SYNCHRONIZE|0x0001)
72 #define CALLBACK_WRITE (STANDARD_RIGHTS_WRITE|SYNCHRONIZE|0x0001)
73 #define CALLBACK_READ (STANDARD_RIGHTS_READ|SYNCHRONIZE|0x0001)
74
75 //
76 // Event Object Access Masks
77 //
78 #ifdef NTOS_MODE_USER
79 #define EVENT_QUERY_STATE 0x0001
80
81 //
82 // Semaphore Object Acess Masks
83 //
84 #define SEMAPHORE_QUERY_STATE 0x0001
85 #endif
86
87 //
88 // Event Pair Access Masks
89 //
90 #define EVENT_PAIR_ALL_ACCESS 0x1F0000L
91
92 //
93 // Profile Object Access Masks
94 //
95 #define PROFILE_CONTROL 0x0001
96 #define PROFILE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | PROFILE_CONTROL)
97
98 //
99 // Maximum Parameters for NtRaiseHardError
100 //
101 #define MAXIMUM_HARDERROR_PARAMETERS 4
102
103 //
104 // Pushlock bits
105 //
106 #define EX_PUSH_LOCK_LOCK_V ((ULONG_PTR)0x0)
107 #define EX_PUSH_LOCK_LOCK ((ULONG_PTR)0x1)
108 #define EX_PUSH_LOCK_WAITING ((ULONG_PTR)0x2)
109 #define EX_PUSH_LOCK_WAKING ((ULONG_PTR)0x4)
110 #define EX_PUSH_LOCK_MULTIPLE_SHARED ((ULONG_PTR)0x8)
111 #define EX_PUSH_LOCK_SHARE_INC ((ULONG_PTR)0x10)
112 #define EX_PUSH_LOCK_PTR_BITS ((ULONG_PTR)0xf)
113
114 //
115 // Pushlock Wait Block Flags
116 //
117 #define EX_PUSH_LOCK_FLAGS_EXCLUSIVE 1
118 #define EX_PUSH_LOCK_FLAGS_WAIT 2
119
120 //
121 // Shutdown types for NtShutdownSystem
122 //
123 typedef enum _SHUTDOWN_ACTION
124 {
125 ShutdownNoReboot,
126 ShutdownReboot,
127 ShutdownPowerOff
128 } SHUTDOWN_ACTION;
129
130 //
131 // Responses for NtRaiseHardError
132 //
133 typedef enum _HARDERROR_RESPONSE_OPTION
134 {
135 OptionAbortRetryIgnore,
136 OptionOk,
137 OptionOkCancel,
138 OptionRetryCancel,
139 OptionYesNo,
140 OptionYesNoCancel,
141 OptionShutdownSystem
142 } HARDERROR_RESPONSE_OPTION, *PHARDERROR_RESPONSE_OPTION;
143
144 typedef enum _HARDERROR_RESPONSE
145 {
146 ResponseReturnToCaller,
147 ResponseNotHandled,
148 ResponseAbort,
149 ResponseCancel,
150 ResponseIgnore,
151 ResponseNo,
152 ResponseOk,
153 ResponseRetry,
154 ResponseYes
155 } HARDERROR_RESPONSE, *PHARDERROR_RESPONSE;
156
157 //
158 // System Information Classes for NtQuerySystemInformation
159 //
160 typedef enum _SYSTEM_INFORMATION_CLASS
161 {
162 SystemBasicInformation,
163 SystemProcessorInformation,
164 SystemPerformanceInformation,
165 SystemTimeOfDayInformation,
166 SystemPathInformation, /// Obsolete: Use KUSER_SHARED_DATA
167 SystemProcessInformation,
168 SystemCallCountInformation,
169 SystemDeviceInformation,
170 SystemProcessorPerformanceInformation,
171 SystemFlagsInformation,
172 SystemCallTimeInformation,
173 SystemModuleInformation,
174 SystemLocksInformation,
175 SystemStackTraceInformation,
176 SystemPagedPoolInformation,
177 SystemNonPagedPoolInformation,
178 SystemHandleInformation,
179 SystemObjectInformation,
180 SystemPageFileInformation,
181 SystemVdmInstemulInformation,
182 SystemVdmBopInformation,
183 SystemFileCacheInformation,
184 SystemPoolTagInformation,
185 SystemInterruptInformation,
186 SystemDpcBehaviorInformation,
187 SystemFullMemoryInformation,
188 SystemLoadGdiDriverInformation,
189 SystemUnloadGdiDriverInformation,
190 SystemTimeAdjustmentInformation,
191 SystemSummaryMemoryInformation,
192 SystemNextEventIdInformation,
193 SystemEventIdsInformation,
194 SystemCrashDumpInformation,
195 SystemExceptionInformation,
196 SystemCrashDumpStateInformation,
197 SystemKernelDebuggerInformation,
198 SystemContextSwitchInformation,
199 SystemRegistryQuotaInformation,
200 SystemExtendServiceTableInformation,
201 SystemPrioritySeperation,
202 SystemPlugPlayBusInformation,
203 SystemDockInformation,
204 SystemPowerInformationNative,
205 SystemProcessorSpeedInformation,
206 SystemCurrentTimeZoneInformation,
207 SystemLookasideInformation,
208 SystemTimeSlipNotification,
209 SystemSessionCreate,
210 SystemSessionDetach,
211 SystemSessionInformation,
212 SystemRangeStartInformation,
213 SystemVerifierInformation,
214 SystemAddVerifier,
215 SystemSessionProcessesInformation,
216 SystemInformationClassMax
217 } SYSTEM_INFORMATION_CLASS;
218
219 //
220 // System Information Classes for NtQueryMutant
221 //
222 typedef enum _MUTANT_INFORMATION_CLASS
223 {
224 MutantBasicInformation
225 } MUTANT_INFORMATION_CLASS;
226
227 //
228 // System Information Classes for NtQueryAtom
229 //
230 typedef enum _ATOM_INFORMATION_CLASS
231 {
232 AtomBasicInformation,
233 AtomTableInformation,
234 } ATOM_INFORMATION_CLASS;
235
236 //
237 // System Information Classes for NtQueryTimer
238 //
239 typedef enum _TIMER_INFORMATION_CLASS
240 {
241 TimerBasicInformation
242 } TIMER_INFORMATION_CLASS;
243
244 //
245 // System Information Classes for NtQuerySemaphore
246 //
247 typedef enum _SEMAPHORE_INFORMATION_CLASS
248 {
249 SemaphoreBasicInformation
250 } SEMAPHORE_INFORMATION_CLASS;
251
252 //
253 // System Information Classes for NtQueryEvent
254 //
255 typedef enum _EVENT_INFORMATION_CLASS
256 {
257 EventBasicInformation
258 } EVENT_INFORMATION_CLASS;
259
260 #ifndef NTOS_MODE_USER
261
262 //
263 // Executive Work Queue Structures
264 //
265 typedef struct _EX_QUEUE_WORKER_INFO
266 {
267 ULONG QueueDisabled:1;
268 ULONG MakeThreadsAsNecessary:1;
269 ULONG WaitMode:1;
270 ULONG WorkerCount:29;
271 } EX_QUEUE_WORKER_INFO, *PEX_QUEUE_WORKER_INFO;
272
273 typedef struct _EX_WORK_QUEUE
274 {
275 KQUEUE WorkerQueue;
276 LONG DynamicThreadCount;
277 ULONG WorkItemsProcessed;
278 ULONG WorkItemsProcessedLastPass;
279 ULONG QueueDepthLastPass;
280 EX_QUEUE_WORKER_INFO Info;
281 } EX_WORK_QUEUE, *PEX_WORK_QUEUE;
282
283 //
284 // Executive Fast Reference Structure
285 //
286 typedef struct _EX_FAST_REF
287 {
288 union
289 {
290 PVOID Object;
291 ULONG RefCnt:3;
292 ULONG Value;
293 };
294 } EX_FAST_REF, *PEX_FAST_REF;
295
296 //
297 // Executive Cache-Aware Rundown Reference Descriptor
298 //
299 typedef struct _EX_RUNDOWN_REF_CACHE_AWARE
300 {
301 union
302 {
303 ULONG_PTR Count;
304 PVOID Ptr;
305 };
306 PVOID PoolToFree;
307 } EX_RUNDOWN_REF_CACHE_AWARE, *PEX_RUNDOWN_REF_CACHE_AWARE;
308
309 //
310 // Executive Rundown Wait Block
311 //
312 typedef struct _EX_RUNDOWN_WAIT_BLOCK
313 {
314 ULONG_PTR Count;
315 KEVENT RundownEvent;
316 } EX_RUNDOWN_WAIT_BLOCK, *PEX_RUNDOWN_WAIT_BLOCK;
317
318 //
319 // Executive Pushlock
320 //
321 #undef EX_PUSH_LOCK
322 #undef PEX_PUSH_LOCK
323 typedef struct _EX_PUSH_LOCK
324 {
325 union
326 {
327 struct
328 {
329 ULONG_PTR Locked:1;
330 ULONG_PTR Waiting:1;
331 ULONG_PTR Waking:1;
332 ULONG_PTR MultipleShared:1;
333 ULONG_PTR Shared:sizeof (ULONG_PTR) * 8 - 4;
334 };
335 ULONG_PTR Value;
336 PVOID Ptr;
337 };
338 } EX_PUSH_LOCK, *PEX_PUSH_LOCK;
339
340 //
341 // Executive Pushlock Wait Block
342 //
343 #ifndef __GNUC__ // WARNING! PUSHLOCKS WILL NOT WORK IN GCC FOR NOW!!!
344 __declspec(align(16))
345 #endif
346 typedef struct _EX_PUSH_LOCK_WAIT_BLOCK
347 {
348 union
349 {
350 KGATE WakeGate;
351 KEVENT WakeEvent;
352 };
353 struct _EX_PUSH_LOCK_WAIT_BLOCK *Next;
354 struct _EX_PUSH_LOCK_WAIT_BLOCK *Last;
355 struct _EX_PUSH_LOCK_WAIT_BLOCK *Previous;
356 LONG ShareCount;
357 LONG Flags;
358 #if DBG
359 BOOLEAN Signaled;
360 EX_PUSH_LOCK NewValue;
361 EX_PUSH_LOCK OldValue;
362 PEX_PUSH_LOCK PushLock;
363 #endif
364 } EX_PUSH_LOCK_WAIT_BLOCK, *PEX_PUSH_LOCK_WAIT_BLOCK;
365
366 //
367 // Callback Object
368 //
369 typedef struct _CALLBACK_OBJECT
370 {
371 ULONG Name;
372 KSPIN_LOCK Lock;
373 LIST_ENTRY RegisteredCallbacks;
374 ULONG AllowMultipleCallbacks;
375 } CALLBACK_OBJECT , *PCALLBACK_OBJECT;
376
377 //
378 // Profile OBject
379 //
380 typedef struct _EPROFILE
381 {
382 PEPROCESS Process;
383 PVOID ImageBase;
384 SIZE_T ImageSize;
385 PVOID Buffer;
386 ULONG BufferSize;
387 ULONG BucketSize;
388 PKPROFILE KeProfile;
389 PVOID LockedBuffer;
390 PMDL Mdl;
391 ULONG Segment;
392 KPROFILE_SOURCE ProfileSource;
393 KAFFINITY Affinity;
394 } EPROFILE, *PEPROFILE;
395
396 //
397 // Handle Table Structures
398 //
399 typedef struct _HANDLE_TABLE_ENTRY_INFO
400 {
401 ULONG AuditMask;
402 } HANDLE_TABLE_ENTRY_INFO, *PHANDLE_TABLE_ENTRY_INFO;
403
404 typedef struct _HANDLE_TABLE_ENTRY
405 {
406 union
407 {
408 PVOID Object;
409 ULONG_PTR ObAttributes;
410 PHANDLE_TABLE_ENTRY_INFO InfoTable;
411 ULONG_PTR Value;
412 } u1;
413 union
414 {
415 ULONG GrantedAccess;
416 USHORT GrantedAccessIndex;
417 LONG NextFreeTableEntry;
418 } u2;
419 } HANDLE_TABLE_ENTRY, *PHANDLE_TABLE_ENTRY;
420
421 typedef struct _HANDLE_TABLE
422 {
423 ULONG Flags;
424 LONG HandleCount;
425 PHANDLE_TABLE_ENTRY **Table;
426 PEPROCESS QuotaProcess;
427 HANDLE UniqueProcessId;
428 LONG FirstFreeTableEntry;
429 LONG NextIndexNeedingPool;
430 ERESOURCE HandleTableLock;
431 LIST_ENTRY HandleTableList;
432 KEVENT HandleContentionEvent;
433 } HANDLE_TABLE, *PHANDLE_TABLE;
434
435 #endif
436
437 //
438 // Hard Error LPC Message
439 //
440 typedef struct _HARDERROR_MSG
441 {
442 PORT_MESSAGE h;
443 NTSTATUS Status;
444 LARGE_INTEGER ErrorTime;
445 ULONG ValidResponseOptions;
446 ULONG Response;
447 ULONG NumberOfParameters;
448 ULONG UnicodeStringParameterMask;
449 ULONG Parameters[MAXIMUM_HARDERROR_PARAMETERS];
450 } HARDERROR_MSG, *PHARDERROR_MSG;
451
452 //
453 // Information Structures for NtQueryMutant
454 //
455 typedef struct _MUTANT_BASIC_INFORMATION
456 {
457 LONG CurrentCount;
458 BOOLEAN OwnedByCaller;
459 BOOLEAN AbandonedState;
460 } MUTANT_BASIC_INFORMATION, *PMUTANT_BASIC_INFORMATION;
461
462 //
463 // Information Structures for NtQueryAtom
464 //
465 typedef struct _ATOM_BASIC_INFORMATION
466 {
467 USHORT UsageCount;
468 USHORT Flags;
469 USHORT NameLength;
470 WCHAR Name[1];
471 } ATOM_BASIC_INFORMATION, *PATOM_BASIC_INFORMATION;
472
473 typedef struct _ATOM_TABLE_INFORMATION
474 {
475 ULONG NumberOfAtoms;
476 USHORT Atoms[1];
477 } ATOM_TABLE_INFORMATION, *PATOM_TABLE_INFORMATION;
478
479 //
480 // Information Structures for NtQueryTimer
481 //
482 typedef struct _TIMER_BASIC_INFORMATION
483 {
484 LARGE_INTEGER TimeRemaining;
485 BOOLEAN SignalState;
486 } TIMER_BASIC_INFORMATION, *PTIMER_BASIC_INFORMATION;
487
488 //
489 // Information Structures for NtQuerySemaphore
490 //
491 typedef struct _SEMAPHORE_BASIC_INFORMATION
492 {
493 LONG CurrentCount;
494 LONG MaximumCount;
495 } SEMAPHORE_BASIC_INFORMATION, *PSEMAPHORE_BASIC_INFORMATION;
496
497 //
498 // Information Structures for NtQueryEvent
499 //
500 typedef struct _EVENT_BASIC_INFORMATION
501 {
502 EVENT_TYPE EventType;
503 LONG EventState;
504 } EVENT_BASIC_INFORMATION, *PEVENT_BASIC_INFORMATION;
505
506 //
507 // Information Structures for NtQuerySystemInformation
508 //
509 typedef struct _SYSTEM_BASIC_INFORMATION
510 {
511 ULONG Reserved;
512 ULONG TimerResolution;
513 ULONG PageSize;
514 ULONG NumberOfPhysicalPages;
515 ULONG LowestPhysicalPageNumber;
516 ULONG HighestPhysicalPageNumber;
517 ULONG AllocationGranularity;
518 ULONG MinimumUserModeAddress;
519 ULONG MaximumUserModeAddress;
520 KAFFINITY ActiveProcessorsAffinityMask;
521 CCHAR NumberOfProcessors;
522 } SYSTEM_BASIC_INFORMATION, *PSYSTEM_BASIC_INFORMATION;
523
524 // Class 1
525 typedef struct _SYSTEM_PROCESSOR_INFORMATION
526 {
527 USHORT ProcessorArchitecture;
528 USHORT ProcessorLevel;
529 USHORT ProcessorRevision;
530 USHORT Reserved;
531 ULONG ProcessorFeatureBits;
532 } SYSTEM_PROCESSOR_INFORMATION, *PSYSTEM_PROCESSOR_INFORMATION;
533
534 // Class 2
535 typedef struct _SYSTEM_PERFORMANCE_INFORMATION
536 {
537 LARGE_INTEGER IdleProcessTime;
538 LARGE_INTEGER IoReadTransferCount;
539 LARGE_INTEGER IoWriteTransferCount;
540 LARGE_INTEGER IoOtherTransferCount;
541 ULONG IoReadOperationCount;
542 ULONG IoWriteOperationCount;
543 ULONG IoOtherOperationCount;
544 ULONG AvailablePages;
545 ULONG CommittedPages;
546 ULONG CommitLimit;
547 ULONG PeakCommitment;
548 ULONG PageFaultCount;
549 ULONG CopyOnWriteCount;
550 ULONG TransitionCount;
551 ULONG CacheTransitionCount;
552 ULONG DemandZeroCount;
553 ULONG PageReadCount;
554 ULONG PageReadIoCount;
555 ULONG CacheReadCount;
556 ULONG CacheIoCount;
557 ULONG DirtyPagesWriteCount;
558 ULONG DirtyWriteIoCount;
559 ULONG MappedPagesWriteCount;
560 ULONG MappedWriteIoCount;
561 ULONG PagedPoolPages;
562 ULONG NonPagedPoolPages;
563 ULONG PagedPoolAllocs;
564 ULONG PagedPoolFrees;
565 ULONG NonPagedPoolAllocs;
566 ULONG NonPagedPoolFrees;
567 ULONG FreeSystemPtes;
568 ULONG ResidentSystemCodePage;
569 ULONG TotalSystemDriverPages;
570 ULONG TotalSystemCodePages;
571 ULONG NonPagedPoolLookasideHits;
572 ULONG PagedPoolLookasideHits;
573 ULONG Spare3Count;
574 ULONG ResidentSystemCachePage;
575 ULONG ResidentPagedPoolPage;
576 ULONG ResidentSystemDriverPage;
577 ULONG CcFastReadNoWait;
578 ULONG CcFastReadWait;
579 ULONG CcFastReadResourceMiss;
580 ULONG CcFastReadNotPossible;
581 ULONG CcFastMdlReadNoWait;
582 ULONG CcFastMdlReadWait;
583 ULONG CcFastMdlReadResourceMiss;
584 ULONG CcFastMdlReadNotPossible;
585 ULONG CcMapDataNoWait;
586 ULONG CcMapDataWait;
587 ULONG CcMapDataNoWaitMiss;
588 ULONG CcMapDataWaitMiss;
589 ULONG CcPinMappedDataCount;
590 ULONG CcPinReadNoWait;
591 ULONG CcPinReadWait;
592 ULONG CcPinReadNoWaitMiss;
593 ULONG CcPinReadWaitMiss;
594 ULONG CcCopyReadNoWait;
595 ULONG CcCopyReadWait;
596 ULONG CcCopyReadNoWaitMiss;
597 ULONG CcCopyReadWaitMiss;
598 ULONG CcMdlReadNoWait;
599 ULONG CcMdlReadWait;
600 ULONG CcMdlReadNoWaitMiss;
601 ULONG CcMdlReadWaitMiss;
602 ULONG CcReadAheadIos;
603 ULONG CcLazyWriteIos;
604 ULONG CcLazyWritePages;
605 ULONG CcDataFlushes;
606 ULONG CcDataPages;
607 ULONG ContextSwitches;
608 ULONG FirstLevelTbFills;
609 ULONG SecondLevelTbFills;
610 ULONG SystemCalls;
611 } SYSTEM_PERFORMANCE_INFORMATION, *PSYSTEM_PERFORMANCE_INFORMATION;
612
613 // Class 3
614 typedef struct _SYSTEM_TIMEOFDAY_INFORMATION
615 {
616 LARGE_INTEGER BootTime;
617 LARGE_INTEGER CurrentTime;
618 LARGE_INTEGER TimeZoneBias;
619 ULONG TimeZoneId;
620 ULONG Reserved;
621 } SYSTEM_TIMEOFDAY_INFORMATION, *PSYSTEM_TIMEOFDAY_INFORMATION;
622
623 // Class 4
624 // This class is obsolete, please use KUSER_SHARED_DATA instead
625
626 // Class 5
627 typedef struct _SYSTEM_THREAD_INFORMATION
628 {
629 LARGE_INTEGER KernelTime;
630 LARGE_INTEGER UserTime;
631 LARGE_INTEGER CreateTime;
632 ULONG WaitTime;
633 PVOID StartAddress;
634 CLIENT_ID ClientId;
635 KPRIORITY Priority;
636 LONG BasePriority;
637 ULONG ContextSwitches;
638 ULONG ThreadState;
639 ULONG WaitReason;
640 } SYSTEM_THREAD_INFORMATION, *PSYSTEM_THREAD_INFORMATION;
641
642 typedef struct _SYSTEM_PROCESS_INFORMATION
643 {
644 ULONG NextEntryOffset;
645 ULONG NumberOfThreads;
646 LARGE_INTEGER SpareLi1;
647 LARGE_INTEGER SpareLi2;
648 LARGE_INTEGER SpareLi3;
649 LARGE_INTEGER CreateTime;
650 LARGE_INTEGER UserTime;
651 LARGE_INTEGER KernelTime;
652 UNICODE_STRING ImageName;
653 KPRIORITY BasePriority;
654 HANDLE UniqueProcessId;
655 HANDLE InheritedFromUniqueProcessId;
656 ULONG HandleCount;
657 ULONG SessionId;
658 ULONG PageDirectoryFrame;
659
660 //
661 // This part corresponds to VM_COUNTERS_EX.
662 // NOTE: *NOT* THE SAME AS VM_COUNTERS!
663 //
664 ULONG PeakVirtualSize;
665 ULONG VirtualSize;
666 ULONG PageFaultCount;
667 ULONG PeakWorkingSetSize;
668 ULONG WorkingSetSize;
669 ULONG QuotaPeakPagedPoolUsage;
670 ULONG QuotaPagedPoolUsage;
671 ULONG QuotaPeakNonPagedPoolUsage;
672 ULONG QuotaNonPagedPoolUsage;
673 ULONG PagefileUsage;
674 ULONG PeakPagefileUsage;
675 ULONG PrivateUsage;
676
677 //
678 // This part corresponds to IO_COUNTERS
679 //
680 LARGE_INTEGER ReadOperationCount;
681 LARGE_INTEGER WriteOperationCount;
682 LARGE_INTEGER OtherOperationCount;
683 LARGE_INTEGER ReadTransferCount;
684 LARGE_INTEGER WriteTransferCount;
685 LARGE_INTEGER OtherTransferCount;
686
687 SYSTEM_THREAD_INFORMATION TH[1];
688 } SYSTEM_PROCESS_INFORMATION, *PSYSTEM_PROCESS_INFORMATION;
689
690 // Class 6
691 typedef struct _SYSTEM_CALL_COUNT_INFORMATION
692 {
693 ULONG Length;
694 ULONG NumberOfTables;
695 } SYSTEM_CALL_COUNT_INFORMATION, *PSYSTEM_CALL_COUNT_INFORMATION;
696
697 // Class 7
698 typedef struct _SYSTEM_DEVICE_INFORMATION
699 {
700 ULONG NumberOfDisks;
701 ULONG NumberOfFloppies;
702 ULONG NumberOfCdRoms;
703 ULONG NumberOfTapes;
704 ULONG NumberOfSerialPorts;
705 ULONG NumberOfParallelPorts;
706 } SYSTEM_DEVICE_INFORMATION, *PSYSTEM_DEVICE_INFORMATION;
707
708 // Class 8
709 typedef struct _SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION
710 {
711 LARGE_INTEGER IdleTime;
712 LARGE_INTEGER KernelTime;
713 LARGE_INTEGER UserTime;
714 LARGE_INTEGER DpcTime;
715 LARGE_INTEGER InterruptTime;
716 ULONG InterruptCount;
717 } SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION, *PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION;
718
719 // Class 9
720 typedef struct _SYSTEM_FLAGS_INFORMATION
721 {
722 ULONG Flags;
723 } SYSTEM_FLAGS_INFORMATION, *PSYSTEM_FLAGS_INFORMATION;
724
725 // Class 10
726 typedef struct _SYSTEM_CALL_TIME_INFORMATION
727 {
728 ULONG Length;
729 ULONG TotalCalls;
730 LARGE_INTEGER TimeOfCalls[1];
731 } SYSTEM_CALL_TIME_INFORMATION, *PSYSTEM_CALL_TIME_INFORMATION;
732
733 // Class 11
734 typedef struct _SYSTEM_MODULE_INFORMATION_ENTRY
735 {
736 ULONG Unknown1;
737 ULONG Unknown2;
738 PVOID Base;
739 ULONG Size;
740 ULONG Flags;
741 USHORT Index;
742 USHORT NameLength;
743 USHORT LoadCount;
744 USHORT PathLength;
745 CHAR ImageName[256];
746 } SYSTEM_MODULE_INFORMATION_ENTRY, *PSYSTEM_MODULE_INFORMATION_ENTRY;
747 typedef struct _SYSTEM_MODULE_INFORMATION
748 {
749 ULONG Count;
750 SYSTEM_MODULE_INFORMATION_ENTRY Module[1];
751 } SYSTEM_MODULE_INFORMATION, *PSYSTEM_MODULE_INFORMATION;
752
753 // Class 12
754 typedef struct _SYSTEM_RESOURCE_LOCK_ENTRY
755 {
756 ULONG ResourceAddress;
757 ULONG Always1;
758 ULONG Unknown;
759 ULONG ActiveCount;
760 ULONG ContentionCount;
761 ULONG Unused[2];
762 ULONG NumberOfSharedWaiters;
763 ULONG NumberOfExclusiveWaiters;
764 } SYSTEM_RESOURCE_LOCK_ENTRY, *PSYSTEM_RESOURCE_LOCK_ENTRY;
765
766 typedef struct _SYSTEM_RESOURCE_LOCK_INFO
767 {
768 ULONG Count;
769 SYSTEM_RESOURCE_LOCK_ENTRY Lock[1];
770 } SYSTEM_RESOURCE_LOCK_INFO, *PSYSTEM_RESOURCE_LOCK_INFO;
771
772 // FIXME: Class 13
773 typedef struct _SYSTEM_BACKTRACE_INFORMATION_ENTRY
774 {
775 ULONG Dummy;
776 } SYSTEM_BACKTRACE_INFORMATION_ENTRY, *PSYSTEM_BACKTRACE_INFORMATION_ENTRY;
777
778 typedef struct _SYSTEM_BACKTRACE_INFORMATION
779 {
780 ULONG Unknown[4];
781 ULONG Count;
782 SYSTEM_BACKTRACE_INFORMATION_ENTRY Trace[1];
783 } SYSTEM_BACKTRACE_INFORMATION, *PSYSTEM_BACKTRACE_INFORMATION;
784
785 // Class 14 - 15
786 typedef struct _SYSTEM_POOL_ENTRY
787 {
788 BOOLEAN Allocated;
789 BOOLEAN Spare0;
790 USHORT AllocatorBackTraceIndex;
791 ULONG Size;
792 union
793 {
794 UCHAR Tag[4];
795 ULONG TagUlong;
796 PVOID ProcessChargedQuota;
797 };
798 } SYSTEM_POOL_ENTRY, *PSYSTEM_POOL_ENTRY;
799
800 typedef struct _SYSTEM_POOL_INFORMATION
801 {
802 ULONG TotalSize;
803 PVOID FirstEntry;
804 USHORT EntryOverhead;
805 BOOLEAN PoolTagPresent;
806 BOOLEAN Spare0;
807 ULONG NumberOfEntries;
808 SYSTEM_POOL_ENTRY Entries[1];
809 } SYSTEM_POOL_INFORMATION, *PSYSTEM_POOL_INFORMATION;
810
811 // Class 16
812 typedef struct _SYSTEM_HANDLE_TABLE_ENTRY_INFO
813 {
814 USHORT UniqueProcessId;
815 USHORT CreatorBackTraceIndex;
816 UCHAR ObjectTypeIndex;
817 UCHAR HandleAttributes;
818 USHORT HandleValue;
819 PVOID Object;
820 ULONG GrantedAccess;
821 } SYSTEM_HANDLE_TABLE_ENTRY_INFO, *PSYSTEM_HANDLE_TABLE_ENTRY_INFO;
822
823 typedef struct _SYSTEM_HANDLE_INFORMATION
824 {
825 ULONG NumberOfHandles;
826 SYSTEM_HANDLE_TABLE_ENTRY_INFO Handles[1];
827 } SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
828
829 // Class 17
830 typedef struct _SYSTEM_OBJECTTYPE_INFORMATION
831 {
832 ULONG NextEntryOffset;
833 ULONG NumberOfObjects;
834 ULONG NumberOfHandles;
835 ULONG TypeIndex;
836 ULONG InvalidAttributes;
837 GENERIC_MAPPING GenericMapping;
838 ULONG ValidAccessMask;
839 ULONG PoolType;
840 BOOLEAN SecurityRequired;
841 BOOLEAN WaitableObject;
842 UNICODE_STRING TypeName;
843 } SYSTEM_OBJECTTYPE_INFORMATION, *PSYSTEM_OBJECTTYPE_INFORMATION;
844
845 typedef struct _SYSTEM_OBJECT_INFORMATION
846 {
847 ULONG NextEntryOffset;
848 PVOID Object;
849 HANDLE CreatorUniqueProcess;
850 USHORT CreatorBackTraceIndex;
851 USHORT Flags;
852 LONG PointerCount;
853 LONG HandleCount;
854 ULONG PagedPoolCharge;
855 ULONG NonPagedPoolCharge;
856 HANDLE ExclusiveProcessId;
857 PVOID SecurityDescriptor;
858 OBJECT_NAME_INFORMATION NameInfo;
859 } SYSTEM_OBJECT_INFORMATION, *PSYSTEM_OBJECT_INFORMATION;
860
861 // Class 18
862 typedef struct _SYSTEM_PAGEFILE_INFORMATION
863 {
864 ULONG NextEntryOffset;
865 ULONG TotalSize;
866 ULONG TotalInUse;
867 ULONG PeakUsage;
868 UNICODE_STRING PageFileName;
869 } SYSTEM_PAGEFILE_INFORMATION, *PSYSTEM_PAGEFILE_INFORMATION;
870
871 // Class 19
872 typedef struct _SYSTEM_VDM_INSTEMUL_INFO
873 {
874 ULONG SegmentNotPresent;
875 ULONG VdmOpcode0F;
876 ULONG OpcodeESPrefix;
877 ULONG OpcodeCSPrefix;
878 ULONG OpcodeSSPrefix;
879 ULONG OpcodeDSPrefix;
880 ULONG OpcodeFSPrefix;
881 ULONG OpcodeGSPrefix;
882 ULONG OpcodeOPER32Prefix;
883 ULONG OpcodeADDR32Prefix;
884 ULONG OpcodeINSB;
885 ULONG OpcodeINSW;
886 ULONG OpcodeOUTSB;
887 ULONG OpcodeOUTSW;
888 ULONG OpcodePUSHF;
889 ULONG OpcodePOPF;
890 ULONG OpcodeINTnn;
891 ULONG OpcodeINTO;
892 ULONG OpcodeIRET;
893 ULONG OpcodeINBimm;
894 ULONG OpcodeINWimm;
895 ULONG OpcodeOUTBimm;
896 ULONG OpcodeOUTWimm ;
897 ULONG OpcodeINB;
898 ULONG OpcodeINW;
899 ULONG OpcodeOUTB;
900 ULONG OpcodeOUTW;
901 ULONG OpcodeLOCKPrefix;
902 ULONG OpcodeREPNEPrefix;
903 ULONG OpcodeREPPrefix;
904 ULONG OpcodeHLT;
905 ULONG OpcodeCLI;
906 ULONG OpcodeSTI;
907 ULONG BopCount;
908 } SYSTEM_VDM_INSTEMUL_INFO, *PSYSTEM_VDM_INSTEMUL_INFO;
909
910 // FIXME: Class 20
911 typedef struct _SYSTEM_VDM_BOP_INFO
912 {
913 PVOID Dummy;
914 } SYSTEM_VDM_BOP_INFO, *PSYSTEM_VDM_BOP_INFO;
915
916 // Class 21
917 typedef struct _SYSTEM_CACHE_INFORMATION
918 {
919 ULONG CurrentSize;
920 ULONG PeakSize;
921 ULONG PageFaultCount;
922 ULONG MinimumWorkingSet;
923 ULONG MaximumWorkingSet;
924 ULONG CurrentSizeIncludingTransitionInPages;
925 ULONG PeakSizeIncludingTransitionInPages;
926 ULONG Unused[2];
927 } SYSTEM_CACHE_INFORMATION, *PSYSTEM_CACHE_INFORMATION;
928
929 // Class 22
930 typedef struct _SYSTEM_POOLTAG
931 {
932 union
933 {
934 UCHAR Tag[4];
935 ULONG TagUlong;
936 };
937 ULONG PagedAllocs;
938 ULONG PagedFrees;
939 ULONG PagedUsed;
940 ULONG NonPagedAllocs;
941 ULONG NonPagedFrees;
942 ULONG NonPagedUsed;
943 } SYSTEM_POOLTAG, *PSYSTEM_POOLTAG;
944 typedef struct _SYSTEM_POOLTAG_INFORMATION
945 {
946 ULONG Count;
947 SYSTEM_POOLTAG TagInfo[1];
948 } SYSTEM_POOLTAG_INFORMATION, *PSYSTEM_POOLTAG_INFORMATION;
949
950 // Class 23
951 typedef struct _SYSTEM_INTERRUPT_INFORMATION
952 {
953 ULONG ContextSwitches;
954 ULONG DpcCount;
955 ULONG DpcRate;
956 ULONG TimeIncrement;
957 ULONG DpcBypassCount;
958 ULONG ApcBypassCount;
959 } SYSTEM_INTERRUPT_INFORMATION, *PSYSTEM_INTERRUPT_INFORMATION;
960
961 // Class 24
962 typedef struct _SYSTEM_DPC_BEHAVIOR_INFORMATION
963 {
964 ULONG Spare;
965 ULONG DpcQueueDepth;
966 ULONG MinimumDpcRate;
967 ULONG AdjustDpcThreshold;
968 ULONG IdealDpcRate;
969 } SYSTEM_DPC_BEHAVIOR_INFORMATION, *PSYSTEM_DPC_BEHAVIOR_INFORMATION;
970
971 // Class 25
972 typedef struct _SYSTEM_MEMORY_INFO
973 {
974 PUCHAR StringOffset;
975 USHORT ValidCount;
976 USHORT TransitionCount;
977 USHORT ModifiedCount;
978 USHORT PageTableCount;
979 } SYSTEM_MEMORY_INFO, *PSYSTEM_MEMORY_INFO;
980 typedef struct _SYSTEM_MEMORY_INFORMATION
981 {
982 ULONG InfoSize;
983 ULONG StringStart;
984 SYSTEM_MEMORY_INFO Memory[1];
985 } SYSTEM_MEMORY_INFORMATION, *PSYSTEM_MEMORY_INFORMATION;
986
987 // Class 26
988 typedef struct _SYSTEM_GDI_DRIVER_INFORMATION
989 {
990 UNICODE_STRING DriverName;
991 PVOID ImageAddress;
992 PVOID SectionPointer;
993 PVOID EntryPoint;
994 PIMAGE_EXPORT_DIRECTORY ExportSectionPointer;
995 } SYSTEM_GDI_DRIVER_INFORMATION, *PSYSTEM_GDI_DRIVER_INFORMATION;
996
997 // Class 27
998 // Not an actually class, simply a PVOID to the ImageAddress
999
1000 // Class 28
1001 typedef struct _SYSTEM_QUERY_TIME_ADJUST_INFORMATION
1002 {
1003 ULONG TimeAdjustment;
1004 ULONG TimeIncrement;
1005 BOOLEAN Enable;
1006 } SYSTEM_QUERY_TIME_ADJUST_INFORMATION, *PSYSTEM_QUERY_TIME_ADJUST_INFORMATION;
1007
1008 typedef struct _SYSTEM_SET_TIME_ADJUST_INFORMATION
1009 {
1010 ULONG TimeAdjustment;
1011 BOOLEAN Enable;
1012 } SYSTEM_SET_TIME_ADJUST_INFORMATION, *PSYSTEM_SET_TIME_ADJUST_INFORMATION;
1013
1014 // Class 29 - Same as 25
1015
1016 // FIXME: Class 30 - 31
1017
1018 // Class 32
1019 typedef struct _SYSTEM_CRASH_DUMP_INFORMATION
1020 {
1021 HANDLE CrashDumpSection;
1022 } SYSTEM_CRASH_DUMP_INFORMATION, *PSYSTEM_CRASH_DUMP_INFORMATION;
1023
1024 // Class 33
1025 typedef struct _SYSTEM_EXCEPTION_INFORMATION
1026 {
1027 ULONG AlignmentFixupCount;
1028 ULONG ExceptionDispatchCount;
1029 ULONG FloatingEmulationCount;
1030 ULONG ByteWordEmulationCount;
1031 } SYSTEM_EXCEPTION_INFORMATION, *PSYSTEM_EXCEPTION_INFORMATION;
1032
1033 // Class 34
1034 typedef struct _SYSTEM_CRASH_STATE_INFORMATION
1035 {
1036 ULONG ValidCrashDump;
1037 } SYSTEM_CRASH_STATE_INFORMATION, *PSYSTEM_CRASH_STATE_INFORMATION;
1038
1039 // Class 35
1040 typedef struct _SYSTEM_KERNEL_DEBUGGER_INFORMATION
1041 {
1042 BOOLEAN KernelDebuggerEnabled;
1043 BOOLEAN KernelDebuggerNotPresent;
1044 } SYSTEM_KERNEL_DEBUGGER_INFORMATION, *PSYSTEM_KERNEL_DEBUGGER_INFORMATION;
1045
1046 // Class 36
1047 typedef struct _SYSTEM_CONTEXT_SWITCH_INFORMATION
1048 {
1049 ULONG ContextSwitches;
1050 ULONG FindAny;
1051 ULONG FindLast;
1052 ULONG FindIdeal;
1053 ULONG IdleAny;
1054 ULONG IdleCurrent;
1055 ULONG IdleLast;
1056 ULONG IdleIdeal;
1057 ULONG PreemptAny;
1058 ULONG PreemptCurrent;
1059 ULONG PreemptLast;
1060 ULONG SwitchToIdle;
1061 } SYSTEM_CONTEXT_SWITCH_INFORMATION, *PSYSTEM_CONTEXT_SWITCH_INFORMATION;
1062
1063 // Class 37
1064 typedef struct _SYSTEM_REGISTRY_QUOTA_INFORMATION
1065 {
1066 ULONG RegistryQuotaAllowed;
1067 ULONG RegistryQuotaUsed;
1068 ULONG PagedPoolSize;
1069 } SYSTEM_REGISTRY_QUOTA_INFORMATION, *PSYSTEM_REGISTRY_QUOTA_INFORMATION;
1070
1071 // Class 38
1072 // Not a structure, simply send the UNICODE_STRING
1073
1074 // Class 39
1075 // Not a structure, simply send a ULONG containing the new separation
1076
1077 // Class 40
1078 typedef struct _SYSTEM_PLUGPLAY_BUS_INFORMATION
1079 {
1080 ULONG BusCount;
1081 PLUGPLAY_BUS_INSTANCE BusInstance[1];
1082 } SYSTEM_PLUGPLAY_BUS_INFORMATION, *PSYSTEM_PLUGPLAY_BUS_INFORMATION;
1083
1084 // Class 41
1085 typedef struct _SYSTEM_DOCK_INFORMATION
1086 {
1087 SYSTEM_DOCK_STATE DockState;
1088 INTERFACE_TYPE DeviceBusType;
1089 ULONG DeviceBusNumber;
1090 ULONG SlotNumber;
1091 } SYSTEM_DOCK_INFORMATION, *PSYSTEM_DOCK_INFORMATION;
1092
1093 // Class 42
1094 typedef struct _SYSTEM_POWER_INFORMATION_NATIVE
1095 {
1096 BOOLEAN SystemSuspendSupported;
1097 BOOLEAN SystemHibernateSupported;
1098 BOOLEAN ResumeTimerSupportsSuspend;
1099 BOOLEAN ResumeTimerSupportsHibernate;
1100 BOOLEAN LidSupported;
1101 BOOLEAN TurboSettingSupported;
1102 BOOLEAN TurboMode;
1103 BOOLEAN SystemAcOrDc;
1104 BOOLEAN PowerDownDisabled;
1105 LARGE_INTEGER SpindownDrives;
1106 } SYSTEM_POWER_INFORMATION_NATIVE, *PSYSTEM_POWER_INFORMATION_NATIVE;
1107
1108 // Class 43
1109 typedef struct _SYSTEM_LEGACY_DRIVER_INFORMATION
1110 {
1111 PNP_VETO_TYPE VetoType;
1112 UNICODE_STRING VetoDriver;
1113 // CHAR Buffer[0];
1114 } SYSTEM_LEGACY_DRIVER_INFORMATION, *PSYSTEM_LEGACY_DRIVER_INFORMATION;
1115
1116 // Class 44
1117 typedef struct _TIME_ZONE_INFORMATION RTL_TIME_ZONE_INFORMATION;
1118
1119 // Class 45
1120 typedef struct _SYSTEM_LOOKASIDE_INFORMATION
1121 {
1122 USHORT CurrentDepth;
1123 USHORT MaximumDepth;
1124 ULONG TotalAllocates;
1125 ULONG AllocateMisses;
1126 ULONG TotalFrees;
1127 ULONG FreeMisses;
1128 ULONG Type;
1129 ULONG Tag;
1130 ULONG Size;
1131 } SYSTEM_LOOKASIDE_INFORMATION, *PSYSTEM_LOOKASIDE_INFORMATION;
1132
1133 // Class 46
1134 // Not a structure. Only a HANDLE for the SlipEvent;
1135
1136 // Class 47
1137 // Not a structure. Only a ULONG for the SessionId;
1138
1139 // Class 48
1140 // Not a structure. Only a ULONG for the SessionId;
1141
1142 // FIXME: Class 49
1143
1144 // Class 50
1145 // Not a structure. Only a ULONG_PTR for the SystemRangeStart
1146
1147 // FIXME: Class 51 (Based on MM_DRIVER_VERIFIER_DATA)
1148
1149 // FIXME: Class 52
1150
1151 // Class 53
1152 typedef struct _SYSTEM_SESSION_PROCESSES_INFORMATION
1153 {
1154 ULONG SessionId;
1155 ULONG BufferSize;
1156 PVOID Buffer; // Same format as in SystemProcessInformation
1157 } SYSTEM_SESSION_PROCESSES_INFORMATION, *PSYSTEM_SESSION_PROCESSES_INFORMATION;
1158
1159 #endif