510ad44bb29e1367e2247a571eb6405783fb0900
[reactos.git] / include / ddk / ketypes.h
1 /* KERNEL TYPES **************************************************************/
2
3 #ifndef __INCLUDE_DDK_KETYPES_H
4 #define __INCLUDE_DDK_KETYPES_H
5
6 #define MB_FLAGS_MEM_INFO         (0x1)
7 #define MB_FLAGS_BOOT_DEVICE      (0x2)
8 #define MB_FLAGS_COMMAND_LINE     (0x4)
9 #define MB_FLAGS_MODULE_INFO      (0x8)
10 #define MB_FLAGS_AOUT_SYMS        (0x10)
11 #define MB_FLAGS_ELF_SYMS         (0x20)
12 #define MB_FLAGS_MMAP_INFO        (0x40)
13 #define MB_FLAGS_DRIVES_INFO      (0x80)
14 #define MB_FLAGS_CONFIG_TABLE     (0x100)
15 #define MB_FLAGS_BOOT_LOADER_NAME (0x200)
16 #define MB_FLAGS_APM_TABLE        (0x400)
17 #define MB_FLAGS_GRAPHICS_TABLE   (0x800)
18
19 typedef struct _LOADER_MODULE
20 {
21    ULONG ModStart;
22    ULONG ModEnd;
23    ULONG String;
24    ULONG Reserved;
25 } LOADER_MODULE, *PLOADER_MODULE;
26
27 typedef struct _ADDRESS_RANGE
28 {
29    ULONG BaseAddrLow;
30    ULONG BaseAddrHigh;
31    ULONG LengthLow;
32    ULONG LengthHigh;
33    ULONG Type;
34 } ADDRESS_RANGE, *PADDRESS_RANGE;
35
36 typedef struct _LOADER_PARAMETER_BLOCK
37 {
38    ULONG Flags;
39    ULONG MemLower;
40    ULONG MemHigher;
41    ULONG BootDevice;
42    ULONG CommandLine;
43    ULONG ModsCount;
44    ULONG ModsAddr;
45    UCHAR Syms[12];
46    ULONG MmapLength;
47    ULONG MmapAddr;
48    ULONG DrivesCount;
49    ULONG DrivesAddr;
50    ULONG ConfigTable;
51    ULONG BootLoaderName;
52 } LOADER_PARAMETER_BLOCK, *PLOADER_PARAMETER_BLOCK;
53
54 #ifdef __NTOSKRNL__
55 extern CHAR EXPORTED KeNumberProcessors;
56 extern LOADER_PARAMETER_BLOCK EXPORTED KeLoaderBlock;
57 extern ULONG EXPORTED KeDcacheFlushCount;
58 extern ULONG EXPORTED KeIcacheFlushCount;
59 #else
60 extern CHAR IMPORTED KeNumberProcessors;
61 extern LOADER_PARAMETER_BLOCK IMPORTED KeLoaderBlock;
62 extern ULONG EXPORTED KeDcacheFlushCount;
63 extern ULONG EXPORTED KeIcacheFlushCount;
64 #endif
65
66
67
68 struct _KMUTANT;
69
70 typedef LONG KPRIORITY;
71
72 typedef VOID STDCALL
73 (*PKBUGCHECK_CALLBACK_ROUTINE)(PVOID Buffer,
74                                ULONG Length);
75
76 typedef BOOLEAN STDCALL
77 (*PKSYNCHRONIZE_ROUTINE)(PVOID SynchronizeContext);
78
79 struct _KAPC;
80
81 typedef VOID STDCALL
82 (*PKNORMAL_ROUTINE)(PVOID NormalContext,
83                     PVOID SystemArgument1,
84                     PVOID SystemArgument2);
85
86 typedef VOID STDCALL
87 (*PKKERNEL_ROUTINE)(struct _KAPC* Apc,
88                     PKNORMAL_ROUTINE* NormalRoutine,
89                     PVOID* NormalContext,
90                     PVOID* SystemArgument1,
91                     PVOID* SystemArgument2);
92
93 typedef VOID STDCALL
94 (*PKRUNDOWN_ROUTINE)(struct _KAPC* Apc);
95
96 struct _DISPATCHER_HEADER;
97
98 typedef struct _KWAIT_BLOCK
99 /*
100  * PURPOSE: Object describing the wait a thread is currently performing
101  */
102 {
103    LIST_ENTRY WaitListEntry;
104    struct _KTHREAD* Thread;
105    struct _DISPATCHER_HEADER *Object;
106    struct _KWAIT_BLOCK* NextWaitBlock;
107    USHORT WaitKey;
108    USHORT WaitType;
109 } KWAIT_BLOCK, *PKWAIT_BLOCK;
110
111 typedef struct _DISPATCHER_HEADER
112 {
113    UCHAR      Type;
114    UCHAR      Absolute;
115    UCHAR      Size;
116    UCHAR      Inserted;
117    LONG       SignalState;
118    LIST_ENTRY WaitListHead;
119 } __attribute__((packed)) DISPATCHER_HEADER, *PDISPATCHER_HEADER;
120
121
122 typedef struct _KQUEUE
123 {
124    DISPATCHER_HEADER Header;
125    LIST_ENTRY        EntryListHead;
126    ULONG             CurrentCount;
127    ULONG             MaximumCount;
128    LIST_ENTRY        ThreadListEntry;
129 } KQUEUE, *PKQUEUE;
130
131 struct _KDPC;
132
133 typedef struct _KTIMER
134  {
135     DISPATCHER_HEADER Header;
136     ULARGE_INTEGER DueTime;
137     LIST_ENTRY TimerListEntry;
138     struct _KDPC* Dpc;
139     LONG Period;
140 } KTIMER, *PKTIMER;
141
142 struct _KSPIN_LOCK;
143
144 typedef struct _KSPIN_LOCK
145 {
146    ULONG Lock;
147 } KSPIN_LOCK, *PKSPIN_LOCK;
148
149 typedef struct _KDEVICE_QUEUE
150 {
151    CSHORT Type;
152    CSHORT Size;
153    LIST_ENTRY ListHead;
154    KSPIN_LOCK Lock;
155    BOOLEAN Busy;
156 } KDEVICE_QUEUE, *PKDEVICE_QUEUE;
157
158
159 typedef struct _KAPC
160 {
161    CSHORT Type;
162    CSHORT Size;
163    ULONG Spare0;
164    struct _KTHREAD* Thread;
165    LIST_ENTRY ApcListEntry;
166    PKKERNEL_ROUTINE KernelRoutine;
167    PKRUNDOWN_ROUTINE RundownRoutine;
168    PKNORMAL_ROUTINE NormalRoutine;
169    PVOID NormalContext;
170    PVOID SystemArgument1;
171    PVOID SystemArgument2;
172    CCHAR ApcStateIndex;
173    KPROCESSOR_MODE ApcMode;
174    USHORT Inserted;
175 } __attribute__((packed)) KAPC, *PKAPC;
176
177 typedef struct _KBUGCHECK_CALLBACK_RECORD
178 {
179    LIST_ENTRY Entry;
180    PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine;
181    PVOID Buffer;
182    ULONG Length;
183    PUCHAR Component;
184    ULONG Checksum;
185    UCHAR State;
186 } KBUGCHECK_CALLBACK_RECORD, *PKBUGCHECK_CALLBACK_RECORD;
187
188 typedef struct _KMUTEX
189 {
190    DISPATCHER_HEADER Header;
191    LIST_ENTRY MutantListEntry;
192    struct _KTHREAD* OwnerThread;
193    BOOLEAN Abandoned;
194    UCHAR ApcDisable;
195 } KMUTEX, *PKMUTEX, KMUTANT, *PKMUTANT;
196
197 typedef struct _KSEMAPHORE
198 {
199    DISPATCHER_HEADER Header;
200    LONG Limit;
201 } __attribute__((packed)) KSEMAPHORE, *PKSEMAPHORE;
202
203 typedef struct _KEVENT
204 {
205    DISPATCHER_HEADER Header;
206 } KEVENT, *PKEVENT;
207
208 typedef struct _KEVENT_PAIR
209 {
210    CSHORT Type;
211    CSHORT Size;
212    KEVENT LowEvent;
213    KEVENT HighEvent;
214 } KEVENT_PAIR, *PKEVENT_PAIR;
215
216
217 struct _KDPC;
218
219 /*
220  * PURPOSE: Defines a delayed procedure call routine
221  * NOTE:
222  *      Dpc = The associated DPC object
223  *      DeferredContext = Driver defined context for the DPC
224  *      SystemArgument[1-2] = Undocumented. 
225  * 
226  */
227 typedef VOID STDCALL
228 (*PKDEFERRED_ROUTINE)(struct _KDPC* Dpc,
229                       PVOID DeferredContext,
230                       PVOID SystemArgument1,
231                       PVOID SystemArgument2);
232
233 /*
234  * PURPOSE: Defines a delayed procedure call object
235  */
236 typedef struct _KDPC
237 {
238    SHORT Type;
239    UCHAR Number;
240    UCHAR Importance;
241    LIST_ENTRY DpcListEntry;
242    PKDEFERRED_ROUTINE DeferredRoutine;
243    PVOID DeferredContext;
244    PVOID SystemArgument1;
245    PVOID SystemArgument2;
246    PULONG Lock;
247 } __attribute__((packed)) KDPC, *PKDPC;
248
249
250
251 typedef struct _KDEVICE_QUEUE_ENTRY
252 {
253    LIST_ENTRY Entry;
254    ULONG Key;
255    BOOLEAN Inserted;
256 } KDEVICE_QUEUE_ENTRY, *PKDEVICE_QUEUE_ENTRY;
257
258 typedef struct _WAIT_CONTEXT_BLOCK
259 {
260    KDEVICE_QUEUE_ENTRY WaitQueueEntry;
261    void * /* in real 'PDRIVER_CONTROL' */ DeviceRoutine;
262    PVOID DeviceContext;
263    ULONG NumberOfMapRegisters;
264    PVOID DeviceObject;
265    PVOID CurrentIrp;
266    PKDPC BufferChainingDpc;
267 } WAIT_CONTEXT_BLOCK, *PWAIT_CONTEXT_BLOCK;
268
269 struct _KINTERRUPT;
270
271 typedef BOOLEAN STDCALL
272 (*PKSERVICE_ROUTINE)(struct _KINTERRUPT* Interrupt,
273                      PVOID ServiceContext);
274
275 typedef struct _KINTERRUPT
276 {
277    ULONG Vector;
278    KAFFINITY ProcessorEnableMask;
279    PKSPIN_LOCK IrqLock;
280    BOOLEAN Shareable;
281    BOOLEAN FloatingSave;
282    PKSERVICE_ROUTINE ServiceRoutine;
283    PVOID ServiceContext;
284    LIST_ENTRY Entry;
285    KIRQL SynchLevel;
286 } KINTERRUPT, *PKINTERRUPT;
287
288 typedef struct _KSYSTEM_TIME
289 {
290    ULONG LowPart;
291    LONG High1Part;
292    LONG High2Part;
293 } KSYSTEM_TIME, *PKSYSTEM_TIME;
294
295 typedef struct _EPROCESS EPROCESS, *PEPROCESS;
296
297 #endif /* __INCLUDE_DDK_KETYPES_H */