1 $
if (_WDMDDK_
|| _NTDDK_
)
2 /******************************************************************************
4 ******************************************************************************/
5 $
endif (_WDMDDK_
|| _NTDDK_
)
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 _Function_class_(ALLOCATE_FUNCTION
)
62 (NTAPI
*PALLOCATE_FUNCTION
)(
63 _In_ POOL_TYPE PoolType
,
64 _In_ SIZE_T NumberOfBytes
,
68 _Function_class_(ALLOCATE_FUNCTION_EX
)
70 (NTAPI
*PALLOCATE_FUNCTION_EX
)(
71 _In_ POOL_TYPE PoolType
,
72 _In_ SIZE_T NumberOfBytes
,
74 _Inout_ PLOOKASIDE_LIST_EX Lookaside
);
77 _Function_class_(FREE_FUNCTION
)
79 (NTAPI
*PFREE_FUNCTION
)(
83 _Function_class_(FREE_FUNCTION_EX
)
85 (NTAPI
*PFREE_FUNCTION_EX
)(
87 _Inout_ PLOOKASIDE_LIST_EX Lookaside
);
90 _Function_class_(CALLBACK_FUNCTION
)
92 (NTAPI CALLBACK_FUNCTION
)(
93 _In_opt_ PVOID CallbackContext
,
94 _In_opt_ PVOID Argument1
,
95 _In_opt_ PVOID Argument2
);
96 typedef CALLBACK_FUNCTION
*PCALLBACK_FUNCTION
;
98 #define GENERAL_LOOKASIDE_LAYOUT \
99 _ANONYMOUS_UNION union { \
100 SLIST_HEADER ListHead; \
101 SINGLE_LIST_ENTRY SingleListHead; \
104 USHORT MaximumDepth; \
105 ULONG TotalAllocates; \
106 _ANONYMOUS_UNION union { \
107 ULONG AllocateMisses; \
108 ULONG AllocateHits; \
111 _ANONYMOUS_UNION union { \
118 _ANONYMOUS_UNION union { \
119 PALLOCATE_FUNCTION_EX AllocateEx; \
120 PALLOCATE_FUNCTION Allocate; \
122 _ANONYMOUS_UNION union { \
123 PFREE_FUNCTION_EX FreeEx; \
124 PFREE_FUNCTION Free; \
126 LIST_ENTRY ListEntry; \
127 ULONG LastTotalAllocates; \
128 _ANONYMOUS_UNION union { \
129 ULONG LastAllocateMisses; \
130 ULONG LastAllocateHits; \
134 typedef struct LOOKASIDE_ALIGN _GENERAL_LOOKASIDE
{
135 GENERAL_LOOKASIDE_LAYOUT
136 } GENERAL_LOOKASIDE
, *PGENERAL_LOOKASIDE
;
138 typedef struct _GENERAL_LOOKASIDE_POOL
{
139 GENERAL_LOOKASIDE_LAYOUT
140 } GENERAL_LOOKASIDE_POOL
, *PGENERAL_LOOKASIDE_POOL
;
142 #define LOOKASIDE_CHECK(f) \
143 C_ASSERT(FIELD_OFFSET(GENERAL_LOOKASIDE,f) == FIELD_OFFSET(GENERAL_LOOKASIDE_POOL,f))
145 LOOKASIDE_CHECK(TotalFrees
);
146 LOOKASIDE_CHECK(Tag
);
147 LOOKASIDE_CHECK(Future
);
149 typedef struct LOOKASIDE_ALIGN _PAGED_LOOKASIDE_LIST
{
151 #if !defined(_AMD64_) && !defined(_IA64_)
152 FAST_MUTEX Lock__ObsoleteButDoNotDelete
;
154 } PAGED_LOOKASIDE_LIST
, *PPAGED_LOOKASIDE_LIST
;
156 typedef struct LOOKASIDE_ALIGN _NPAGED_LOOKASIDE_LIST
{
158 #if !defined(_AMD64_) && !defined(_IA64_)
159 KSPIN_LOCK Lock__ObsoleteButDoNotDelete
;
161 } NPAGED_LOOKASIDE_LIST
, *PNPAGED_LOOKASIDE_LIST
;
163 #define LOOKASIDE_MINIMUM_BLOCK_SIZE (RTL_SIZEOF_THROUGH_FIELD (SLIST_ENTRY, Next))
165 typedef struct _LOOKASIDE_LIST_EX
{
166 GENERAL_LOOKASIDE_POOL L
;
169 #if (NTDDI_VERSION >= NTDDI_VISTA)
171 #define EX_LOOKASIDE_LIST_EX_FLAGS_RAISE_ON_FAIL 0x00000001UL
172 #define EX_LOOKASIDE_LIST_EX_FLAGS_FAIL_NO_RAISE 0x00000002UL
174 #define EX_MAXIMUM_LOOKASIDE_DEPTH_BASE 256
175 #define EX_MAXIMUM_LOOKASIDE_DEPTH_LIMIT 1024
177 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
179 typedef struct _EX_RUNDOWN_REF
{
180 _ANONYMOUS_UNION
union {
181 volatile ULONG_PTR Count
;
184 } EX_RUNDOWN_REF
, *PEX_RUNDOWN_REF
;
186 typedef struct _EX_RUNDOWN_REF_CACHE_AWARE
*PEX_RUNDOWN_REF_CACHE_AWARE
;
188 typedef enum _WORK_QUEUE_TYPE
{
191 HyperCriticalWorkQueue
,
196 _Function_class_(WORKER_THREAD_ROUTINE
)
198 (NTAPI WORKER_THREAD_ROUTINE
)(
199 _In_ PVOID Parameter
);
200 typedef WORKER_THREAD_ROUTINE
*PWORKER_THREAD_ROUTINE
;
202 typedef struct _WORK_QUEUE_ITEM
{
204 PWORKER_THREAD_ROUTINE WorkerRoutine
;
205 volatile PVOID Parameter
;
206 } WORK_QUEUE_ITEM
, *PWORK_QUEUE_ITEM
;
208 typedef ULONG_PTR ERESOURCE_THREAD
, *PERESOURCE_THREAD
;
210 typedef struct _OWNER_ENTRY
{
211 ERESOURCE_THREAD OwnerThread
;
212 _ANONYMOUS_UNION
union {
213 _ANONYMOUS_STRUCT
struct {
214 ULONG IoPriorityBoosted
:1;
215 ULONG OwnerReferenced
:1;
220 } OWNER_ENTRY
, *POWNER_ENTRY
;
222 typedef struct _ERESOURCE
{
223 LIST_ENTRY SystemResourcesList
;
224 POWNER_ENTRY OwnerTable
;
227 volatile PKSEMAPHORE SharedWaiters
;
228 volatile PKEVENT ExclusiveWaiters
;
229 OWNER_ENTRY OwnerEntry
;
231 ULONG ContentionCount
;
232 ULONG NumberOfSharedWaiters
;
233 ULONG NumberOfExclusiveWaiters
;
237 _ANONYMOUS_UNION
union {
239 ULONG_PTR CreatorBackTraceIndex
;
242 } ERESOURCE
, *PERESOURCE
;
245 #define ResourceNeverExclusive 0x0010
246 #define ResourceReleaseByOtherThread 0x0020
247 #define ResourceOwnedExclusive 0x0080
249 #define RESOURCE_HASH_TABLE_SIZE 64
251 typedef struct _RESOURCE_HASH_ENTRY
{
252 LIST_ENTRY ListEntry
;
254 ULONG ContentionCount
;
256 } RESOURCE_HASH_ENTRY
, *PRESOURCE_HASH_ENTRY
;
258 typedef struct _RESOURCE_PERFORMANCE_DATA
{
259 ULONG ActiveResourceCount
;
260 ULONG TotalResourceCount
;
261 ULONG ExclusiveAcquire
;
262 ULONG SharedFirstLevel
;
263 ULONG SharedSecondLevel
;
264 ULONG StarveFirstLevel
;
265 ULONG StarveSecondLevel
;
266 ULONG WaitForExclusive
;
267 ULONG OwnerTableExpands
;
268 ULONG MaximumTableExpand
;
269 LIST_ENTRY HashTable
[RESOURCE_HASH_TABLE_SIZE
];
270 } RESOURCE_PERFORMANCE_DATA
, *PRESOURCE_PERFORMANCE_DATA
;
272 /* Global debug flag */
274 extern ULONG NtGlobalFlag
;
275 #define IF_NTOS_DEBUG(FlagName) if (NtGlobalFlag & (FLG_##FlagName))
277 #define IF_NTOS_DEBUG(FlagName) if(FALSE)
282 typedef struct _ZONE_SEGMENT_HEADER
{
283 SINGLE_LIST_ENTRY SegmentList
;
285 } ZONE_SEGMENT_HEADER
, *PZONE_SEGMENT_HEADER
;
287 typedef struct _ZONE_HEADER
{
288 SINGLE_LIST_ENTRY FreeList
;
289 SINGLE_LIST_ENTRY SegmentList
;
291 ULONG TotalSegmentSize
;
292 } ZONE_HEADER
, *PZONE_HEADER
;
294 #define PROTECTED_POOL 0x80000000
298 #define INVALID_PROCESSOR_INDEX 0xffffffff
300 #define EX_PUSH_LOCK ULONG_PTR
301 #define PEX_PUSH_LOCK PULONG_PTR