1 $
if (_WDMDDK_
|| _NTDDK_
)
2 /******************************************************************************
4 ******************************************************************************/
7 #define EX_RUNDOWN_ACTIVE 0x1
8 #define EX_RUNDOWN_COUNT_SHIFT 0x1
9 #define EX_RUNDOWN_COUNT_INC (1 << EX_RUNDOWN_COUNT_SHIFT)
11 typedef struct _FAST_MUTEX
{
17 } FAST_MUTEX
, *PFAST_MUTEX
;
19 typedef enum _SUITE_TYPE
{
25 SmallBusinessRestricted
,
39 typedef enum _EX_POOL_PRIORITY
{
41 LowPoolPrioritySpecialPoolOverrun
= 8,
42 LowPoolPrioritySpecialPoolUnderrun
= 9,
43 NormalPoolPriority
= 16,
44 NormalPoolPrioritySpecialPoolOverrun
= 24,
45 NormalPoolPrioritySpecialPoolUnderrun
= 25,
46 HighPoolPriority
= 32,
47 HighPoolPrioritySpecialPoolOverrun
= 40,
48 HighPoolPrioritySpecialPoolUnderrun
= 41
51 #if !defined(_WIN64) && (defined(_NTDDK_) || defined(_NTIFS_) || defined(_NDIS_))
52 #define LOOKASIDE_ALIGN
54 #define LOOKASIDE_ALIGN /* FIXME: DECLSPEC_CACHEALIGN */
57 typedef struct _LOOKASIDE_LIST_EX
*PLOOKASIDE_LIST_EX
;
60 (NTAPI
*PALLOCATE_FUNCTION
)(
61 IN POOL_TYPE PoolType
,
62 IN SIZE_T NumberOfBytes
,
66 (NTAPI
*PALLOCATE_FUNCTION_EX
)(
67 IN POOL_TYPE PoolType
,
68 IN SIZE_T NumberOfBytes
,
70 IN OUT PLOOKASIDE_LIST_EX Lookaside
);
73 (NTAPI
*PFREE_FUNCTION
)(
77 (NTAPI
*PFREE_FUNCTION_EX
)(
79 IN OUT PLOOKASIDE_LIST_EX Lookaside
);
82 (NTAPI CALLBACK_FUNCTION
)(
83 IN PVOID CallbackContext OPTIONAL
,
84 IN PVOID Argument1 OPTIONAL
,
85 IN PVOID Argument2 OPTIONAL
);
86 typedef CALLBACK_FUNCTION
*PCALLBACK_FUNCTION
;
88 #define GENERAL_LOOKASIDE_LAYOUT \
89 _ANONYMOUS_UNION union { \
90 SLIST_HEADER ListHead; \
91 SINGLE_LIST_ENTRY SingleListHead; \
94 USHORT MaximumDepth; \
95 ULONG TotalAllocates; \
96 _ANONYMOUS_UNION union { \
97 ULONG AllocateMisses; \
101 _ANONYMOUS_UNION union { \
108 _ANONYMOUS_UNION union { \
109 PALLOCATE_FUNCTION_EX AllocateEx; \
110 PALLOCATE_FUNCTION Allocate; \
112 _ANONYMOUS_UNION union { \
113 PFREE_FUNCTION_EX FreeEx; \
114 PFREE_FUNCTION Free; \
116 LIST_ENTRY ListEntry; \
117 ULONG LastTotalAllocates; \
118 _ANONYMOUS_UNION union { \
119 ULONG LastAllocateMisses; \
120 ULONG LastAllocateHits; \
124 typedef struct LOOKASIDE_ALIGN _GENERAL_LOOKASIDE
{
125 GENERAL_LOOKASIDE_LAYOUT
126 } GENERAL_LOOKASIDE
, *PGENERAL_LOOKASIDE
;
128 typedef struct _GENERAL_LOOKASIDE_POOL
{
129 GENERAL_LOOKASIDE_LAYOUT
130 } GENERAL_LOOKASIDE_POOL
, *PGENERAL_LOOKASIDE_POOL
;
132 #define LOOKASIDE_CHECK(f) \
133 C_ASSERT(FIELD_OFFSET(GENERAL_LOOKASIDE,f) == FIELD_OFFSET(GENERAL_LOOKASIDE_POOL,f))
135 LOOKASIDE_CHECK(TotalFrees
);
136 LOOKASIDE_CHECK(Tag
);
137 LOOKASIDE_CHECK(Future
);
139 typedef struct _PAGED_LOOKASIDE_LIST
{
141 #if !defined(_AMD64_) && !defined(_IA64_)
142 FAST_MUTEX Lock__ObsoleteButDoNotDelete
;
144 } PAGED_LOOKASIDE_LIST
, *PPAGED_LOOKASIDE_LIST
;
146 typedef struct LOOKASIDE_ALIGN _NPAGED_LOOKASIDE_LIST
{
148 #if !defined(_AMD64_) && !defined(_IA64_)
149 KSPIN_LOCK Lock__ObsoleteButDoNotDelete
;
151 } NPAGED_LOOKASIDE_LIST
, *PNPAGED_LOOKASIDE_LIST
;
153 #define LOOKASIDE_MINIMUM_BLOCK_SIZE (RTL_SIZEOF_THROUGH_FIELD (SLIST_ENTRY, Next))
155 typedef struct _LOOKASIDE_LIST_EX
{
156 GENERAL_LOOKASIDE_POOL L
;
159 #if (NTDDI_VERSION >= NTDDI_VISTA)
161 #define EX_LOOKASIDE_LIST_EX_FLAGS_RAISE_ON_FAIL 0x00000001UL
162 #define EX_LOOKASIDE_LIST_EX_FLAGS_FAIL_NO_RAISE 0x00000002UL
164 #define EX_MAXIMUM_LOOKASIDE_DEPTH_BASE 256
165 #define EX_MAXIMUM_LOOKASIDE_DEPTH_LIMIT 1024
167 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
169 typedef struct _EX_RUNDOWN_REF
{
170 _ANONYMOUS_UNION
union {
171 volatile ULONG_PTR Count
;
174 } EX_RUNDOWN_REF
, *PEX_RUNDOWN_REF
;
176 typedef struct _EX_RUNDOWN_REF_CACHE_AWARE
*PEX_RUNDOWN_REF_CACHE_AWARE
;
178 typedef enum _WORK_QUEUE_TYPE
{
181 HyperCriticalWorkQueue
,
186 (NTAPI WORKER_THREAD_ROUTINE
)(
188 typedef WORKER_THREAD_ROUTINE
*PWORKER_THREAD_ROUTINE
;
190 typedef struct _WORK_QUEUE_ITEM
{
192 PWORKER_THREAD_ROUTINE WorkerRoutine
;
193 volatile PVOID Parameter
;
194 } WORK_QUEUE_ITEM
, *PWORK_QUEUE_ITEM
;
196 typedef ULONG_PTR ERESOURCE_THREAD
, *PERESOURCE_THREAD
;
198 typedef struct _OWNER_ENTRY
{
199 ERESOURCE_THREAD OwnerThread
;
200 _ANONYMOUS_UNION
union {
201 _ANONYMOUS_STRUCT
struct {
202 ULONG IoPriorityBoosted
:1;
203 ULONG OwnerReferenced
:1;
208 } OWNER_ENTRY
, *POWNER_ENTRY
;
210 typedef struct _ERESOURCE
{
211 LIST_ENTRY SystemResourcesList
;
212 POWNER_ENTRY OwnerTable
;
215 volatile PKSEMAPHORE SharedWaiters
;
216 volatile PKEVENT ExclusiveWaiters
;
217 OWNER_ENTRY OwnerEntry
;
219 ULONG ContentionCount
;
220 ULONG NumberOfSharedWaiters
;
221 ULONG NumberOfExclusiveWaiters
;
225 _ANONYMOUS_UNION
union {
227 ULONG_PTR CreatorBackTraceIndex
;
230 } ERESOURCE
, *PERESOURCE
;
233 #define ResourceNeverExclusive 0x0010
234 #define ResourceReleaseByOtherThread 0x0020
235 #define ResourceOwnedExclusive 0x0080
237 #define RESOURCE_HASH_TABLE_SIZE 64
239 typedef struct _RESOURCE_HASH_ENTRY
{
240 LIST_ENTRY ListEntry
;
242 ULONG ContentionCount
;
244 } RESOURCE_HASH_ENTRY
, *PRESOURCE_HASH_ENTRY
;
246 typedef struct _RESOURCE_PERFORMANCE_DATA
{
247 ULONG ActiveResourceCount
;
248 ULONG TotalResourceCount
;
249 ULONG ExclusiveAcquire
;
250 ULONG SharedFirstLevel
;
251 ULONG SharedSecondLevel
;
252 ULONG StarveFirstLevel
;
253 ULONG StarveSecondLevel
;
254 ULONG WaitForExclusive
;
255 ULONG OwnerTableExpands
;
256 ULONG MaximumTableExpand
;
257 LIST_ENTRY HashTable
[RESOURCE_HASH_TABLE_SIZE
];
258 } RESOURCE_PERFORMANCE_DATA
, *PRESOURCE_PERFORMANCE_DATA
;
260 /* Global debug flag */
262 extern ULONG NtGlobalFlag
;
263 #define IF_NTOS_DEBUG(FlagName) if (NtGlobalFlag & (FLG_##FlagName))
265 #define IF_NTOS_DEBUG(FlagName) if(FALSE)
270 typedef struct _ZONE_SEGMENT_HEADER
{
271 SINGLE_LIST_ENTRY SegmentList
;
273 } ZONE_SEGMENT_HEADER
, *PZONE_SEGMENT_HEADER
;
275 typedef struct _ZONE_HEADER
{
276 SINGLE_LIST_ENTRY FreeList
;
277 SINGLE_LIST_ENTRY SegmentList
;
279 ULONG TotalSegmentSize
;
280 } ZONE_HEADER
, *PZONE_HEADER
;
282 #define PROTECTED_POOL 0x80000000
286 #define INVALID_PROCESSOR_INDEX 0xffffffff
288 #define EX_PUSH_LOCK ULONG_PTR
289 #define PEX_PUSH_LOCK PULONG_PTR