PWORK_QUEUE_ITEM->Routine must be always 'stdcall' as it is a callback
[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
82 #ifndef LIBCAPTIVE
83                 STDCALL_FUNC
84 #else /* !LIBCAPTIVE */
85                 CAPTIVE_STDCALL
86 #endif /* !LIBCAPTIVE */
87 (*PWORKER_THREAD_ROUTINE)(PVOID Parameter);
88
89 typedef struct _WORK_QUEUE_ITEM
90 {
91    LIST_ENTRY Entry;
92    PWORKER_THREAD_ROUTINE Routine;
93    PVOID Context;
94 } WORK_QUEUE_ITEM, *PWORK_QUEUE_ITEM;
95
96 typedef PVOID STDCALL_FUNC
97 (*PALLOCATE_FUNCTION)(POOL_TYPE PoolType,
98                       ULONG NumberOfBytes,
99                       ULONG Tag);
100
101 typedef VOID STDCALL_FUNC
102 (*PFREE_FUNCTION)(PVOID Buffer);
103
104 typedef union _SLIST_HEADER
105 {
106    ULONGLONG Alignment;
107    struct
108      {
109         SINGLE_LIST_ENTRY Next;
110         USHORT Depth;
111         USHORT Sequence;        
112      } s;
113 } SLIST_HEADER, *PSLIST_HEADER;
114
115 typedef struct _NPAGED_LOOKASIDE_LIST
116 {
117    SLIST_HEADER ListHead;
118    USHORT MinimumDepth;
119    USHORT MaximumDepth;
120    ULONG TotalAllocates;
121    ULONG AllocateMisses;
122    ULONG TotalFrees;
123    ULONG FreeMisses;
124    POOL_TYPE Type;
125    ULONG Tag;
126    ULONG Size;
127    PALLOCATE_FUNCTION Allocate;
128    PFREE_FUNCTION Free;
129    LIST_ENTRY ListEntry;
130    ULONG LastTotalAllocates;
131    ULONG LastAllocateMisses;
132    ULONG Pad[2];
133    KSPIN_LOCK Lock;
134 } NPAGED_LOOKASIDE_LIST, *PNPAGED_LOOKASIDE_LIST;
135
136 typedef struct _PAGED_LOOKASIDE_LIST
137 {
138    SLIST_HEADER ListHead;
139    USHORT MinimumDepth;
140    USHORT MaximumDepth;
141    ULONG TotalAllocates;
142    ULONG AllocateMisses;
143    ULONG TotalFrees;
144    ULONG FreeMisses;
145    POOL_TYPE Type;
146    ULONG Tag;
147    ULONG Size;
148    PALLOCATE_FUNCTION Allocate;
149    PFREE_FUNCTION Free;
150    LIST_ENTRY ListEntry;
151    ULONG LastTotalAllocates;
152    ULONG LastAllocateMisses;
153    FAST_MUTEX Lock;
154 } PAGED_LOOKASIDE_LIST, *PPAGED_LOOKASIDE_LIST;
155
156
157 /* callback object (not functional in NT4)*/
158
159 typedef struct _CALLBACK_OBJECT *PCALLBACK_OBJECT;
160
161 typedef VOID STDCALL_FUNC
162 (*PCALLBACK_FUNCTION)(PVOID CallbackContext,
163                       PVOID Argument1,
164                       PVOID Argument2);
165
166 /* BEGIN REACTOS ONLY */
167
168 typedef enum _TRAVERSE_METHOD {
169   TraverseMethodPreorder,
170   TraverseMethodInorder,
171   TraverseMethodPostorder
172 } TRAVERSE_METHOD;
173
174 typedef LONG STDCALL_FUNC
175 (*PKEY_COMPARATOR)(IN PVOID  Key1,
176   IN PVOID  Key2);
177
178 typedef BOOLEAN STDCALL_FUNC
179 (*PTRAVERSE_ROUTINE)(IN PVOID  Context,
180   IN PVOID  Key,
181   IN PVOID  Value);
182
183 struct _BINARY_TREE_NODE;
184
185 typedef struct _BINARY_TREE
186 {
187   struct _BINARY_TREE_NODE  * RootNode;
188   PKEY_COMPARATOR  Compare;
189   BOOLEAN  UseNonPagedPool;
190   union {
191     NPAGED_LOOKASIDE_LIST  NonPaged;
192     PAGED_LOOKASIDE_LIST  Paged;
193   } List;
194   union {
195     KSPIN_LOCK  NonPaged;
196     FAST_MUTEX  Paged;
197   } Lock;
198 } BINARY_TREE, *PBINARY_TREE;
199
200
201 struct _SPLAY_TREE_NODE;
202
203 typedef struct _SPLAY_TREE
204 {
205   struct _SPLAY_TREE_NODE  * RootNode;
206   PKEY_COMPARATOR  Compare;
207   BOOLEAN  Weighted;
208   BOOLEAN  UseNonPagedPool;
209   union {
210     NPAGED_LOOKASIDE_LIST  NonPaged;
211     PAGED_LOOKASIDE_LIST  Paged;
212   } List;
213   union {
214     KSPIN_LOCK  NonPaged;
215     FAST_MUTEX  Paged;
216   } Lock;
217   PVOID  Reserved[4];
218 } SPLAY_TREE, *PSPLAY_TREE;
219
220
221 typedef struct _HASH_TABLE
222 {
223   // Size of hash table in number of bits
224   ULONG  HashTableSize;
225
226   // Use non-paged pool memory?
227   BOOLEAN  UseNonPagedPool;
228
229   // Lock for this structure
230   union {
231     KSPIN_LOCK  NonPaged;
232     FAST_MUTEX  Paged;
233   } Lock;
234
235   // Pointer to array of hash buckets with splay trees
236   PSPLAY_TREE  HashTrees;
237 } HASH_TABLE, *PHASH_TABLE;
238
239 /* END REACTOS ONLY */
240
241 #endif /* __INCLUDE_DDK_EXTYPES_H */
242
243 /* EOF */