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 #ifdef _WIN2K_COMPAT_SLIST_USAGE
94 ExInterlockedPushEntrySList(
95 _Inout_ PSLIST_HEADER SListHead
,
96 _Inout_ __drv_aliasesMem PSLIST_ENTRY SListEntry
,
97 _Inout_opt_
_Requires_lock_not_held_(*_Curr_
) PKSPIN_LOCK Lock
);
102 ExInterlockedPopEntrySList(
103 _Inout_ PSLIST_HEADER SListHead
,
104 _Inout_opt_
_Requires_lock_not_held_(*_Curr_
) PKSPIN_LOCK Lock
);
106 #else /* !_WIN2K_COMPAT_SLIST_USAGE */
108 #define ExInterlockedPushEntrySList(SListHead, SListEntry, Lock) \
109 InterlockedPushEntrySList(SListHead, SListEntry)
111 #define ExInterlockedPopEntrySList(SListHead, Lock) \
112 InterlockedPopEntrySList(SListHead)
114 #endif /* _WIN2K_COMPAT_SLIST_USAGE */
119 ExInterlockedFlushSList(
120 _Inout_ PSLIST_HEADER SListHead
);
122 #ifdef NONAMELESSUNION
123 #define ExQueryDepthSList(SListHead) (SListHead)->s.Depth
125 #define ExQueryDepthSList(SListHead) (SListHead)->Depth
132 ExpInterlockedPushEntrySList(
133 _Inout_ PSLIST_HEADER SListHead
,
134 _Inout_ __drv_aliasesMem PSLIST_ENTRY SListEntry
);
138 ExpInterlockedPopEntrySList(
139 _Inout_ PSLIST_HEADER SListHead
);
143 ExpInterlockedFlushSList(
144 _Inout_ PSLIST_HEADER SListHead
);
146 #if !defined(_NTSYSTEM_) && (defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_) || defined(_NTOSP_))
149 ExQueryDepthSList(_In_ PSLIST_HEADER SListHead
);
153 ExQueryDepthSList(_In_ PSLIST_HEADER SListHead
)
156 return (USHORT
)(SListHead
->Alignment
& 0xffff);
158 return (USHORT
)SListHead
->Depth
;
163 #define ExInterlockedPushEntrySList(SListHead, SListEntry, Lock) \
164 ExpInterlockedPushEntrySList(SListHead, SListEntry)
166 #define ExInterlockedPopEntrySList(SListHead, Lock) \
167 ExpInterlockedPopEntrySList(SListHead)
169 #define ExInterlockedFlushSList(SListHead) \
170 ExpInterlockedFlushSList(SListHead)
175 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
177 _IRQL_requires_max_(APC_LEVEL
)
181 ExAllocateFromPagedLookasideList(
182 _Inout_ PPAGED_LOOKASIDE_LIST Lookaside
);
184 _IRQL_requires_max_(APC_LEVEL
)
188 ExFreeToPagedLookasideList(
189 _Inout_ PPAGED_LOOKASIDE_LIST Lookaside
,
192 #else /* !_WIN2K_COMPAT_SLIST_USAGE */
194 _IRQL_requires_max_(APC_LEVEL
)
197 ExAllocateFromPagedLookasideList(
198 _Inout_ PPAGED_LOOKASIDE_LIST Lookaside
)
202 Lookaside
->L
.TotalAllocates
++;
203 #ifdef NONAMELESSUNION
204 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.u
.ListHead
);
206 Lookaside
->L
.u2
.AllocateMisses
++;
207 Entry
= (Lookaside
->L
.u4
.Allocate
)(Lookaside
->L
.Type
,
211 #else /* NONAMELESSUNION */
212 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
214 Lookaside
->L
.AllocateMisses
++;
215 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
,
219 #endif /* NONAMELESSUNION */
223 _IRQL_requires_max_(APC_LEVEL
)
226 ExFreeToPagedLookasideList(
227 _Inout_ PPAGED_LOOKASIDE_LIST Lookaside
,
230 Lookaside
->L
.TotalFrees
++;
231 #ifdef NONAMELESSUNION
232 if (ExQueryDepthSList(&Lookaside
->L
.u
.ListHead
) >= Lookaside
->L
.Depth
) {
233 Lookaside
->L
.u3
.FreeMisses
++;
234 (Lookaside
->L
.u5
.Free
)(Entry
);
236 InterlockedPushEntrySList(&Lookaside
->L
.u
.ListHead
, (PSLIST_ENTRY
)Entry
);
238 #else /* NONAMELESSUNION */
239 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
240 Lookaside
->L
.FreeMisses
++;
241 (Lookaside
->L
.Free
)(Entry
);
243 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
245 #endif /* NONAMELESSUNION */
248 #endif /* _WIN2K_COMPAT_SLIST_USAGE */
252 * ExGetCurrentResourceThread(
255 #define ExGetCurrentResourceThread() ((ULONG_PTR)PsGetCurrentThread())
257 #define ExReleaseResource(R) (ExReleaseResourceLite(R))
260 * ExInitializeWorkItem(
261 * IN PWORK_QUEUE_ITEM Item,
262 * IN PWORKER_THREAD_ROUTINE Routine,
265 #define ExInitializeWorkItem(Item, Routine, Context) \
267 (Item)->WorkerRoutine = Routine; \
268 (Item)->Parameter = Context; \
269 (Item)->List.Flink = NULL; \
274 ExInitializeFastMutex(
275 _Out_ PFAST_MUTEX FastMutex
)
277 FastMutex
->Count
= FM_LOCK_BIT
;
278 FastMutex
->Owner
= NULL
;
279 FastMutex
->Contention
= 0;
280 KeInitializeEvent(&FastMutex
->Event
, SynchronizationEvent
, FALSE
);
286 static __inline PVOID
288 IN PZONE_HEADER Zone
)
290 PVOID Result
= (PVOID
)Zone
->FreeList
.Next
;
291 if (Zone
->FreeList
.Next
)
292 Zone
->FreeList
.Next
= Zone
->FreeList
.Next
->Next
;
296 static __inline PVOID
298 IN PZONE_HEADER Zone
,
301 ((PSINGLE_LIST_ENTRY
) Block
)->Next
= Zone
->FreeList
.Next
;
302 Zone
->FreeList
.Next
= ((PSINGLE_LIST_ENTRY
) Block
);
303 return ((PSINGLE_LIST_ENTRY
) Block
)->Next
;
308 * ExInterlockedAllocateFromZone(
309 * IN PZONE_HEADER Zone,
310 * IN PKSPIN_LOCK Lock)
312 #define ExInterlockedAllocateFromZone(Zone, Lock) \
313 ((PVOID) ExInterlockedPopEntryList(&Zone->FreeList, Lock))
316 * ExInterlockedFreeToZone(
317 * IN PZONE_HEADER Zone,
319 * IN PKSPIN_LOCK Lock);
321 #define ExInterlockedFreeToZone(Zone, Block, Lock) \
322 ExInterlockedPushEntryList(&(Zone)->FreeList, (PSINGLE_LIST_ENTRY)(Block), Lock)
327 * IN PZONE_HEADER Zone)
329 #define ExIsFullZone(Zone) \
330 ((Zone)->FreeList.Next == (PSINGLE_LIST_ENTRY) NULL)
333 * ExIsObjectInFirstZoneSegment(
334 * IN PZONE_HEADER Zone,
337 #define ExIsObjectInFirstZoneSegment(Zone,Object) \
338 ((BOOLEAN)( ((PUCHAR)(Object) >= (PUCHAR)(Zone)->SegmentList.Next) && \
339 ((PUCHAR)(Object) < (PUCHAR)(Zone)->SegmentList.Next + \
340 (Zone)->TotalSegmentSize)) )
342 #define ExAcquireResourceExclusive ExAcquireResourceExclusiveLite
343 #define ExAcquireResourceShared ExAcquireResourceSharedLite
344 #define ExConvertExclusiveToShared ExConvertExclusiveToSharedLite
345 #define ExDeleteResource ExDeleteResourceLite
346 #define ExInitializeResource ExInitializeResourceLite
347 #define ExIsResourceAcquiredExclusive ExIsResourceAcquiredExclusiveLite
348 #define ExIsResourceAcquiredShared ExIsResourceAcquiredSharedLite
349 #define ExIsResourceAcquired ExIsResourceAcquiredSharedLite
350 #define ExReleaseResourceForThread ExReleaseResourceForThreadLite
353 #define RESULT_ZERO 0
354 #define RESULT_NEGATIVE 1
355 #define RESULT_POSITIVE 2
358 typedef enum _INTERLOCKED_RESULT
{
359 ResultNegative
= RESULT_NEGATIVE
,
360 ResultZero
= RESULT_ZERO
,
361 ResultPositive
= RESULT_POSITIVE
362 } INTERLOCKED_RESULT
;
369 Exfi386InterlockedIncrementLong(
370 _Inout_ _Interlocked_operand_ LONG
volatile *Addend
);
375 Exfi386InterlockedDecrementLong(
376 _Inout_ _Interlocked_operand_ PLONG Addend
);
381 Exfi386InterlockedExchangeUlong(
382 _Inout_ _Interlocked_operand_ PULONG Target
,
390 #define ExDisableResourceBoost ExDisableResourceBoostLite
394 ExInitializePushLock(
395 _Out_ PEX_PUSH_LOCK PushLock
);
398 #if (NTDDI_VERSION >= NTDDI_WIN2K)
400 _IRQL_requires_max_(APC_LEVEL
)
401 _Requires_lock_held_(_Global_critical_region_
)
405 ExAcquireFastMutexUnsafe(
406 _Inout_
_Requires_lock_not_held_(*_Curr_
) _Acquires_lock_(*_Curr_
)
407 PFAST_MUTEX FastMutex
);
409 _IRQL_requires_max_(APC_LEVEL
)
410 _Requires_lock_held_(_Global_critical_region_
)
414 ExReleaseFastMutexUnsafe(
415 _Inout_
_Requires_lock_held_(*_Curr_
) _Releases_lock_(*_Curr_
)
416 PFAST_MUTEX FastMutex
);
418 _Requires_lock_held_(_Global_critical_region_
)
419 _Requires_lock_not_held_(*Resource
)
420 _When_(Wait
!=0, _Acquires_exclusive_lock_(*Resource
))
421 _IRQL_requires_max_(APC_LEVEL
)
422 _When_(Wait
!=0, _Post_satisfies_(return == 1))
423 _When_(Wait
==0, _Post_satisfies_(return == 0 || return == 1) _Must_inspect_result_
)
427 ExAcquireResourceExclusiveLite(
428 _Inout_ PERESOURCE Resource
,
429 _In_ _Literal_ BOOLEAN Wait
);
431 _IRQL_requires_max_(APC_LEVEL
)
432 _Requires_lock_held_(_Global_critical_region_
)
433 _When_(Wait
!=0, _Post_satisfies_(return == 1))
434 _When_(Wait
==0, _Post_satisfies_(return == 0 || return == 1) _Must_inspect_result_
)
438 ExAcquireResourceSharedLite(
439 _Inout_
_Requires_lock_not_held_(*_Curr_
)
440 _When_(return!=0, _Acquires_shared_lock_(*_Curr_
))
444 _IRQL_requires_max_(APC_LEVEL
)
445 _Requires_lock_held_(_Global_critical_region_
)
446 _When_(Wait
!=0, _Post_satisfies_(return == 1))
447 _When_(Wait
==0, _Post_satisfies_(return == 0 || return == 1) _Must_inspect_result_
)
451 ExAcquireSharedStarveExclusive(
452 _Inout_
_Requires_lock_not_held_(*_Curr_
)
453 _When_(return!=0, _Acquires_shared_lock_(*_Curr_
))
457 _IRQL_requires_max_(APC_LEVEL
)
458 _Requires_lock_held_(_Global_critical_region_
)
459 _When_(Wait
!=0, _Post_satisfies_(return == 1))
460 _When_(Wait
==0, _Post_satisfies_(return == 0 || return == 1) _Must_inspect_result_
)
464 ExAcquireSharedWaitForExclusive(
465 _Inout_
_Requires_lock_not_held_(*_Curr_
)
466 _When_(return!=0, _Acquires_lock_(*_Curr_
))
470 __drv_preferredFunction("ExAllocatePoolWithTag",
471 "No tag interferes with debugging.")
472 __drv_allocatesMem(Mem
)
473 _When_((PoolType
& PagedPool
) != 0, _IRQL_requires_max_(APC_LEVEL
))
474 _When_((PoolType
& PagedPool
) == 0, _IRQL_requires_max_(DISPATCH_LEVEL
))
475 _When_((PoolType
& NonPagedPoolMustSucceed
) != 0,
476 __drv_reportError("Must succeed pool allocations are forbidden. "
477 "Allocation failures cause a system crash"))
478 _When_((PoolType
& (NonPagedPoolMustSucceed
|
479 POOL_RAISE_IF_ALLOCATION_FAILURE
)) == 0,
480 _Post_maybenull_ _Must_inspect_result_
)
481 _When_((PoolType
& (NonPagedPoolMustSucceed
|
482 POOL_RAISE_IF_ALLOCATION_FAILURE
)) != 0,
484 _Post_writable_byte_size_(NumberOfBytes
)
489 __drv_strictTypeMatch(__drv_typeExpr
) _In_ POOL_TYPE PoolType
,
490 _In_ SIZE_T NumberOfBytes
);
492 __drv_preferredFunction("ExAllocatePoolWithQuotaTag",
493 "No tag interferes with debugging.")
494 __drv_allocatesMem(Mem
)
495 _When_((PoolType
& PagedPool
) != 0, _IRQL_requires_max_(APC_LEVEL
))
496 _When_((PoolType
& PagedPool
) == 0, _IRQL_requires_max_(DISPATCH_LEVEL
))
497 _When_((PoolType
& NonPagedPoolMustSucceed
) != 0,
498 __drv_reportError("Must succeed pool allocations are forbidden. "
499 "Allocation failures cause a system crash"))
500 _When_((PoolType
& POOL_QUOTA_FAIL_INSTEAD_OF_RAISE
) != 0,
501 _Post_maybenull_ _Must_inspect_result_
)
502 _When_((PoolType
& POOL_QUOTA_FAIL_INSTEAD_OF_RAISE
) == 0, _Post_notnull_
)
503 _Post_writable_byte_size_(NumberOfBytes
)
507 ExAllocatePoolWithQuota(
508 __drv_strictTypeMatch(__drv_typeExpr
) _In_ POOL_TYPE PoolType
,
509 _In_ SIZE_T NumberOfBytes
);
511 __drv_allocatesMem(Mem
)
512 _When_((PoolType
& PagedPool
) != 0, _IRQL_requires_max_(APC_LEVEL
))
513 _When_((PoolType
& PagedPool
) == 0, _IRQL_requires_max_(DISPATCH_LEVEL
))
514 _When_((PoolType
& NonPagedPoolMustSucceed
) != 0,
515 __drv_reportError("Must succeed pool allocations are forbidden. "
516 "Allocation failures cause a system crash"))
517 _When_((PoolType
& POOL_QUOTA_FAIL_INSTEAD_OF_RAISE
) != 0,
518 _Post_maybenull_ _Must_inspect_result_
)
519 _When_((PoolType
& POOL_QUOTA_FAIL_INSTEAD_OF_RAISE
) == 0, _Post_notnull_
)
520 _Post_writable_byte_size_(NumberOfBytes
)
524 ExAllocatePoolWithQuotaTag(
525 _In_
__drv_strictTypeMatch(__drv_typeExpr
) POOL_TYPE PoolType
,
526 _In_ SIZE_T NumberOfBytes
,
530 #define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b)
533 __drv_allocatesMem(Mem
)
534 _When_((PoolType
& PagedPool
) != 0, _IRQL_requires_max_(APC_LEVEL
))
535 _When_((PoolType
& PagedPool
) == 0, _IRQL_requires_max_(DISPATCH_LEVEL
))
536 _When_((PoolType
& NonPagedPoolMustSucceed
) != 0,
537 __drv_reportError("Must succeed pool allocations are forbidden. "
538 "Allocation failures cause a system crash"))
539 _When_((PoolType
& (NonPagedPoolMustSucceed
| POOL_RAISE_IF_ALLOCATION_FAILURE
)) == 0,
540 _Post_maybenull_ _Must_inspect_result_
)
541 _When_((PoolType
& (NonPagedPoolMustSucceed
| POOL_RAISE_IF_ALLOCATION_FAILURE
)) != 0,
543 _Post_writable_byte_size_(NumberOfBytes
)
544 _Function_class_(ALLOCATE_FUNCTION
)
548 ExAllocatePoolWithTag(
549 _In_
__drv_strictTypeMatch(__drv_typeExpr
) POOL_TYPE PoolType
,
550 _In_ SIZE_T NumberOfBytes
,
554 #define ExAllocatePoolWithTag(a,b,c) ExAllocatePool(a,b)
557 __drv_allocatesMem(Mem
)
558 _When_((PoolType
& PagedPool
) != 0, _IRQL_requires_max_(APC_LEVEL
))
559 _When_((PoolType
& PagedPool
) == 0, _IRQL_requires_max_(DISPATCH_LEVEL
))
560 _When_((PoolType
& NonPagedPoolMustSucceed
) != 0,
561 __drv_reportError("Must succeed pool allocations are forbidden. "
562 "Allocation failures cause a system crash"))
563 _When_((PoolType
& (NonPagedPoolMustSucceed
| POOL_RAISE_IF_ALLOCATION_FAILURE
)) == 0,
564 _Post_maybenull_ _Must_inspect_result_
)
565 _When_((PoolType
& (NonPagedPoolMustSucceed
| POOL_RAISE_IF_ALLOCATION_FAILURE
)) != 0,
567 _Post_writable_byte_size_(NumberOfBytes
)
571 ExAllocatePoolWithTagPriority(
572 _In_
__drv_strictTypeMatch(__drv_typeCond
) POOL_TYPE PoolType
,
573 _In_ SIZE_T NumberOfBytes
,
575 _In_
__drv_strictTypeMatch(__drv_typeExpr
) EX_POOL_PRIORITY Priority
);
577 _IRQL_requires_max_(DISPATCH_LEVEL
)
581 ExConvertExclusiveToSharedLite(
582 _Inout_
_Requires_lock_held_(*_Curr_
) PERESOURCE Resource
);
584 _IRQL_requires_max_(APC_LEVEL
)
589 _Outptr_ PCALLBACK_OBJECT
*CallbackObject
,
590 _In_ POBJECT_ATTRIBUTES ObjectAttributes
,
592 _In_ BOOLEAN AllowMultipleCallbacks
);
597 ExDeleteNPagedLookasideList(
598 _Inout_ PNPAGED_LOOKASIDE_LIST Lookaside
);
600 _IRQL_requires_max_(APC_LEVEL
)
604 ExDeletePagedLookasideList(
605 _Inout_ PPAGED_LOOKASIDE_LIST Lookaside
);
607 _IRQL_requires_max_(DISPATCH_LEVEL
)
611 ExDeleteResourceLite(
612 _Inout_ PERESOURCE Resource
);
614 _IRQL_requires_max_(DISPATCH_LEVEL
)
615 _Function_class_(FREE_FUNCTION
)
620 _Pre_notnull_
__drv_freesMem(Mem
) PVOID P
);
622 _IRQL_requires_max_(DISPATCH_LEVEL
)
627 _Pre_notnull_
__drv_freesMem(Mem
) PVOID P
,
630 _IRQL_requires_max_(DISPATCH_LEVEL
)
634 ExGetExclusiveWaiterCount(
635 _In_ PERESOURCE Resource
);
637 _IRQL_requires_max_(DISPATCH_LEVEL
)
641 ExGetPreviousMode(VOID
);
643 _IRQL_requires_max_(DISPATCH_LEVEL
)
647 ExGetSharedWaiterCount(
648 _In_ PERESOURCE Resource
);
650 _IRQL_requires_max_(DISPATCH_LEVEL
)
654 ExInitializeNPagedLookasideList(
655 _Out_ PNPAGED_LOOKASIDE_LIST Lookaside
,
656 _In_opt_ PALLOCATE_FUNCTION Allocate
,
657 _In_opt_ PFREE_FUNCTION Free
,
663 _IRQL_requires_max_(APC_LEVEL
)
667 ExInitializePagedLookasideList(
668 _Out_ PPAGED_LOOKASIDE_LIST Lookaside
,
669 _In_opt_ PALLOCATE_FUNCTION Allocate
,
670 _In_opt_ PFREE_FUNCTION Free
,
676 _IRQL_requires_max_(DISPATCH_LEVEL
)
680 ExInitializeResourceLite(
681 _Out_ PERESOURCE Resource
);
686 ExInterlockedAddLargeInteger(
687 _Inout_ PLARGE_INTEGER Addend
,
688 _In_ LARGE_INTEGER Increment
,
689 _Inout_
_Requires_lock_not_held_(*_Curr_
) PKSPIN_LOCK Lock
);
691 #if !defined(_M_IX86)
692 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
693 (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment)
695 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
696 (VOID)_InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment)
702 ExInterlockedAddUlong(
703 _Inout_ PULONG Addend
,
704 _In_ ULONG Increment
,
705 _Inout_
_Requires_lock_not_held_(*_Curr_
) PKSPIN_LOCK Lock
);
712 ExfInterlockedCompareExchange64(
713 _Inout_ _Interlocked_operand_ LONGLONG
volatile *Destination
,
714 _In_ PLONGLONG Exchange
,
715 _In_ PLONGLONG Comperand
);
717 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
718 ExfInterlockedCompareExchange64(Destination, Exchange, Comperand)
722 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
723 InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand))
725 #endif /* defined(_M_IX86) */
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
);
1193 #pragma warning(push)
1194 #pragma warning(disable:__WARNING_MEMORY_NOT_ACQUIRED)
1197 __drv_allocatesMem(Mem
)
1198 _Must_inspect_result_
1199 _IRQL_requires_max_(DISPATCH_LEVEL
)
1202 ExAllocateFromLookasideListEx(
1203 _Inout_ PLOOKASIDE_LIST_EX Lookaside
)
1207 Lookaside
->L
.TotalAllocates
+= 1;
1208 #ifdef NONAMELESSUNION
1209 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.u
.ListHead
);
1210 if (Entry
== NULL
) {
1211 Lookaside
->L
.u2
.AllocateMisses
+= 1;
1212 Entry
= (Lookaside
->L
.u4
.AllocateEx
)(Lookaside
->L
.Type
,
1217 #else /* NONAMELESSUNION */
1218 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
1219 if (Entry
== NULL
) {
1220 Lookaside
->L
.AllocateMisses
+= 1;
1221 Entry
= (Lookaside
->L
.AllocateEx
)(Lookaside
->L
.Type
,
1226 #endif /* NONAMELESSUNION */
1231 #pragma warning(pop)
1234 _IRQL_requires_max_(DISPATCH_LEVEL
)
1237 ExFreeToLookasideListEx(
1238 _Inout_ PLOOKASIDE_LIST_EX Lookaside
,
1239 _In_
__drv_freesMem(Entry
) PVOID Entry
)
1241 Lookaside
->L
.TotalFrees
+= 1;
1242 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
1243 Lookaside
->L
.FreeMisses
+= 1;
1244 (Lookaside
->L
.FreeEx
)(Entry
, Lookaside
);
1246 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
1251 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
1253 #if (NTDDI_VERSION >= NTDDI_WIN7)
1255 _IRQL_requires_max_(DISPATCH_LEVEL
)
1259 ExSetResourceOwnerPointerEx(
1260 _Inout_ PERESOURCE Resource
,
1261 _In_ PVOID OwnerPointer
,
1264 #define FLAG_OWNER_POINTER_IS_THREAD 0x1
1266 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
1268 __drv_allocatesMem(Mem
)
1269 _IRQL_requires_max_(DISPATCH_LEVEL
)
1271 _Post_writable_byte_size_(Lookaside
->L
.Size
)
1274 ExAllocateFromNPagedLookasideList(
1275 _Inout_ PNPAGED_LOOKASIDE_LIST Lookaside
)
1279 Lookaside
->L
.TotalAllocates
++;
1280 #ifdef NONAMELESSUNION
1281 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
1282 Entry
= ExInterlockedPopEntrySList(&Lookaside
->L
.u
.ListHead
,
1283 &Lookaside
->Lock__ObsoleteButDoNotDelete
);
1285 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.u
.ListHead
);
1287 if (Entry
== NULL
) {
1288 Lookaside
->L
.u2
.AllocateMisses
++;
1289 Entry
= (Lookaside
->L
.u4
.Allocate
)(Lookaside
->L
.Type
,
1293 #else /* NONAMELESSUNION */
1294 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
1295 Entry
= ExInterlockedPopEntrySList(&Lookaside
->L
.ListHead
,
1296 &Lookaside
->Lock__ObsoleteButDoNotDelete
);
1298 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
1300 if (Entry
== NULL
) {
1301 Lookaside
->L
.AllocateMisses
++;
1302 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
,
1306 #endif /* NONAMELESSUNION */
1310 _IRQL_requires_max_(DISPATCH_LEVEL
)
1313 ExFreeToNPagedLookasideList(
1314 _Inout_ PNPAGED_LOOKASIDE_LIST Lookaside
,
1315 _In_
__drv_freesMem(Mem
) PVOID Entry
)
1317 Lookaside
->L
.TotalFrees
++;
1318 #ifdef NONAMELESSUNION
1319 if (ExQueryDepthSList(&Lookaside
->L
.u
.ListHead
) >= Lookaside
->L
.Depth
) {
1320 Lookaside
->L
.u3
.FreeMisses
++;
1321 (Lookaside
->L
.u5
.Free
)(Entry
);
1323 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
1324 ExInterlockedPushEntrySList(&Lookaside
->L
.u
.ListHead
,
1325 (PSLIST_ENTRY
)Entry
,
1326 &Lookaside
->Lock__ObsoleteButDoNotDelete
);
1328 InterlockedPushEntrySList(&Lookaside
->L
.u
.ListHead
, (PSLIST_ENTRY
)Entry
);
1331 #else /* NONAMELESSUNION */
1332 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
1333 Lookaside
->L
.FreeMisses
++;
1334 (Lookaside
->L
.Free
)(Entry
);
1336 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
1337 ExInterlockedPushEntrySList(&Lookaside
->L
.ListHead
,
1338 (PSLIST_ENTRY
)Entry
,
1339 &Lookaside
->Lock__ObsoleteButDoNotDelete
);
1341 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
1344 #endif /* NONAMELESSUNION */