1 /******************************************************************************
2 * Executive Functions *
3 ******************************************************************************/
6 #define ExInterlockedIncrementLong(Addend,Lock) Exfi386InterlockedIncrementLong(Addend)
7 #define ExInterlockedDecrementLong(Addend,Lock) Exfi386InterlockedDecrementLong(Addend)
8 #define ExInterlockedExchangeUlong(Target, Value, Lock) Exfi386InterlockedExchangeUlong(Target, Value)
10 #define ExAcquireSpinLock(Lock, OldIrql) KeAcquireSpinLock((Lock), (OldIrql))
11 #define ExReleaseSpinLock(Lock, OldIrql) KeReleaseSpinLock((Lock), (OldIrql))
12 #define ExAcquireSpinLockAtDpcLevel(Lock) KeAcquireSpinLockAtDpcLevel(Lock)
13 #define ExReleaseSpinLockFromDpcLevel(Lock) KeReleaseSpinLockFromDpcLevel(Lock)
15 #define ExInitializeSListHead InitializeSListHead
17 #if defined(_NTHAL_) && defined(_X86_)
23 IN OUT PFAST_MUTEX FastMutex
);
29 IN OUT PFAST_MUTEX FastMutex
);
34 ExiTryToAcquireFastMutex(
35 IN OUT PFAST_MUTEX FastMutex
);
37 #define ExAcquireFastMutex ExiAcquireFastMutex
38 #define ExReleaseFastMutex ExiReleaseFastMutex
39 #define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex
43 #if (NTDDI_VERSION >= NTDDI_WIN2K)
45 _IRQL_raises_(APC_LEVEL
)
46 _IRQL_saves_global_(OldIrql
, FastMutex
)
51 _Inout_
_Requires_lock_not_held_(*_Curr_
) _Acquires_lock_(*_Curr_
)
52 PFAST_MUTEX FastMutex
);
54 _IRQL_requires_(APC_LEVEL
)
55 _IRQL_restores_global_(OldIrql
, FastMutex
)
60 _Inout_
_Requires_lock_held_(*_Curr_
) _Releases_lock_(*_Curr_
)
61 PFAST_MUTEX FastMutex
);
64 _Success_(return!=FALSE
)
65 _IRQL_raises_(APC_LEVEL
)
66 _IRQL_saves_global_(OldIrql
, FastMutex
)
70 ExTryToAcquireFastMutex(
71 _Inout_
_Requires_lock_not_held_(*_Curr_
) _Acquires_lock_(*_Curr_
)
72 PFAST_MUTEX FastMutex
);
74 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
76 #endif /* defined(_NTHAL_) && defined(_X86_) */
79 #define ExInterlockedAddUlong ExfInterlockedAddUlong
80 #define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList
81 #define ExInterlockedInsertTailList ExfInterlockedInsertTailList
82 #define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList
83 #define ExInterlockedPopEntryList ExfInterlockedPopEntryList
84 #define ExInterlockedPushEntryList ExfInterlockedPushEntryList
85 #endif /* defined(_X86_) */
89 #if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || \
90 defined(_NTHAL_) || defined(_NTOSP_)
93 ExQueryDepthSList(_In_ PSLIST_HEADER ListHead
);
97 ExQueryDepthSList(_In_ PSLIST_HEADER ListHead
)
99 return (USHORT
)(ListHead
->Alignment
& 0xffff);
105 ExpInterlockedFlushSList(
106 PSLIST_HEADER ListHead
);
110 ExpInterlockedPopEntrySList(
111 _Inout_ PSLIST_HEADER ListHead
);
115 ExpInterlockedPushEntrySList(
116 _Inout_ PSLIST_HEADER ListHead
,
117 _Inout_ __drv_aliasesMem PSLIST_ENTRY ListEntry
);
119 #define ExInterlockedFlushSList(Head) \
120 ExpInterlockedFlushSList(Head)
121 #define ExInterlockedPopEntrySList(Head, Lock) \
122 ExpInterlockedPopEntrySList(Head)
123 #define ExInterlockedPushEntrySList(Head, Entry, Lock) \
124 ExpInterlockedPushEntrySList(Head, Entry)
126 #else /* !defined(_WIN64) */
128 #ifdef NONAMELESSUNION
129 #define ExQueryDepthSList(listhead) (listhead)->s.Depth
131 #define ExQueryDepthSList(listhead) (listhead)->Depth
137 ExInterlockedFlushSList(
138 _Inout_ PSLIST_HEADER ListHead
);
140 #endif /* !defined(_WIN64) */
142 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
147 ExInterlockedPopEntrySList(
148 _Inout_ PSLIST_HEADER ListHead
,
149 _Inout_
_Requires_lock_not_held_(*_Curr_
) PKSPIN_LOCK Lock
);
154 ExInterlockedPushEntrySList(
155 _Inout_ PSLIST_HEADER ListHead
,
156 _Inout_ __drv_aliasesMem PSINGLE_LIST_ENTRY ListEntry
,
157 _Inout_
_Requires_lock_not_held_(*_Curr_
) PKSPIN_LOCK Lock
);
159 _IRQL_requires_max_(APC_LEVEL
)
163 ExAllocateFromPagedLookasideList(
164 _Inout_ PPAGED_LOOKASIDE_LIST Lookaside
);
166 _IRQL_requires_max_(APC_LEVEL
)
170 ExFreeToPagedLookasideList(
171 _Inout_ PPAGED_LOOKASIDE_LIST Lookaside
,
174 #else /* !_WIN2K_COMPAT_SLIST_USAGE */
177 #define ExInterlockedPopEntrySList(_ListHead, _Lock) \
178 InterlockedPopEntrySList(_ListHead)
179 #define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \
180 InterlockedPushEntrySList(_ListHead, _ListEntry)
183 _IRQL_requires_max_(APC_LEVEL
)
186 ExAllocateFromPagedLookasideList(
187 _Inout_ PPAGED_LOOKASIDE_LIST Lookaside
)
191 Lookaside
->L
.TotalAllocates
++;
192 #ifdef NONAMELESSUNION
193 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.u
.ListHead
);
195 Lookaside
->L
.u2
.AllocateMisses
++;
196 Entry
= (Lookaside
->L
.u4
.Allocate
)(Lookaside
->L
.Type
,
200 #else /* NONAMELESSUNION */
201 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
203 Lookaside
->L
.AllocateMisses
++;
204 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
,
208 #endif /* NONAMELESSUNION */
212 _IRQL_requires_max_(APC_LEVEL
)
215 ExFreeToPagedLookasideList(
216 _Inout_ PPAGED_LOOKASIDE_LIST Lookaside
,
219 Lookaside
->L
.TotalFrees
++;
220 #ifdef NONAMELESSUNION
221 if (ExQueryDepthSList(&Lookaside
->L
.u
.ListHead
) >= Lookaside
->L
.Depth
) {
222 Lookaside
->L
.u3
.FreeMisses
++;
223 (Lookaside
->L
.u5
.Free
)(Entry
);
225 InterlockedPushEntrySList(&Lookaside
->L
.u
.ListHead
, (PSLIST_ENTRY
)Entry
);
227 #else /* NONAMELESSUNION */
228 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
229 Lookaside
->L
.FreeMisses
++;
230 (Lookaside
->L
.Free
)(Entry
);
232 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
234 #endif /* NONAMELESSUNION */
237 #endif /* _WIN2K_COMPAT_SLIST_USAGE */
241 * ExGetCurrentResourceThread(
244 #define ExGetCurrentResourceThread() ((ULONG_PTR)PsGetCurrentThread())
246 #define ExReleaseResource(R) (ExReleaseResourceLite(R))
249 * ExInitializeWorkItem(
250 * IN PWORK_QUEUE_ITEM Item,
251 * IN PWORKER_THREAD_ROUTINE Routine,
254 #define ExInitializeWorkItem(Item, Routine, Context) \
256 (Item)->WorkerRoutine = Routine; \
257 (Item)->Parameter = Context; \
258 (Item)->List.Flink = NULL; \
263 ExInitializeFastMutex(
264 _Out_ PFAST_MUTEX FastMutex
)
266 FastMutex
->Count
= FM_LOCK_BIT
;
267 FastMutex
->Owner
= NULL
;
268 FastMutex
->Contention
= 0;
269 KeInitializeEvent(&FastMutex
->Event
, SynchronizationEvent
, FALSE
);
275 static __inline PVOID
277 IN PZONE_HEADER Zone
)
279 PVOID Result
= (PVOID
)Zone
->FreeList
.Next
;
280 if (Zone
->FreeList
.Next
)
281 Zone
->FreeList
.Next
= Zone
->FreeList
.Next
->Next
;
285 static __inline PVOID
287 IN PZONE_HEADER Zone
,
290 ((PSINGLE_LIST_ENTRY
) Block
)->Next
= Zone
->FreeList
.Next
;
291 Zone
->FreeList
.Next
= ((PSINGLE_LIST_ENTRY
) Block
);
292 return ((PSINGLE_LIST_ENTRY
) Block
)->Next
;
297 * ExInterlockedAllocateFromZone(
298 * IN PZONE_HEADER Zone,
299 * IN PKSPIN_LOCK Lock)
301 #define ExInterlockedAllocateFromZone(Zone, Lock) \
302 ((PVOID) ExInterlockedPopEntryList(&Zone->FreeList, Lock))
305 * ExInterlockedFreeToZone(
306 * IN PZONE_HEADER Zone,
308 * IN PKSPIN_LOCK Lock);
310 #define ExInterlockedFreeToZone(Zone, Block, Lock) \
311 ExInterlockedPushEntryList(&(Zone)->FreeList, (PSINGLE_LIST_ENTRY)(Block), Lock)
316 * IN PZONE_HEADER Zone)
318 #define ExIsFullZone(Zone) \
319 ((Zone)->FreeList.Next == (PSINGLE_LIST_ENTRY) NULL)
322 * ExIsObjectInFirstZoneSegment(
323 * IN PZONE_HEADER Zone,
326 #define ExIsObjectInFirstZoneSegment(Zone,Object) \
327 ((BOOLEAN)( ((PUCHAR)(Object) >= (PUCHAR)(Zone)->SegmentList.Next) && \
328 ((PUCHAR)(Object) < (PUCHAR)(Zone)->SegmentList.Next + \
329 (Zone)->TotalSegmentSize)) )
331 #define ExAcquireResourceExclusive ExAcquireResourceExclusiveLite
332 #define ExAcquireResourceShared ExAcquireResourceSharedLite
333 #define ExConvertExclusiveToShared ExConvertExclusiveToSharedLite
334 #define ExDeleteResource ExDeleteResourceLite
335 #define ExInitializeResource ExInitializeResourceLite
336 #define ExIsResourceAcquiredExclusive ExIsResourceAcquiredExclusiveLite
337 #define ExIsResourceAcquiredShared ExIsResourceAcquiredSharedLite
338 #define ExIsResourceAcquired ExIsResourceAcquiredSharedLite
339 #define ExReleaseResourceForThread ExReleaseResourceForThreadLite
342 #define RESULT_ZERO 0
343 #define RESULT_NEGATIVE 1
344 #define RESULT_POSITIVE 2
347 typedef enum _INTERLOCKED_RESULT
{
348 ResultNegative
= RESULT_NEGATIVE
,
349 ResultZero
= RESULT_ZERO
,
350 ResultPositive
= RESULT_POSITIVE
351 } INTERLOCKED_RESULT
;
358 Exfi386InterlockedIncrementLong(
359 _Inout_ _Interlocked_operand_ LONG
volatile *Addend
);
364 Exfi386InterlockedDecrementLong(
365 _Inout_ _Interlocked_operand_ PLONG Addend
);
370 Exfi386InterlockedExchangeUlong(
371 _Inout_ _Interlocked_operand_ PULONG Target
,
379 #define ExDisableResourceBoost ExDisableResourceBoostLite
383 ExInitializePushLock(
384 _Out_ PEX_PUSH_LOCK PushLock
);
387 #if (NTDDI_VERSION >= NTDDI_WIN2K)
389 _IRQL_requires_max_(APC_LEVEL
)
390 _Requires_lock_held_(_Global_critical_region_
)
394 ExAcquireFastMutexUnsafe(
395 _Inout_
_Requires_lock_not_held_(*_Curr_
) _Acquires_lock_(*_Curr_
)
396 PFAST_MUTEX FastMutex
);
398 _IRQL_requires_max_(APC_LEVEL
)
399 _Requires_lock_held_(_Global_critical_region_
)
403 ExReleaseFastMutexUnsafe(
404 _Inout_
_Requires_lock_held_(*_Curr_
) _Releases_lock_(*_Curr_
)
405 PFAST_MUTEX FastMutex
);
407 _Requires_lock_held_(_Global_critical_region_
)
408 _Requires_lock_not_held_(*Resource
)
409 _When_(Wait
!=0, _Acquires_exclusive_lock_(*Resource
))
410 _IRQL_requires_max_(APC_LEVEL
)
411 _When_(Wait
!=0, _Post_satisfies_(return == 1))
412 _When_(Wait
==0, _Post_satisfies_(return == 0 || return == 1) _Must_inspect_result_
)
416 ExAcquireResourceExclusiveLite(
417 _Inout_ PERESOURCE Resource
,
418 _In_ _Literal_ BOOLEAN Wait
);
420 _IRQL_requires_max_(APC_LEVEL
)
421 _Requires_lock_held_(_Global_critical_region_
)
422 _When_(Wait
!=0, _Post_satisfies_(return == 1))
423 _When_(Wait
==0, _Post_satisfies_(return == 0 || return == 1) _Must_inspect_result_
)
427 ExAcquireResourceSharedLite(
428 _Inout_
_Requires_lock_not_held_(*_Curr_
)
429 _When_(return!=0, _Acquires_shared_lock_(*_Curr_
))
433 _IRQL_requires_max_(APC_LEVEL
)
434 _Requires_lock_held_(_Global_critical_region_
)
435 _When_(Wait
!=0, _Post_satisfies_(return == 1))
436 _When_(Wait
==0, _Post_satisfies_(return == 0 || return == 1) _Must_inspect_result_
)
440 ExAcquireSharedStarveExclusive(
441 _Inout_
_Requires_lock_not_held_(*_Curr_
)
442 _When_(return!=0, _Acquires_shared_lock_(*_Curr_
))
446 _IRQL_requires_max_(APC_LEVEL
)
447 _Requires_lock_held_(_Global_critical_region_
)
448 _When_(Wait
!=0, _Post_satisfies_(return == 1))
449 _When_(Wait
==0, _Post_satisfies_(return == 0 || return == 1) _Must_inspect_result_
)
453 ExAcquireSharedWaitForExclusive(
454 _Inout_
_Requires_lock_not_held_(*_Curr_
)
455 _When_(return!=0, _Acquires_lock_(*_Curr_
))
459 __drv_preferredFunction("ExAllocatePoolWithTag",
460 "No tag interferes with debugging.")
461 __drv_allocatesMem(Mem
)
462 _When_((PoolType
& PagedPool
) != 0, _IRQL_requires_max_(APC_LEVEL
))
463 _When_((PoolType
& PagedPool
) == 0, _IRQL_requires_max_(DISPATCH_LEVEL
))
464 _When_((PoolType
& NonPagedPoolMustSucceed
) != 0,
465 __drv_reportError("Must succeed pool allocations are forbidden. "
466 "Allocation failures cause a system crash"))
467 _When_((PoolType
& (NonPagedPoolMustSucceed
|
468 POOL_RAISE_IF_ALLOCATION_FAILURE
)) == 0,
469 _Post_maybenull_ _Must_inspect_result_
)
470 _When_((PoolType
& (NonPagedPoolMustSucceed
|
471 POOL_RAISE_IF_ALLOCATION_FAILURE
)) != 0,
473 _Post_writable_byte_size_(NumberOfBytes
)
478 __drv_strictTypeMatch(__drv_typeExpr
) _In_ POOL_TYPE PoolType
,
479 _In_ SIZE_T NumberOfBytes
);
481 __drv_preferredFunction("ExAllocatePoolWithQuotaTag",
482 "No tag interferes with debugging.")
483 __drv_allocatesMem(Mem
)
484 _When_((PoolType
& PagedPool
) != 0, _IRQL_requires_max_(APC_LEVEL
))
485 _When_((PoolType
& PagedPool
) == 0, _IRQL_requires_max_(DISPATCH_LEVEL
))
486 _When_((PoolType
& NonPagedPoolMustSucceed
) != 0,
487 __drv_reportError("Must succeed pool allocations are forbidden. "
488 "Allocation failures cause a system crash"))
489 _When_((PoolType
& POOL_QUOTA_FAIL_INSTEAD_OF_RAISE
) != 0,
490 _Post_maybenull_ _Must_inspect_result_
)
491 _When_((PoolType
& POOL_QUOTA_FAIL_INSTEAD_OF_RAISE
) == 0, _Post_notnull_
)
492 _Post_writable_byte_size_(NumberOfBytes
)
496 ExAllocatePoolWithQuota(
497 __drv_strictTypeMatch(__drv_typeExpr
) _In_ POOL_TYPE PoolType
,
498 _In_ SIZE_T NumberOfBytes
);
500 __drv_allocatesMem(Mem
)
501 _When_((PoolType
& PagedPool
) != 0, _IRQL_requires_max_(APC_LEVEL
))
502 _When_((PoolType
& PagedPool
) == 0, _IRQL_requires_max_(DISPATCH_LEVEL
))
503 _When_((PoolType
& NonPagedPoolMustSucceed
) != 0,
504 __drv_reportError("Must succeed pool allocations are forbidden. "
505 "Allocation failures cause a system crash"))
506 _When_((PoolType
& POOL_QUOTA_FAIL_INSTEAD_OF_RAISE
) != 0,
507 _Post_maybenull_ _Must_inspect_result_
)
508 _When_((PoolType
& POOL_QUOTA_FAIL_INSTEAD_OF_RAISE
) == 0, _Post_notnull_
)
509 _Post_writable_byte_size_(NumberOfBytes
)
513 ExAllocatePoolWithQuotaTag(
514 _In_
__drv_strictTypeMatch(__drv_typeExpr
) POOL_TYPE PoolType
,
515 _In_ SIZE_T NumberOfBytes
,
519 #define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b)
522 __drv_allocatesMem(Mem
)
523 _When_((PoolType
& PagedPool
) != 0, _IRQL_requires_max_(APC_LEVEL
))
524 _When_((PoolType
& PagedPool
) == 0, _IRQL_requires_max_(DISPATCH_LEVEL
))
525 _When_((PoolType
& NonPagedPoolMustSucceed
) != 0,
526 __drv_reportError("Must succeed pool allocations are forbidden. "
527 "Allocation failures cause a system crash"))
528 _When_((PoolType
& (NonPagedPoolMustSucceed
| POOL_RAISE_IF_ALLOCATION_FAILURE
)) == 0,
529 _Post_maybenull_ _Must_inspect_result_
)
530 _When_((PoolType
& (NonPagedPoolMustSucceed
| POOL_RAISE_IF_ALLOCATION_FAILURE
)) != 0,
532 _Post_writable_byte_size_(NumberOfBytes
)
533 _Function_class_(ALLOCATE_FUNCTION
)
537 ExAllocatePoolWithTag(
538 _In_
__drv_strictTypeMatch(__drv_typeExpr
) POOL_TYPE PoolType
,
539 _In_ SIZE_T NumberOfBytes
,
543 #define ExAllocatePoolWithTag(a,b,c) ExAllocatePool(a,b)
546 __drv_allocatesMem(Mem
)
547 _When_((PoolType
& PagedPool
) != 0, _IRQL_requires_max_(APC_LEVEL
))
548 _When_((PoolType
& PagedPool
) == 0, _IRQL_requires_max_(DISPATCH_LEVEL
))
549 _When_((PoolType
& NonPagedPoolMustSucceed
) != 0,
550 __drv_reportError("Must succeed pool allocations are forbidden. "
551 "Allocation failures cause a system crash"))
552 _When_((PoolType
& (NonPagedPoolMustSucceed
| POOL_RAISE_IF_ALLOCATION_FAILURE
)) == 0,
553 _Post_maybenull_ _Must_inspect_result_
)
554 _When_((PoolType
& (NonPagedPoolMustSucceed
| POOL_RAISE_IF_ALLOCATION_FAILURE
)) != 0,
556 _Post_writable_byte_size_(NumberOfBytes
)
560 ExAllocatePoolWithTagPriority(
561 _In_
__drv_strictTypeMatch(__drv_typeCond
) POOL_TYPE PoolType
,
562 _In_ SIZE_T NumberOfBytes
,
564 _In_
__drv_strictTypeMatch(__drv_typeExpr
) EX_POOL_PRIORITY Priority
);
566 _IRQL_requires_max_(DISPATCH_LEVEL
)
570 ExConvertExclusiveToSharedLite(
571 _Inout_
_Requires_lock_held_(*_Curr_
) PERESOURCE Resource
);
573 _IRQL_requires_max_(APC_LEVEL
)
578 _Outptr_ PCALLBACK_OBJECT
*CallbackObject
,
579 _In_ POBJECT_ATTRIBUTES ObjectAttributes
,
581 _In_ BOOLEAN AllowMultipleCallbacks
);
586 ExDeleteNPagedLookasideList(
587 _Inout_ PNPAGED_LOOKASIDE_LIST Lookaside
);
589 _IRQL_requires_max_(APC_LEVEL
)
593 ExDeletePagedLookasideList(
594 _Inout_ PPAGED_LOOKASIDE_LIST Lookaside
);
596 _IRQL_requires_max_(DISPATCH_LEVEL
)
600 ExDeleteResourceLite(
601 _Inout_ PERESOURCE Resource
);
603 _IRQL_requires_max_(DISPATCH_LEVEL
)
604 _Function_class_(FREE_FUNCTION
)
609 _Pre_notnull_
__drv_freesMem(Mem
) PVOID P
);
611 _IRQL_requires_max_(DISPATCH_LEVEL
)
616 _Pre_notnull_
__drv_freesMem(Mem
) PVOID P
,
619 _IRQL_requires_max_(DISPATCH_LEVEL
)
623 ExGetExclusiveWaiterCount(
624 _In_ PERESOURCE Resource
);
626 _IRQL_requires_max_(DISPATCH_LEVEL
)
630 ExGetPreviousMode(VOID
);
632 _IRQL_requires_max_(DISPATCH_LEVEL
)
636 ExGetSharedWaiterCount(
637 _In_ PERESOURCE Resource
);
639 _IRQL_requires_max_(DISPATCH_LEVEL
)
643 ExInitializeNPagedLookasideList(
644 _Out_ PNPAGED_LOOKASIDE_LIST Lookaside
,
645 _In_opt_ PALLOCATE_FUNCTION Allocate
,
646 _In_opt_ PFREE_FUNCTION Free
,
652 _IRQL_requires_max_(APC_LEVEL
)
656 ExInitializePagedLookasideList(
657 _Out_ PPAGED_LOOKASIDE_LIST Lookaside
,
658 _In_opt_ PALLOCATE_FUNCTION Allocate
,
659 _In_opt_ PFREE_FUNCTION Free
,
665 _IRQL_requires_max_(DISPATCH_LEVEL
)
669 ExInitializeResourceLite(
670 _Out_ PERESOURCE Resource
);
675 ExInterlockedAddLargeInteger(
676 _Inout_ PLARGE_INTEGER Addend
,
677 _In_ LARGE_INTEGER Increment
,
678 _Inout_
_Requires_lock_not_held_(*_Curr_
) PKSPIN_LOCK Lock
);
681 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
682 (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment)
684 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
685 _InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment)
691 ExInterlockedAddUlong(
692 _Inout_ PULONG Addend
,
693 _In_ ULONG Increment
,
694 _Inout_
_Requires_lock_not_held_(*_Curr_
) PKSPIN_LOCK Lock
);
696 #if defined(_AMD64_) || defined(_IA64_)
698 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
699 InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand))
706 ExfInterlockedCompareExchange64(
707 _Inout_ _Interlocked_operand_ LONGLONG
volatile *Destination
,
708 _In_ PLONGLONG Exchange
,
709 _In_ PLONGLONG Comperand
);
711 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
712 ExfInterlockedCompareExchange64(Destination, Exchange, Comperand)
719 ExInterlockedCompareExchange64(
720 IN OUT LONGLONG
volatile *Destination
,
721 IN PLONGLONG Exchange
,
722 IN PLONGLONG Comparand
,
723 IN PKSPIN_LOCK Lock
);
725 #endif /* defined(_AMD64_) || defined(_IA64_) */
730 ExInterlockedInsertHeadList(
731 _Inout_ PLIST_ENTRY ListHead
,
732 _Inout_ __drv_aliasesMem PLIST_ENTRY ListEntry
,
733 _Inout_
_Requires_lock_not_held_(*_Curr_
) PKSPIN_LOCK Lock
);
738 ExInterlockedInsertTailList(
739 _Inout_ PLIST_ENTRY ListHead
,
740 _Inout_ __drv_aliasesMem PLIST_ENTRY ListEntry
,
741 _Inout_
_Requires_lock_not_held_(*_Curr_
) PKSPIN_LOCK Lock
);
746 ExInterlockedPopEntryList(
747 _Inout_ PSINGLE_LIST_ENTRY ListHead
,
748 _Inout_
_Requires_lock_not_held_(*_Curr_
) PKSPIN_LOCK Lock
);
753 ExInterlockedPushEntryList(
754 _Inout_ PSINGLE_LIST_ENTRY ListHead
,
755 _Inout_ __drv_aliasesMem PSINGLE_LIST_ENTRY ListEntry
,
756 _Inout_
_Requires_lock_not_held_(*_Curr_
) PKSPIN_LOCK Lock
);
761 ExInterlockedRemoveHeadList(
762 _Inout_ PLIST_ENTRY ListHead
,
763 _Inout_
_Requires_lock_not_held_(*_Curr_
) PKSPIN_LOCK Lock
);
765 _IRQL_requires_max_(PASSIVE_LEVEL
)
769 ExIsProcessorFeaturePresent(
770 _In_ ULONG ProcessorFeature
);
772 _IRQL_requires_max_(DISPATCH_LEVEL
)
776 ExIsResourceAcquiredExclusiveLite(
777 _In_ PERESOURCE Resource
);
779 _IRQL_requires_max_(DISPATCH_LEVEL
)
783 ExIsResourceAcquiredSharedLite(
784 _In_ PERESOURCE Resource
);
786 #define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite
791 ExLocalTimeToSystemTime(
792 _In_ PLARGE_INTEGER LocalTime
,
793 _Out_ PLARGE_INTEGER SystemTime
);
795 _IRQL_requires_max_(DISPATCH_LEVEL
)
800 _In_ PCALLBACK_OBJECT CallbackObject
,
801 _In_opt_ PVOID Argument1
,
802 _In_opt_ PVOID Argument2
);
804 _IRQL_requires_max_(DISPATCH_LEVEL
)
809 _Inout_ __drv_aliasesMem PWORK_QUEUE_ITEM WorkItem
,
810 __drv_strictTypeMatch(__drv_typeExpr
) _In_ WORK_QUEUE_TYPE QueueType
);
812 _IRQL_requires_max_(APC_LEVEL
)
818 _In_ NTSTATUS Status
);
820 _IRQL_requires_max_(APC_LEVEL
)
825 _Inout_ PCALLBACK_OBJECT CallbackObject
,
826 _In_ PCALLBACK_FUNCTION CallbackFunction
,
827 _In_opt_ PVOID CallbackContext
);
829 _IRQL_requires_max_(DISPATCH_LEVEL
)
833 ExReinitializeResourceLite(
834 _Inout_ PERESOURCE Resource
);
836 _IRQL_requires_max_(DISPATCH_LEVEL
)
837 _Requires_lock_held_(_Global_critical_region_
)
841 ExReleaseResourceForThreadLite(
842 _Inout_
_Requires_lock_held_(*_Curr_
) _Releases_lock_(*_Curr_
)
844 _In_ ERESOURCE_THREAD ResourceThreadId
);
846 _Requires_lock_held_(_Global_critical_region_
)
847 _Requires_lock_held_(*Resource
)
848 _Releases_lock_(*Resource
)
849 _IRQL_requires_max_(DISPATCH_LEVEL
)
853 ExReleaseResourceLite(
854 _Inout_ PERESOURCE Resource
);
856 _IRQL_requires_max_(DISPATCH_LEVEL
)
860 ExSetResourceOwnerPointer(
861 _Inout_ PERESOURCE Resource
,
862 _In_ PVOID OwnerPointer
);
864 _IRQL_requires_max_(APC_LEVEL
)
868 ExSetTimerResolution(
869 _In_ ULONG DesiredTime
,
870 _In_ BOOLEAN SetResolution
);
875 ExSystemTimeToLocalTime(
876 _In_ PLARGE_INTEGER SystemTime
,
877 _Out_ PLARGE_INTEGER LocalTime
);
879 _IRQL_requires_max_(APC_LEVEL
)
883 ExUnregisterCallback(
884 _Inout_ PVOID CbRegistration
);
892 _Inout_ PZONE_HEADER Zone
,
893 _Inout_ PVOID Segment
,
894 _In_ ULONG SegmentSize
);
900 _Out_ PZONE_HEADER Zone
,
901 _In_ ULONG BlockSize
,
902 _Inout_ PVOID InitialSegment
,
903 _In_ ULONG InitialSegmentSize
);
905 _IRQL_requires_max_(DISPATCH_LEVEL
)
909 ExInterlockedExtendZone(
910 _Inout_ PZONE_HEADER Zone
,
911 _Inout_ PVOID Segment
,
912 _In_ ULONG SegmentSize
,
913 _Inout_
_Requires_lock_not_held_(*_Curr_
) PKSPIN_LOCK Lock
);
915 _IRQL_requires_max_(PASSIVE_LEVEL
)
922 _IRQL_requires_max_(PASSIVE_LEVEL
)
927 ExRaiseAccessViolation(VOID
);
929 _IRQL_requires_max_(PASSIVE_LEVEL
)
934 ExRaiseDatatypeMisalignment(VOID
);
939 _IRQL_requires_max_(DISPATCH_LEVEL
)
943 ExQueryPoolBlockSize(
944 _In_ PVOID PoolBlock
,
945 _Out_ PBOOLEAN QuotaCharged
);
947 _IRQL_requires_max_(DISPATCH_LEVEL
)
949 ExAdjustLookasideDepth(VOID
);
951 _IRQL_requires_max_(DISPATCH_LEVEL
)
955 ExDisableResourceBoostLite(
956 _In_ PERESOURCE Resource
);
958 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
960 $
if (_WDMDDK_
|| _NTIFS_
)
961 #if (NTDDI_VERSION >= NTDDI_WINXP)
962 $
endif (_WDMDDK_
|| _NTIFS_
)
965 _Must_inspect_result_
966 _Post_satisfies_(return == 0 || return == 1)
970 ExAcquireRundownProtection(
971 _Inout_ PEX_RUNDOWN_REF RunRef
);
976 ExInitializeRundownProtection(
977 _Out_ PEX_RUNDOWN_REF RunRef
);
982 ExReInitializeRundownProtection(
983 _Inout_ PEX_RUNDOWN_REF RunRef
);
988 ExReleaseRundownProtection(
989 _Inout_ PEX_RUNDOWN_REF RunRef
);
995 _Out_ PEX_RUNDOWN_REF RunRef
);
1001 __drv_strictTypeMatch(__drv_typeExpr
) _In_ SUITE_TYPE SuiteType
);
1006 ExWaitForRundownProtectionRelease(
1007 _Inout_ PEX_RUNDOWN_REF RunRef
);
1013 InterlockedPushListSList(
1014 _Inout_ PSLIST_HEADER ListHead
,
1015 _Inout_ __drv_aliasesMem PSLIST_ENTRY List
,
1016 _Inout_ PSLIST_ENTRY ListEnd
,
1019 $
if (_WDMDDK_
|| _NTIFS_
)
1020 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
1021 $
endif (_WDMDDK_
|| _NTIFS_
)
1024 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
1026 _Must_inspect_result_
1027 _Post_satisfies_(return == 0 || return == 1)
1031 ExAcquireRundownProtectionEx(
1032 _Inout_ PEX_RUNDOWN_REF RunRef
,
1038 ExReleaseRundownProtectionEx(
1039 _Inout_ PEX_RUNDOWN_REF RunRef
,
1042 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) */
1044 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
1046 _Must_inspect_result_
1047 _IRQL_requires_max_(APC_LEVEL
)
1049 PEX_RUNDOWN_REF_CACHE_AWARE
1051 ExAllocateCacheAwareRundownProtection(
1052 __drv_strictTypeMatch(__drv_typeExpr
) _In_ POOL_TYPE PoolType
,
1053 _In_ ULONG PoolTag
);
1055 _IRQL_requires_max_(APC_LEVEL
)
1059 ExSizeOfRundownProtectionCacheAware(VOID
);
1061 _IRQL_requires_max_(APC_LEVEL
)
1062 _Acquires_lock_(_Global_critical_region_
)
1066 ExEnterCriticalRegionAndAcquireResourceShared(
1067 _Inout_
_Requires_lock_not_held_(*_Curr_
) _Acquires_shared_lock_(*_Curr_
)
1068 PERESOURCE Resource
);
1070 _IRQL_requires_max_(APC_LEVEL
)
1071 _Acquires_lock_(_Global_critical_region_
)
1075 ExEnterCriticalRegionAndAcquireResourceExclusive(
1076 _Inout_
_Requires_lock_not_held_(*_Curr_
) _Acquires_exclusive_lock_(*_Curr_
)
1077 PERESOURCE Resource
);
1079 _IRQL_requires_max_(APC_LEVEL
)
1080 _Acquires_lock_(_Global_critical_region_
)
1084 ExEnterCriticalRegionAndAcquireSharedWaitForExclusive(
1085 _Inout_
_Requires_lock_not_held_(*_Curr_
) _Acquires_lock_(*_Curr_
)
1086 PERESOURCE Resource
);
1088 _IRQL_requires_max_(DISPATCH_LEVEL
)
1089 _Releases_lock_(_Global_critical_region_
)
1093 ExReleaseResourceAndLeaveCriticalRegion(
1094 _Inout_
_Requires_lock_held_(*_Curr_
) _Releases_lock_(*_Curr_
)
1095 PERESOURCE Resource
);
1097 _IRQL_requires_max_(APC_LEVEL
)
1101 ExInitializeRundownProtectionCacheAware(
1102 _Out_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware
,
1103 _In_ SIZE_T RunRefSize
);
1105 _IRQL_requires_max_(APC_LEVEL
)
1109 ExFreeCacheAwareRundownProtection(
1110 _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware
);
1112 _Must_inspect_result_
1113 _Post_satisfies_(return == 0 || return == 1)
1117 ExAcquireRundownProtectionCacheAware(
1118 _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware
);
1123 ExReleaseRundownProtectionCacheAware(
1124 _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware
);
1126 _Must_inspect_result_
1127 _Post_satisfies_(return == 0 || return == 1)
1131 ExAcquireRundownProtectionCacheAwareEx(
1132 _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware
,
1138 ExReleaseRundownProtectionCacheAwareEx(
1139 _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRef
,
1145 ExWaitForRundownProtectionReleaseCacheAware(
1146 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRef
);
1151 ExReInitializeRundownProtectionCacheAware(
1152 _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware
);
1157 ExRundownCompletedCacheAware(
1158 _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware
);
1160 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
1162 #if (NTDDI_VERSION >= NTDDI_VISTA)
1164 _IRQL_requires_max_(DISPATCH_LEVEL
)
1168 ExInitializeLookasideListEx(
1169 _Out_ PLOOKASIDE_LIST_EX Lookaside
,
1170 _In_opt_ PALLOCATE_FUNCTION_EX Allocate
,
1171 _In_opt_ PFREE_FUNCTION_EX Free
,
1172 _In_ POOL_TYPE PoolType
,
1178 _IRQL_requires_max_(DISPATCH_LEVEL
)
1182 ExDeleteLookasideListEx(
1183 _Inout_ PLOOKASIDE_LIST_EX Lookaside
);
1185 _IRQL_requires_max_(DISPATCH_LEVEL
)
1189 ExFlushLookasideListEx(
1190 _Inout_ PLOOKASIDE_LIST_EX Lookaside
);
1192 _Must_inspect_result_
1193 _IRQL_requires_max_(DISPATCH_LEVEL
)
1196 ExAllocateFromLookasideListEx(
1197 _Inout_ PLOOKASIDE_LIST_EX Lookaside
)
1201 Lookaside
->L
.TotalAllocates
+= 1;
1202 #ifdef NONAMELESSUNION
1203 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.u
.ListHead
);
1204 if (Entry
== NULL
) {
1205 Lookaside
->L
.u2
.AllocateMisses
+= 1;
1206 Entry
= (Lookaside
->L
.u4
.AllocateEx
)(Lookaside
->L
.Type
,
1211 #else /* NONAMELESSUNION */
1212 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
1213 if (Entry
== NULL
) {
1214 Lookaside
->L
.AllocateMisses
+= 1;
1215 Entry
= (Lookaside
->L
.AllocateEx
)(Lookaside
->L
.Type
,
1220 #endif /* NONAMELESSUNION */
1224 _IRQL_requires_max_(DISPATCH_LEVEL
)
1227 ExFreeToLookasideListEx(
1228 _Inout_ PLOOKASIDE_LIST_EX Lookaside
,
1231 Lookaside
->L
.TotalFrees
+= 1;
1232 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
1233 Lookaside
->L
.FreeMisses
+= 1;
1234 (Lookaside
->L
.FreeEx
)(Entry
, Lookaside
);
1236 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
1241 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
1243 #if (NTDDI_VERSION >= NTDDI_WIN7)
1245 _IRQL_requires_max_(DISPATCH_LEVEL
)
1249 ExSetResourceOwnerPointerEx(
1250 _Inout_ PERESOURCE Resource
,
1251 _In_ PVOID OwnerPointer
,
1254 #define FLAG_OWNER_POINTER_IS_THREAD 0x1
1256 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
1258 _IRQL_requires_max_(DISPATCH_LEVEL
)
1259 static __inline PVOID
1260 ExAllocateFromNPagedLookasideList(
1261 _Inout_ PNPAGED_LOOKASIDE_LIST Lookaside
)
1265 Lookaside
->L
.TotalAllocates
++;
1266 #ifdef NONAMELESSUNION
1267 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
1268 Entry
= ExInterlockedPopEntrySList(&Lookaside
->L
.u
.ListHead
,
1269 &Lookaside
->Lock__ObsoleteButDoNotDelete
);
1271 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.u
.ListHead
);
1273 if (Entry
== NULL
) {
1274 Lookaside
->L
.u2
.AllocateMisses
++;
1275 Entry
= (Lookaside
->L
.u4
.Allocate
)(Lookaside
->L
.Type
,
1279 #else /* NONAMELESSUNION */
1280 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
1281 Entry
= ExInterlockedPopEntrySList(&Lookaside
->L
.ListHead
,
1282 &Lookaside
->Lock__ObsoleteButDoNotDelete
);
1284 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
1286 if (Entry
== NULL
) {
1287 Lookaside
->L
.AllocateMisses
++;
1288 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
,
1292 #endif /* NONAMELESSUNION */
1296 _IRQL_requires_max_(DISPATCH_LEVEL
)
1297 static __inline VOID
1298 ExFreeToNPagedLookasideList(
1299 _Inout_ PNPAGED_LOOKASIDE_LIST Lookaside
,
1302 Lookaside
->L
.TotalFrees
++;
1303 #ifdef NONAMELESSUNION
1304 if (ExQueryDepthSList(&Lookaside
->L
.u
.ListHead
) >= Lookaside
->L
.Depth
) {
1305 Lookaside
->L
.u3
.FreeMisses
++;
1306 (Lookaside
->L
.u5
.Free
)(Entry
);
1308 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
1309 ExInterlockedPushEntrySList(&Lookaside
->L
.u
.ListHead
,
1310 (PSLIST_ENTRY
)Entry
,
1311 &Lookaside
->Lock__ObsoleteButDoNotDelete
);
1313 InterlockedPushEntrySList(&Lookaside
->L
.u
.ListHead
, (PSLIST_ENTRY
)Entry
);
1316 #else /* NONAMELESSUNION */
1317 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
1318 Lookaside
->L
.FreeMisses
++;
1319 (Lookaside
->L
.Free
)(Entry
);
1321 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
1322 ExInterlockedPushEntrySList(&Lookaside
->L
.ListHead
,
1323 (PSLIST_ENTRY
)Entry
,
1324 &Lookaside
->Lock__ObsoleteButDoNotDelete
);
1326 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
1329 #endif /* NONAMELESSUNION */