[XDK]
[reactos.git] / include / xdk / extypes.h
1 /******************************************************************************
2 * Executive Types *
3 ******************************************************************************/
4 $if (_WDMDDK_)
5
6 #define EX_RUNDOWN_ACTIVE 0x1
7 #define EX_RUNDOWN_COUNT_SHIFT 0x1
8 #define EX_RUNDOWN_COUNT_INC (1 << EX_RUNDOWN_COUNT_SHIFT)
9
10 typedef struct _FAST_MUTEX {
11 volatile LONG Count;
12 PKTHREAD Owner;
13 ULONG Contention;
14 KEVENT Event;
15 ULONG OldIrql;
16 } FAST_MUTEX, *PFAST_MUTEX;
17
18 typedef enum _SUITE_TYPE {
19 SmallBusiness,
20 Enterprise,
21 BackOffice,
22 CommunicationServer,
23 TerminalServer,
24 SmallBusinessRestricted,
25 EmbeddedNT,
26 DataCenter,
27 SingleUserTS,
28 Personal,
29 Blade,
30 EmbeddedRestricted,
31 SecurityAppliance,
32 StorageServer,
33 ComputeServer,
34 WHServer,
35 MaxSuiteType
36 } SUITE_TYPE;
37
38 typedef enum _EX_POOL_PRIORITY {
39 LowPoolPriority,
40 LowPoolPrioritySpecialPoolOverrun = 8,
41 LowPoolPrioritySpecialPoolUnderrun = 9,
42 NormalPoolPriority = 16,
43 NormalPoolPrioritySpecialPoolOverrun = 24,
44 NormalPoolPrioritySpecialPoolUnderrun = 25,
45 HighPoolPriority = 32,
46 HighPoolPrioritySpecialPoolOverrun = 40,
47 HighPoolPrioritySpecialPoolUnderrun = 41
48 } EX_POOL_PRIORITY;
49
50 #if !defined(_WIN64) && (defined(_NTDDK_) || defined(_NTIFS_) || defined(_NDIS_))
51 #define LOOKASIDE_ALIGN
52 #else
53 #define LOOKASIDE_ALIGN /* FIXME: DECLSPEC_CACHEALIGN */
54 #endif
55
56 typedef struct _LOOKASIDE_LIST_EX *PLOOKASIDE_LIST_EX;
57
58 typedef PVOID
59 (NTAPI *PALLOCATE_FUNCTION)(
60 IN POOL_TYPE PoolType,
61 IN SIZE_T NumberOfBytes,
62 IN ULONG Tag);
63
64 typedef PVOID
65 (NTAPI *PALLOCATE_FUNCTION_EX)(
66 IN POOL_TYPE PoolType,
67 IN SIZE_T NumberOfBytes,
68 IN ULONG Tag,
69 IN OUT PLOOKASIDE_LIST_EX Lookaside);
70
71 typedef VOID
72 (NTAPI *PFREE_FUNCTION)(
73 IN PVOID Buffer);
74
75 typedef VOID
76 (NTAPI *PFREE_FUNCTION_EX)(
77 IN PVOID Buffer,
78 IN OUT PLOOKASIDE_LIST_EX Lookaside);
79
80 typedef VOID
81 (NTAPI CALLBACK_FUNCTION)(
82 IN PVOID CallbackContext OPTIONAL,
83 IN PVOID Argument1 OPTIONAL,
84 IN PVOID Argument2 OPTIONAL);
85 typedef CALLBACK_FUNCTION *PCALLBACK_FUNCTION;
86
87 #define GENERAL_LOOKASIDE_LAYOUT \
88 union { \
89 SLIST_HEADER ListHead; \
90 SINGLE_LIST_ENTRY SingleListHead; \
91 } DUMMYUNIONNAME; \
92 USHORT Depth; \
93 USHORT MaximumDepth; \
94 ULONG TotalAllocates; \
95 union { \
96 ULONG AllocateMisses; \
97 ULONG AllocateHits; \
98 } DUMMYUNIONNAME2; \
99 \
100 ULONG TotalFrees; \
101 union { \
102 ULONG FreeMisses; \
103 ULONG FreeHits; \
104 } DUMMYUNIONNAME3; \
105 \
106 POOL_TYPE Type; \
107 ULONG Tag; \
108 ULONG Size; \
109 union { \
110 PALLOCATE_FUNCTION_EX AllocateEx; \
111 PALLOCATE_FUNCTION Allocate; \
112 } DUMMYUNIONNAME4; \
113 \
114 union { \
115 PFREE_FUNCTION_EX FreeEx; \
116 PFREE_FUNCTION Free; \
117 } DUMMYUNIONNAME5; \
118 \
119 LIST_ENTRY ListEntry; \
120 ULONG LastTotalAllocates; \
121 union { \
122 ULONG LastAllocateMisses; \
123 ULONG LastAllocateHits; \
124 } DUMMYUNIONNAME6; \
125 ULONG Future[2];
126
127 typedef struct LOOKASIDE_ALIGN _GENERAL_LOOKASIDE {
128 GENERAL_LOOKASIDE_LAYOUT
129 } GENERAL_LOOKASIDE, *PGENERAL_LOOKASIDE;
130
131 typedef struct _GENERAL_LOOKASIDE_POOL {
132 GENERAL_LOOKASIDE_LAYOUT
133 } GENERAL_LOOKASIDE_POOL, *PGENERAL_LOOKASIDE_POOL;
134
135 #define LOOKASIDE_CHECK(f) \
136 C_ASSERT(FIELD_OFFSET(GENERAL_LOOKASIDE,f) == FIELD_OFFSET(GENERAL_LOOKASIDE_POOL,f))
137
138 LOOKASIDE_CHECK(TotalFrees);
139 LOOKASIDE_CHECK(Tag);
140 LOOKASIDE_CHECK(Future);
141
142 typedef struct _PAGED_LOOKASIDE_LIST {
143 GENERAL_LOOKASIDE L;
144 #if !defined(_AMD64_) && !defined(_IA64_)
145 FAST_MUTEX Lock__ObsoleteButDoNotDelete;
146 #endif
147 } PAGED_LOOKASIDE_LIST, *PPAGED_LOOKASIDE_LIST;
148
149 typedef struct LOOKASIDE_ALIGN _NPAGED_LOOKASIDE_LIST {
150 GENERAL_LOOKASIDE L;
151 #if !defined(_AMD64_) && !defined(_IA64_)
152 KSPIN_LOCK Lock__ObsoleteButDoNotDelete;
153 #endif
154 } NPAGED_LOOKASIDE_LIST, *PNPAGED_LOOKASIDE_LIST;
155
156 #define LOOKASIDE_MINIMUM_BLOCK_SIZE (RTL_SIZEOF_THROUGH_FIELD (SLIST_ENTRY, Next))
157
158 typedef struct _LOOKASIDE_LIST_EX {
159 GENERAL_LOOKASIDE_POOL L;
160 } LOOKASIDE_LIST_EX;
161
162 #if (NTDDI_VERSION >= NTDDI_VISTA)
163
164 #define EX_LOOKASIDE_LIST_EX_FLAGS_RAISE_ON_FAIL 0x00000001UL
165 #define EX_LOOKASIDE_LIST_EX_FLAGS_FAIL_NO_RAISE 0x00000002UL
166
167 #define EX_MAXIMUM_LOOKASIDE_DEPTH_BASE 256
168 #define EX_MAXIMUM_LOOKASIDE_DEPTH_LIMIT 1024
169
170 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
171
172 typedef struct _EX_RUNDOWN_REF {
173 __GNU_EXTENSION union {
174 volatile ULONG_PTR Count;
175 volatile PVOID Ptr;
176 };
177 } EX_RUNDOWN_REF, *PEX_RUNDOWN_REF;
178
179 typedef struct _EX_RUNDOWN_REF_CACHE_AWARE *PEX_RUNDOWN_REF_CACHE_AWARE;
180
181 typedef enum _WORK_QUEUE_TYPE {
182 CriticalWorkQueue,
183 DelayedWorkQueue,
184 HyperCriticalWorkQueue,
185 MaximumWorkQueue
186 } WORK_QUEUE_TYPE;
187
188 typedef VOID
189 (NTAPI WORKER_THREAD_ROUTINE)(
190 IN PVOID Parameter);
191 typedef WORKER_THREAD_ROUTINE *PWORKER_THREAD_ROUTINE;
192
193 typedef struct _WORK_QUEUE_ITEM {
194 LIST_ENTRY List;
195 PWORKER_THREAD_ROUTINE WorkerRoutine;
196 volatile PVOID Parameter;
197 } WORK_QUEUE_ITEM, *PWORK_QUEUE_ITEM;
198
199 typedef ULONG_PTR ERESOURCE_THREAD, *PERESOURCE_THREAD;
200
201 typedef struct _OWNER_ENTRY {
202 ERESOURCE_THREAD OwnerThread;
203 union {
204 struct {
205 ULONG IoPriorityBoosted:1;
206 ULONG OwnerReferenced:1;
207 ULONG OwnerCount:30;
208 };
209 ULONG TableSize;
210 };
211 } OWNER_ENTRY, *POWNER_ENTRY;
212
213 typedef struct _ERESOURCE {
214 LIST_ENTRY SystemResourcesList;
215 POWNER_ENTRY OwnerTable;
216 SHORT ActiveCount;
217 USHORT Flag;
218 volatile PKSEMAPHORE SharedWaiters;
219 volatile PKEVENT ExclusiveWaiters;
220 OWNER_ENTRY OwnerEntry;
221 ULONG ActiveEntries;
222 ULONG ContentionCount;
223 ULONG NumberOfSharedWaiters;
224 ULONG NumberOfExclusiveWaiters;
225 #if defined(_WIN64)
226 PVOID Reserved2;
227 #endif
228 __GNU_EXTENSION union {
229 PVOID Address;
230 ULONG_PTR CreatorBackTraceIndex;
231 };
232 KSPIN_LOCK SpinLock;
233 } ERESOURCE, *PERESOURCE;
234
235 /* ERESOURCE.Flag */
236 #define ResourceNeverExclusive 0x0010
237 #define ResourceReleaseByOtherThread 0x0020
238 #define ResourceOwnedExclusive 0x0080
239
240 #define RESOURCE_HASH_TABLE_SIZE 64
241
242 typedef struct _RESOURCE_HASH_ENTRY {
243 LIST_ENTRY ListEntry;
244 PVOID Address;
245 ULONG ContentionCount;
246 ULONG Number;
247 } RESOURCE_HASH_ENTRY, *PRESOURCE_HASH_ENTRY;
248
249 typedef struct _RESOURCE_PERFORMANCE_DATA {
250 ULONG ActiveResourceCount;
251 ULONG TotalResourceCount;
252 ULONG ExclusiveAcquire;
253 ULONG SharedFirstLevel;
254 ULONG SharedSecondLevel;
255 ULONG StarveFirstLevel;
256 ULONG StarveSecondLevel;
257 ULONG WaitForExclusive;
258 ULONG OwnerTableExpands;
259 ULONG MaximumTableExpand;
260 LIST_ENTRY HashTable[RESOURCE_HASH_TABLE_SIZE];
261 } RESOURCE_PERFORMANCE_DATA, *PRESOURCE_PERFORMANCE_DATA;
262
263 /* Global debug flag */
264 #if DEVL
265 extern ULONG NtGlobalFlag;
266 #define IF_NTOS_DEBUG(FlagName) if (NtGlobalFlag & (FLG_##FlagName))
267 #else
268 #define IF_NTOS_DEBUG(FlagName) if(FALSE)
269 #endif
270
271 $endif /* _WDMDDK_ */
272 $if (_NTDDK_)
273
274 typedef struct _ZONE_SEGMENT_HEADER {
275 SINGLE_LIST_ENTRY SegmentList;
276 PVOID Reserved;
277 } ZONE_SEGMENT_HEADER, *PZONE_SEGMENT_HEADER;
278
279 typedef struct _ZONE_HEADER {
280 SINGLE_LIST_ENTRY FreeList;
281 SINGLE_LIST_ENTRY SegmentList;
282 ULONG BlockSize;
283 ULONG TotalSegmentSize;
284 } ZONE_HEADER, *PZONE_HEADER;
285
286 #define PROTECTED_POOL 0x80000000
287
288 $endif /* _NTDDK_ */
289