:pserver:cvsanon@mok.lvcm.com:/CVS/ReactOS reactos
[reactos.git] / include / ddk / extypes.h
1 /* $Id$ */
2
3 #ifndef __INCLUDE_DDK_EXTYPES_H
4 #define __INCLUDE_DDK_EXTYPES_H
5
6 #ifdef __NTOSKRNL__
7 extern POBJECT_TYPE EXPORTED ExDesktopObjectType;
8 extern POBJECT_TYPE EXPORTED ExEventObjectType;
9 extern POBJECT_TYPE EXPORTED ExWindowStationObjectType;
10 #else
11 extern POBJECT_TYPE IMPORTED ExDesktopObjectType;
12 extern POBJECT_TYPE IMPORTED ExEventObjectType;
13 extern POBJECT_TYPE IMPORTED ExWindowStationObjectType;
14 #endif
15
16 typedef ULONG INTERLOCKED_RESULT;
17 typedef ULONG WORK_QUEUE_TYPE;
18
19 typedef ULONG ERESOURCE_THREAD, *PERESOURCE_THREAD;
20
21 typedef struct _OWNER_ENTRY
22 {
23    ERESOURCE_THREAD OwnerThread;
24    union
25      {
26         LONG OwnerCount;
27         ULONG TableSize;
28      } a;
29 } OWNER_ENTRY, *POWNER_ENTRY;
30
31 typedef struct _ERESOURCE
32 {
33    LIST_ENTRY SystemResourcesList;
34    POWNER_ENTRY OwnerTable;
35    SHORT ActiveCount;
36    USHORT Flag;
37    PKSEMAPHORE SharedWaiters;
38    PKEVENT ExclusiveWaiters;
39    OWNER_ENTRY OwnerThreads[2];
40    ULONG ContentionCount;
41    USHORT NumberOfSharedWaiters;
42    USHORT NumberOfExclusiveWaiters;
43    union
44      {
45         PVOID Address;
46         ULONG CreatorBackTraceIndex;
47      } a;
48    KSPIN_LOCK SpinLock;
49 } ERESOURCE, *PERESOURCE;
50
51
52 typedef struct 
53 {
54    LONG Count;
55    struct _KTHREAD* Owner;
56    ULONG Contention;
57    KEVENT Event;
58    ULONG OldIrql;
59 } FAST_MUTEX, *PFAST_MUTEX;
60
61 typedef struct _ZONE_HEADER
62 {
63    SINGLE_LIST_ENTRY FreeList;
64    SINGLE_LIST_ENTRY SegmentList;
65    ULONG BlockSize;
66    ULONG TotalSegmentSize;
67 } ZONE_HEADER, *PZONE_HEADER;
68
69 typedef struct _ZONE_SEGMENT
70 {
71    SINGLE_LIST_ENTRY Entry;
72    ULONG size;
73 } ZONE_SEGMENT, *PZONE_SEGMENT;
74
75 typedef struct _ZONE_ENTRY
76 {
77    SINGLE_LIST_ENTRY Entry;
78 } ZONE_ENTRY, *PZONE_ENTRY;
79
80
81 typedef VOID STDCALL
82 (*PWORKER_THREAD_ROUTINE)(PVOID Parameter);
83
84 typedef struct _WORK_QUEUE_ITEM
85 {
86    LIST_ENTRY Entry;
87    PWORKER_THREAD_ROUTINE Routine;
88    PVOID Context;
89 } WORK_QUEUE_ITEM, *PWORK_QUEUE_ITEM;
90
91 typedef PVOID STDCALL
92 (*PALLOCATE_FUNCTION)(POOL_TYPE PoolType,
93                       ULONG NumberOfBytes,
94                       ULONG Tag);
95
96 typedef VOID STDCALL
97 (*PFREE_FUNCTION)(PVOID Buffer);
98
99 typedef union _SLIST_HEADER
100 {
101    ULONGLONG Alignment;
102    struct
103      {
104         SINGLE_LIST_ENTRY Next;
105         USHORT Depth;
106         USHORT Sequence;        
107      } s;
108 } SLIST_HEADER, *PSLIST_HEADER;
109
110 typedef struct _NPAGED_LOOKASIDE_LIST
111 {
112    SLIST_HEADER ListHead;
113    USHORT MinimumDepth;
114    USHORT MaximumDepth;
115    ULONG TotalAllocates;
116    ULONG AllocateMisses;
117    ULONG TotalFrees;
118    ULONG FreeMisses;
119    POOL_TYPE Type;
120    ULONG Tag;
121    ULONG Size;
122    PALLOCATE_FUNCTION Allocate;
123    PFREE_FUNCTION Free;
124    LIST_ENTRY ListEntry;
125    ULONG LastTotalAllocates;
126    ULONG LastAllocateMisses;
127    ULONG Pad[2];
128    KSPIN_LOCK Lock;
129 } NPAGED_LOOKASIDE_LIST, *PNPAGED_LOOKASIDE_LIST;
130
131 typedef struct _PAGED_LOOKASIDE_LIST
132 {
133    SLIST_HEADER ListHead;
134    USHORT MinimumDepth;
135    USHORT MaximumDepth;
136    ULONG TotalAllocates;
137    ULONG AllocateMisses;
138    ULONG TotalFrees;
139    ULONG FreeMisses;
140    POOL_TYPE Type;
141    ULONG Tag;
142    ULONG Size;
143    PALLOCATE_FUNCTION Allocate;
144    PFREE_FUNCTION Free;
145    LIST_ENTRY ListEntry;
146    ULONG LastTotalAllocates;
147    ULONG LastAllocateMisses;
148    FAST_MUTEX Lock;
149 } PAGED_LOOKASIDE_LIST, *PPAGED_LOOKASIDE_LIST;
150
151
152 /* callback object (not functional in NT4)*/
153
154 typedef struct _CALLBACK_OBJECT *PCALLBACK_OBJECT;
155
156 typedef VOID STDCALL
157 (*PCALLBACK_FUNCTION)(PVOID CallbackContext,
158                       PVOID Argument1,
159                       PVOID Argument2);
160
161 /* BEGIN REACTOS ONLY */
162
163 typedef enum _TRAVERSE_METHOD {
164   TraverseMethodPreorder,
165   TraverseMethodInorder,
166   TraverseMethodPostorder
167 } TRAVERSE_METHOD;
168
169 typedef LONG STDCALL
170 (*PKEY_COMPARATOR)(IN PVOID  Key1,
171   IN PVOID  Key2);
172
173 typedef BOOLEAN STDCALL
174 (*PTRAVERSE_ROUTINE)(IN PVOID  Context,
175   IN PVOID  Key,
176   IN PVOID  Value);
177
178 struct _BINARY_TREE_NODE;
179
180 typedef struct _BINARY_TREE
181 {
182   struct _BINARY_TREE_NODE  * RootNode;
183   PKEY_COMPARATOR  Compare;
184   BOOLEAN  UseNonPagedPool;
185   union {
186     NPAGED_LOOKASIDE_LIST  NonPaged;
187     PAGED_LOOKASIDE_LIST  Paged;
188   } List;
189   union {
190     KSPIN_LOCK  NonPaged;
191     FAST_MUTEX  Paged;
192   } Lock;
193 } BINARY_TREE, *PBINARY_TREE;
194
195
196 struct _SPLAY_TREE_NODE;
197
198 typedef struct _SPLAY_TREE
199 {
200   struct _SPLAY_TREE_NODE  * RootNode;
201   PKEY_COMPARATOR  Compare;
202   BOOLEAN  Weighted;
203   BOOLEAN  UseNonPagedPool;
204   union {
205     NPAGED_LOOKASIDE_LIST  NonPaged;
206     PAGED_LOOKASIDE_LIST  Paged;
207   } List;
208   union {
209     KSPIN_LOCK  NonPaged;
210     FAST_MUTEX  Paged;
211   } Lock;
212   PVOID  Reserved[4];
213 } SPLAY_TREE, *PSPLAY_TREE;
214
215
216 typedef struct _HASH_TABLE
217 {
218   // Size of hash table in number of bits
219   ULONG  HashTableSize;
220
221   // Use non-paged pool memory?
222   BOOLEAN  UseNonPagedPool;
223
224   // Lock for this structure
225   union {
226     KSPIN_LOCK  NonPaged;
227     FAST_MUTEX  Paged;
228   } Lock;
229
230   // Pointer to array of hash buckets with splay trees
231   PSPLAY_TREE  HashTrees;
232 } HASH_TABLE, *PHASH_TABLE;
233
234 /* END REACTOS ONLY */
235
236 #endif /* __INCLUDE_DDK_EXTYPES_H */
237
238 /* EOF */