1 /******************************************************************************
3 ******************************************************************************/
5 typedef struct _ZONE_SEGMENT_HEADER
{
6 SINGLE_LIST_ENTRY SegmentList
;
8 } ZONE_SEGMENT_HEADER
, *PZONE_SEGMENT_HEADER
;
10 typedef struct _ZONE_HEADER
{
11 SINGLE_LIST_ENTRY FreeList
;
12 SINGLE_LIST_ENTRY SegmentList
;
14 ULONG TotalSegmentSize
;
15 } ZONE_HEADER
, *PZONE_HEADER
;
17 #define PROTECTED_POOL 0x80000000
21 #define EX_RUNDOWN_ACTIVE 0x1
22 #define EX_RUNDOWN_COUNT_SHIFT 0x1
23 #define EX_RUNDOWN_COUNT_INC (1 << EX_RUNDOWN_COUNT_SHIFT)
25 typedef struct _FAST_MUTEX
{
31 } FAST_MUTEX
, *PFAST_MUTEX
;
33 typedef enum _SUITE_TYPE
{
39 SmallBusinessRestricted
,
53 typedef enum _EX_POOL_PRIORITY
{
55 LowPoolPrioritySpecialPoolOverrun
= 8,
56 LowPoolPrioritySpecialPoolUnderrun
= 9,
57 NormalPoolPriority
= 16,
58 NormalPoolPrioritySpecialPoolOverrun
= 24,
59 NormalPoolPrioritySpecialPoolUnderrun
= 25,
60 HighPoolPriority
= 32,
61 HighPoolPrioritySpecialPoolOverrun
= 40,
62 HighPoolPrioritySpecialPoolUnderrun
= 41
65 #if !defined(_WIN64) && (defined(_NTDDK_) || defined(_NTIFS_) || defined(_NDIS_))
66 #define LOOKASIDE_ALIGN
68 #define LOOKASIDE_ALIGN /* FIXME: DECLSPEC_CACHEALIGN */
71 typedef struct _LOOKASIDE_LIST_EX
*PLOOKASIDE_LIST_EX
;
74 (NTAPI
*PALLOCATE_FUNCTION
)(
75 IN POOL_TYPE PoolType
,
76 IN SIZE_T NumberOfBytes
,
80 (NTAPI
*PALLOCATE_FUNCTION_EX
)(
81 IN POOL_TYPE PoolType
,
82 IN SIZE_T NumberOfBytes
,
84 IN OUT PLOOKASIDE_LIST_EX Lookaside
);
87 (NTAPI
*PFREE_FUNCTION
)(
91 (NTAPI
*PFREE_FUNCTION_EX
)(
93 IN OUT PLOOKASIDE_LIST_EX Lookaside
);
96 (NTAPI CALLBACK_FUNCTION
)(
97 IN PVOID CallbackContext OPTIONAL
,
98 IN PVOID Argument1 OPTIONAL
,
99 IN PVOID Argument2 OPTIONAL
);
100 typedef CALLBACK_FUNCTION
*PCALLBACK_FUNCTION
;
102 #define GENERAL_LOOKASIDE_LAYOUT \
104 SLIST_HEADER ListHead; \
105 SINGLE_LIST_ENTRY SingleListHead; \
108 USHORT MaximumDepth; \
109 ULONG TotalAllocates; \
111 ULONG AllocateMisses; \
112 ULONG AllocateHits; \
125 PALLOCATE_FUNCTION_EX AllocateEx; \
126 PALLOCATE_FUNCTION Allocate; \
130 PFREE_FUNCTION_EX FreeEx; \
131 PFREE_FUNCTION Free; \
134 LIST_ENTRY ListEntry; \
135 ULONG LastTotalAllocates; \
137 ULONG LastAllocateMisses; \
138 ULONG LastAllocateHits; \
142 typedef struct LOOKASIDE_ALIGN _GENERAL_LOOKASIDE
{
143 GENERAL_LOOKASIDE_LAYOUT
144 } GENERAL_LOOKASIDE
, *PGENERAL_LOOKASIDE
;
146 typedef struct _GENERAL_LOOKASIDE_POOL
{
147 GENERAL_LOOKASIDE_LAYOUT
148 } GENERAL_LOOKASIDE_POOL
, *PGENERAL_LOOKASIDE_POOL
;
150 #define LOOKASIDE_CHECK(f) \
151 C_ASSERT(FIELD_OFFSET(GENERAL_LOOKASIDE,f) == FIELD_OFFSET(GENERAL_LOOKASIDE_POOL,f))
153 LOOKASIDE_CHECK(TotalFrees
);
154 LOOKASIDE_CHECK(Tag
);
155 LOOKASIDE_CHECK(Future
);
157 typedef struct _PAGED_LOOKASIDE_LIST
{
159 #if !defined(_AMD64_) && !defined(_IA64_)
160 FAST_MUTEX Lock__ObsoleteButDoNotDelete
;
162 } PAGED_LOOKASIDE_LIST
, *PPAGED_LOOKASIDE_LIST
;
164 typedef struct LOOKASIDE_ALIGN _NPAGED_LOOKASIDE_LIST
{
166 #if !defined(_AMD64_) && !defined(_IA64_)
167 KSPIN_LOCK Lock__ObsoleteButDoNotDelete
;
169 } NPAGED_LOOKASIDE_LIST
, *PNPAGED_LOOKASIDE_LIST
;
171 #define LOOKASIDE_MINIMUM_BLOCK_SIZE (RTL_SIZEOF_THROUGH_FIELD (SLIST_ENTRY, Next))
173 typedef struct _LOOKASIDE_LIST_EX
{
174 GENERAL_LOOKASIDE_POOL L
;
177 #if (NTDDI_VERSION >= NTDDI_VISTA)
179 #define EX_LOOKASIDE_LIST_EX_FLAGS_RAISE_ON_FAIL 0x00000001UL
180 #define EX_LOOKASIDE_LIST_EX_FLAGS_FAIL_NO_RAISE 0x00000002UL
182 #define EX_MAXIMUM_LOOKASIDE_DEPTH_BASE 256
183 #define EX_MAXIMUM_LOOKASIDE_DEPTH_LIMIT 1024
185 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
187 typedef struct _EX_RUNDOWN_REF
{
188 __GNU_EXTENSION
union {
189 volatile ULONG_PTR Count
;
192 } EX_RUNDOWN_REF
, *PEX_RUNDOWN_REF
;
194 typedef struct _EX_RUNDOWN_REF_CACHE_AWARE
*PEX_RUNDOWN_REF_CACHE_AWARE
;
196 typedef enum _WORK_QUEUE_TYPE
{
199 HyperCriticalWorkQueue
,
204 (NTAPI WORKER_THREAD_ROUTINE
)(
206 typedef WORKER_THREAD_ROUTINE
*PWORKER_THREAD_ROUTINE
;
208 typedef struct _WORK_QUEUE_ITEM
{
210 PWORKER_THREAD_ROUTINE WorkerRoutine
;
211 volatile PVOID Parameter
;
212 } WORK_QUEUE_ITEM
, *PWORK_QUEUE_ITEM
;
214 typedef ULONG_PTR ERESOURCE_THREAD
, *PERESOURCE_THREAD
;
216 typedef struct _OWNER_ENTRY
{
217 ERESOURCE_THREAD OwnerThread
;
220 ULONG IoPriorityBoosted
:1;
221 ULONG OwnerReferenced
:1;
226 } OWNER_ENTRY
, *POWNER_ENTRY
;
228 typedef struct _ERESOURCE
{
229 LIST_ENTRY SystemResourcesList
;
230 POWNER_ENTRY OwnerTable
;
233 volatile PKSEMAPHORE SharedWaiters
;
234 volatile PKEVENT ExclusiveWaiters
;
235 OWNER_ENTRY OwnerEntry
;
237 ULONG ContentionCount
;
238 ULONG NumberOfSharedWaiters
;
239 ULONG NumberOfExclusiveWaiters
;
243 __GNU_EXTENSION
union {
245 ULONG_PTR CreatorBackTraceIndex
;
248 } ERESOURCE
, *PERESOURCE
;
251 #define ResourceNeverExclusive 0x0010
252 #define ResourceReleaseByOtherThread 0x0020
253 #define ResourceOwnedExclusive 0x0080
255 #define RESOURCE_HASH_TABLE_SIZE 64
257 typedef struct _RESOURCE_HASH_ENTRY
{
258 LIST_ENTRY ListEntry
;
260 ULONG ContentionCount
;
262 } RESOURCE_HASH_ENTRY
, *PRESOURCE_HASH_ENTRY
;
264 typedef struct _RESOURCE_PERFORMANCE_DATA
{
265 ULONG ActiveResourceCount
;
266 ULONG TotalResourceCount
;
267 ULONG ExclusiveAcquire
;
268 ULONG SharedFirstLevel
;
269 ULONG SharedSecondLevel
;
270 ULONG StarveFirstLevel
;
271 ULONG StarveSecondLevel
;
272 ULONG WaitForExclusive
;
273 ULONG OwnerTableExpands
;
274 ULONG MaximumTableExpand
;
275 LIST_ENTRY HashTable
[RESOURCE_HASH_TABLE_SIZE
];
276 } RESOURCE_PERFORMANCE_DATA
, *PRESOURCE_PERFORMANCE_DATA
;