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 if (Zone
->FreeList
.Next
)
280 Zone
->FreeList
.Next
= Zone
->FreeList
.Next
->Next
;
281 return (PVOID
) Zone
->FreeList
.Next
;
284 static __inline PVOID
286 IN PZONE_HEADER Zone
,
289 ((PSINGLE_LIST_ENTRY
) Block
)->Next
= Zone
->FreeList
.Next
;
290 Zone
->FreeList
.Next
= ((PSINGLE_LIST_ENTRY
) Block
);
291 return ((PSINGLE_LIST_ENTRY
) Block
)->Next
;
296 * ExInterlockedAllocateFromZone(
297 * IN PZONE_HEADER Zone,
298 * IN PKSPIN_LOCK Lock)
300 #define ExInterlockedAllocateFromZone(Zone, Lock) \
301 ((PVOID) ExInterlockedPopEntryList(&Zone->FreeList, Lock))
304 * ExInterlockedFreeToZone(
305 * IN PZONE_HEADER Zone,
307 * IN PKSPIN_LOCK Lock);
309 #define ExInterlockedFreeToZone(Zone, Block, Lock) \
310 ExInterlockedPushEntryList(&(Zone)->FreeList, (PSINGLE_LIST_ENTRY)(Block), Lock)
315 * IN PZONE_HEADER Zone)
317 #define ExIsFullZone(Zone) \
318 ((Zone)->FreeList.Next == (PSINGLE_LIST_ENTRY) NULL)
321 * ExIsObjectInFirstZoneSegment(
322 * IN PZONE_HEADER Zone,
325 #define ExIsObjectInFirstZoneSegment(Zone,Object) \
326 ((BOOLEAN)( ((PUCHAR)(Object) >= (PUCHAR)(Zone)->SegmentList.Next) && \
327 ((PUCHAR)(Object) < (PUCHAR)(Zone)->SegmentList.Next + \
328 (Zone)->TotalSegmentSize)) )
330 #define ExAcquireResourceExclusive ExAcquireResourceExclusiveLite
331 #define ExAcquireResourceShared ExAcquireResourceSharedLite
332 #define ExConvertExclusiveToShared ExConvertExclusiveToSharedLite
333 #define ExDeleteResource ExDeleteResourceLite
334 #define ExInitializeResource ExInitializeResourceLite
335 #define ExIsResourceAcquiredExclusive ExIsResourceAcquiredExclusiveLite
336 #define ExIsResourceAcquiredShared ExIsResourceAcquiredSharedLite
337 #define ExIsResourceAcquired ExIsResourceAcquiredSharedLite
338 #define ExReleaseResourceForThread ExReleaseResourceForThreadLite
341 #define RESULT_ZERO 0
342 #define RESULT_NEGATIVE 1
343 #define RESULT_POSITIVE 2
346 typedef enum _INTERLOCKED_RESULT
{
347 ResultNegative
= RESULT_NEGATIVE
,
348 ResultZero
= RESULT_ZERO
,
349 ResultPositive
= RESULT_POSITIVE
350 } INTERLOCKED_RESULT
;
357 Exfi386InterlockedIncrementLong(
358 _Inout_ _Interlocked_operand_ LONG
volatile *Addend
);
363 Exfi386InterlockedDecrementLong(
364 _Inout_ _Interlocked_operand_ PLONG Addend
);
369 Exfi386InterlockedExchangeUlong(
370 _Inout_ _Interlocked_operand_ PULONG Target
,
378 #define ExDisableResourceBoost ExDisableResourceBoostLite
381 ExInitializePushLock(
382 _Out_ PEX_PUSH_LOCK PushLock
);
385 #if (NTDDI_VERSION >= NTDDI_WIN2K)
387 _IRQL_requires_max_(APC_LEVEL
)
388 _Requires_lock_held_(_Global_critical_region_
)
392 ExAcquireFastMutexUnsafe(
393 _Inout_
_Requires_lock_not_held_(*_Curr_
) _Acquires_lock_(*_Curr_
)
394 PFAST_MUTEX FastMutex
);
396 _IRQL_requires_max_(APC_LEVEL
)
397 _Requires_lock_held_(_Global_critical_region_
)
401 ExReleaseFastMutexUnsafe(
402 _Inout_
_Requires_lock_held_(*_Curr_
) _Releases_lock_(*_Curr_
)
403 PFAST_MUTEX FastMutex
);
405 _Requires_lock_held_(_Global_critical_region_
)
406 _Requires_lock_not_held_(*Resource
)
407 _When_(Wait
!=0, _Acquires_exclusive_lock_(*Resource
))
408 _IRQL_requires_max_(APC_LEVEL
)
409 _When_(Wait
!=0, _Post_satisfies_(return == 1))
410 _When_(Wait
==0, _Post_satisfies_(return == 0 || return == 1) _Must_inspect_result_
)
414 ExAcquireResourceExclusiveLite(
415 _Inout_ PERESOURCE Resource
,
416 _In_ _Literal_ BOOLEAN Wait
);
418 _IRQL_requires_max_(APC_LEVEL
)
419 _Requires_lock_held_(_Global_critical_region_
)
420 _When_(Wait
!=0, _Post_satisfies_(return == 1))
421 _When_(Wait
==0, _Post_satisfies_(return == 0 || return == 1) _Must_inspect_result_
)
425 ExAcquireResourceSharedLite(
426 _Inout_
_Requires_lock_not_held_(*_Curr_
)
427 _When_(return!=0, _Acquires_shared_lock_(*_Curr_
))
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 ExAcquireSharedStarveExclusive(
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 ExAcquireSharedWaitForExclusive(
452 _Inout_
_Requires_lock_not_held_(*_Curr_
)
453 _When_(return!=0, _Acquires_lock_(*_Curr_
))
457 __drv_preferredFunction("ExAllocatePoolWithTag",
458 "No tag interferes with debugging.")
459 __drv_allocatesMem(Mem
)
460 _When_((PoolType
& PagedPool
) != 0, _IRQL_requires_max_(APC_LEVEL
))
461 _When_((PoolType
& PagedPool
) == 0, _IRQL_requires_max_(DISPATCH_LEVEL
))
462 _When_((PoolType
& NonPagedPoolMustSucceed
) != 0,
463 __drv_reportError("Must succeed pool allocations are forbidden. "
464 "Allocation failures cause a system crash"))
465 _When_((PoolType
& (NonPagedPoolMustSucceed
|
466 POOL_RAISE_IF_ALLOCATION_FAILURE
)) == 0,
467 _Post_maybenull_ _Must_inspect_result_
)
468 _When_((PoolType
& (NonPagedPoolMustSucceed
|
469 POOL_RAISE_IF_ALLOCATION_FAILURE
)) != 0,
471 _Post_writable_byte_size_(NumberOfBytes
)
476 __drv_strictTypeMatch(__drv_typeExpr
) _In_ POOL_TYPE PoolType
,
477 _In_ SIZE_T NumberOfBytes
);
479 __drv_preferredFunction("ExAllocatePoolWithQuotaTag",
480 "No tag interferes with debugging.")
481 __drv_allocatesMem(Mem
)
482 _When_((PoolType
& PagedPool
) != 0, _IRQL_requires_max_(APC_LEVEL
))
483 _When_((PoolType
& PagedPool
) == 0, _IRQL_requires_max_(DISPATCH_LEVEL
))
484 _When_((PoolType
& NonPagedPoolMustSucceed
) != 0,
485 __drv_reportError("Must succeed pool allocations are forbidden. "
486 "Allocation failures cause a system crash"))
487 _When_((PoolType
& POOL_QUOTA_FAIL_INSTEAD_OF_RAISE
) != 0,
488 _Post_maybenull_ _Must_inspect_result_
)
489 _When_((PoolType
& POOL_QUOTA_FAIL_INSTEAD_OF_RAISE
) == 0, _Post_notnull_
)
490 _Post_writable_byte_size_(NumberOfBytes
)
494 ExAllocatePoolWithQuota(
495 __drv_strictTypeMatch(__drv_typeExpr
) _In_ POOL_TYPE PoolType
,
496 _In_ SIZE_T NumberOfBytes
);
498 __drv_allocatesMem(Mem
)
499 _When_((PoolType
& PagedPool
) != 0, _IRQL_requires_max_(APC_LEVEL
))
500 _When_((PoolType
& PagedPool
) == 0, _IRQL_requires_max_(DISPATCH_LEVEL
))
501 _When_((PoolType
& NonPagedPoolMustSucceed
) != 0,
502 __drv_reportError("Must succeed pool allocations are forbidden. "
503 "Allocation failures cause a system crash"))
504 _When_((PoolType
& POOL_QUOTA_FAIL_INSTEAD_OF_RAISE
) != 0,
505 _Post_maybenull_ _Must_inspect_result_
)
506 _When_((PoolType
& POOL_QUOTA_FAIL_INSTEAD_OF_RAISE
) == 0, _Post_notnull_
)
507 _Post_writable_byte_size_(NumberOfBytes
)
511 ExAllocatePoolWithQuotaTag(
512 _In_
__drv_strictTypeMatch(__drv_typeExpr
) POOL_TYPE PoolType
,
513 _In_ SIZE_T NumberOfBytes
,
517 #define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b)
520 __drv_allocatesMem(Mem
)
521 _When_((PoolType
& PagedPool
) != 0, _IRQL_requires_max_(APC_LEVEL
))
522 _When_((PoolType
& PagedPool
) == 0, _IRQL_requires_max_(DISPATCH_LEVEL
))
523 _When_((PoolType
& NonPagedPoolMustSucceed
) != 0,
524 __drv_reportError("Must succeed pool allocations are forbidden. "
525 "Allocation failures cause a system crash"))
526 _When_((PoolType
& (NonPagedPoolMustSucceed
| POOL_RAISE_IF_ALLOCATION_FAILURE
)) == 0,
527 _Post_maybenull_ _Must_inspect_result_
)
528 _When_((PoolType
& (NonPagedPoolMustSucceed
| POOL_RAISE_IF_ALLOCATION_FAILURE
)) != 0,
530 _Post_writable_byte_size_(NumberOfBytes
)
534 ExAllocatePoolWithTag(
535 _In_
__drv_strictTypeMatch(__drv_typeExpr
) POOL_TYPE PoolType
,
536 _In_ SIZE_T NumberOfBytes
,
540 #define ExAllocatePoolWithTag(a,b,c) ExAllocatePool(a,b)
543 __drv_allocatesMem(Mem
)
544 _When_((PoolType
& PagedPool
) != 0, _IRQL_requires_max_(APC_LEVEL
))
545 _When_((PoolType
& PagedPool
) == 0, _IRQL_requires_max_(DISPATCH_LEVEL
))
546 _When_((PoolType
& NonPagedPoolMustSucceed
) != 0,
547 __drv_reportError("Must succeed pool allocations are forbidden. "
548 "Allocation failures cause a system crash"))
549 _When_((PoolType
& (NonPagedPoolMustSucceed
| POOL_RAISE_IF_ALLOCATION_FAILURE
)) == 0,
550 _Post_maybenull_ _Must_inspect_result_
)
551 _When_((PoolType
& (NonPagedPoolMustSucceed
| POOL_RAISE_IF_ALLOCATION_FAILURE
)) != 0,
553 _Post_writable_byte_size_(NumberOfBytes
)
557 ExAllocatePoolWithTagPriority(
558 _In_
__drv_strictTypeMatch(__drv_typeCond
) POOL_TYPE PoolType
,
559 _In_ SIZE_T NumberOfBytes
,
561 _In_
__drv_strictTypeMatch(__drv_typeExpr
) EX_POOL_PRIORITY Priority
);
563 _IRQL_requires_max_(DISPATCH_LEVEL
)
567 ExConvertExclusiveToSharedLite(
568 _Inout_
_Requires_lock_held_(*_Curr_
) PERESOURCE Resource
);
570 _IRQL_requires_max_(APC_LEVEL
)
575 _Outptr_ PCALLBACK_OBJECT
*CallbackObject
,
576 _In_ POBJECT_ATTRIBUTES ObjectAttributes
,
578 _In_ BOOLEAN AllowMultipleCallbacks
);
583 ExDeleteNPagedLookasideList(
584 _Inout_ PNPAGED_LOOKASIDE_LIST Lookaside
);
586 _IRQL_requires_max_(APC_LEVEL
)
590 ExDeletePagedLookasideList(
591 _Inout_ PPAGED_LOOKASIDE_LIST Lookaside
);
593 _IRQL_requires_max_(DISPATCH_LEVEL
)
597 ExDeleteResourceLite(
598 _Inout_ PERESOURCE Resource
);
600 _IRQL_requires_max_(DISPATCH_LEVEL
)
605 _In_
__drv_freesMem(Mem
) PVOID P
);
607 _IRQL_requires_max_(DISPATCH_LEVEL
)
612 _In_
__drv_freesMem(Mem
) PVOID P
,
615 _IRQL_requires_max_(DISPATCH_LEVEL
)
619 ExGetExclusiveWaiterCount(
620 _In_ PERESOURCE Resource
);
622 _IRQL_requires_max_(DISPATCH_LEVEL
)
626 ExGetPreviousMode(VOID
);
628 _IRQL_requires_max_(DISPATCH_LEVEL
)
632 ExGetSharedWaiterCount(
633 _In_ PERESOURCE Resource
);
635 _IRQL_requires_max_(DISPATCH_LEVEL
)
639 ExInitializeNPagedLookasideList(
640 _Out_ PNPAGED_LOOKASIDE_LIST Lookaside
,
641 _In_opt_ PALLOCATE_FUNCTION Allocate
,
642 _In_opt_ PFREE_FUNCTION Free
,
648 _IRQL_requires_max_(APC_LEVEL
)
652 ExInitializePagedLookasideList(
653 _Out_ PPAGED_LOOKASIDE_LIST Lookaside
,
654 _In_opt_ PALLOCATE_FUNCTION Allocate
,
655 _In_opt_ PFREE_FUNCTION Free
,
661 _IRQL_requires_max_(DISPATCH_LEVEL
)
665 ExInitializeResourceLite(
666 _Out_ PERESOURCE Resource
);
671 ExInterlockedAddLargeInteger(
672 _Inout_ PLARGE_INTEGER Addend
,
673 _In_ LARGE_INTEGER Increment
,
674 _Inout_
_Requires_lock_not_held_(*_Curr_
) PKSPIN_LOCK Lock
);
677 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
678 (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment)
680 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
681 _InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment)
687 ExInterlockedAddUlong(
688 _Inout_ PULONG Addend
,
689 _In_ ULONG Increment
,
690 _Inout_
_Requires_lock_not_held_(*_Curr_
) PKSPIN_LOCK Lock
);
692 #if defined(_AMD64_) || defined(_IA64_)
694 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
695 InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand))
702 ExfInterlockedCompareExchange64(
703 _Inout_ _Interlocked_operand_ LONGLONG
volatile *Destination
,
704 _In_ PLONGLONG Exchange
,
705 _In_ PLONGLONG Comperand
);
707 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
708 ExfInterlockedCompareExchange64(Destination, Exchange, Comperand)
715 ExInterlockedCompareExchange64(
716 IN OUT LONGLONG
volatile *Destination
,
717 IN PLONGLONG Exchange
,
718 IN PLONGLONG Comparand
,
719 IN PKSPIN_LOCK Lock
);
721 #endif /* defined(_AMD64_) || defined(_IA64_) */
726 ExInterlockedInsertHeadList(
727 _Inout_ PLIST_ENTRY ListHead
,
728 _Inout_ __drv_aliasesMem PLIST_ENTRY ListEntry
,
729 _Inout_
_Requires_lock_not_held_(*_Curr_
) PKSPIN_LOCK Lock
);
734 ExInterlockedInsertTailList(
735 _Inout_ PLIST_ENTRY ListHead
,
736 _Inout_ __drv_aliasesMem PLIST_ENTRY ListEntry
,
737 _Inout_
_Requires_lock_not_held_(*_Curr_
) PKSPIN_LOCK Lock
);
742 ExInterlockedPopEntryList(
743 _Inout_ PSINGLE_LIST_ENTRY ListHead
,
744 _Inout_
_Requires_lock_not_held_(*_Curr_
) PKSPIN_LOCK Lock
);
749 ExInterlockedPushEntryList(
750 _Inout_ PSINGLE_LIST_ENTRY ListHead
,
751 _Inout_ __drv_aliasesMem PSINGLE_LIST_ENTRY ListEntry
,
752 _Inout_
_Requires_lock_not_held_(*_Curr_
) PKSPIN_LOCK Lock
);
757 ExInterlockedRemoveHeadList(
758 _Inout_ PLIST_ENTRY ListHead
,
759 _Inout_
_Requires_lock_not_held_(*_Curr_
) PKSPIN_LOCK Lock
);
761 _IRQL_requires_max_(PASSIVE_LEVEL
)
765 ExIsProcessorFeaturePresent(
766 _In_ ULONG ProcessorFeature
);
768 _IRQL_requires_max_(DISPATCH_LEVEL
)
772 ExIsResourceAcquiredExclusiveLite(
773 _In_ PERESOURCE Resource
);
775 _IRQL_requires_max_(DISPATCH_LEVEL
)
779 ExIsResourceAcquiredSharedLite(
780 _In_ PERESOURCE Resource
);
782 #define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite
787 ExLocalTimeToSystemTime(
788 _In_ PLARGE_INTEGER LocalTime
,
789 _Out_ PLARGE_INTEGER SystemTime
);
791 _IRQL_requires_max_(DISPATCH_LEVEL
)
796 _In_ PCALLBACK_OBJECT CallbackObject
,
797 _In_opt_ PVOID Argument1
,
798 _In_opt_ PVOID Argument2
);
800 _IRQL_requires_max_(DISPATCH_LEVEL
)
805 _Inout_ __drv_aliasesMem PWORK_QUEUE_ITEM WorkItem
,
806 __drv_strictTypeMatch(__drv_typeExpr
) _In_ WORK_QUEUE_TYPE QueueType
);
808 _IRQL_requires_max_(APC_LEVEL
)
814 _In_ NTSTATUS Status
);
816 _IRQL_requires_max_(APC_LEVEL
)
821 _Inout_ PCALLBACK_OBJECT CallbackObject
,
822 _In_ PCALLBACK_FUNCTION CallbackFunction
,
823 _In_opt_ PVOID CallbackContext
);
825 _IRQL_requires_max_(DISPATCH_LEVEL
)
829 ExReinitializeResourceLite(
830 _Inout_ PERESOURCE Resource
);
832 _IRQL_requires_max_(DISPATCH_LEVEL
)
833 _Requires_lock_held_(_Global_critical_region_
)
837 ExReleaseResourceForThreadLite(
838 _Inout_
_Requires_lock_held_(*_Curr_
) _Releases_lock_(*_Curr_
)
840 _In_ ERESOURCE_THREAD ResourceThreadId
);
842 _Requires_lock_held_(_Global_critical_region_
)
843 _Requires_lock_held_(*Resource
)
844 _Releases_lock_(*Resource
)
845 _IRQL_requires_max_(DISPATCH_LEVEL
)
849 ExReleaseResourceLite(
850 _Inout_ PERESOURCE Resource
);
852 _IRQL_requires_max_(DISPATCH_LEVEL
)
856 ExSetResourceOwnerPointer(
857 _Inout_ PERESOURCE Resource
,
858 _In_ PVOID OwnerPointer
);
860 _IRQL_requires_max_(APC_LEVEL
)
864 ExSetTimerResolution(
865 _In_ ULONG DesiredTime
,
866 _In_ BOOLEAN SetResolution
);
871 ExSystemTimeToLocalTime(
872 _In_ PLARGE_INTEGER SystemTime
,
873 _Out_ PLARGE_INTEGER LocalTime
);
875 _IRQL_requires_max_(APC_LEVEL
)
879 ExUnregisterCallback(
880 _Inout_ PVOID CbRegistration
);
888 _Inout_ PZONE_HEADER Zone
,
889 _Inout_ PVOID Segment
,
890 _In_ ULONG SegmentSize
);
896 _Out_ PZONE_HEADER Zone
,
897 _In_ ULONG BlockSize
,
898 _Inout_ PVOID InitialSegment
,
899 _In_ ULONG InitialSegmentSize
);
901 _IRQL_requires_max_(DISPATCH_LEVEL
)
905 ExInterlockedExtendZone(
906 _Inout_ PZONE_HEADER Zone
,
907 _Inout_ PVOID Segment
,
908 _In_ ULONG SegmentSize
,
909 _Inout_
_Requires_lock_not_held_(*_Curr_
) PKSPIN_LOCK Lock
);
911 _IRQL_requires_max_(PASSIVE_LEVEL
)
918 _IRQL_requires_max_(PASSIVE_LEVEL
)
923 ExRaiseAccessViolation(VOID
);
925 _IRQL_requires_max_(PASSIVE_LEVEL
)
930 ExRaiseDatatypeMisalignment(VOID
);
935 _IRQL_requires_max_(DISPATCH_LEVEL
)
939 ExQueryPoolBlockSize(
940 _In_ PVOID PoolBlock
,
941 _Out_ PBOOLEAN QuotaCharged
);
943 _IRQL_requires_max_(DISPATCH_LEVEL
)
945 ExAdjustLookasideDepth(VOID
);
947 _IRQL_requires_max_(DISPATCH_LEVEL
)
951 ExDisableResourceBoostLite(
952 _In_ PERESOURCE Resource
);
954 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
956 $
if (_WDMDDK_
|| _NTIFS_
)
957 #if (NTDDI_VERSION >= NTDDI_WINXP)
958 $
endif (_WDMDDK_
|| _NTIFS_
)
961 _Must_inspect_result_
962 _Post_satisfies_(return == 0 || return == 1)
966 ExAcquireRundownProtection(
967 _Inout_ PEX_RUNDOWN_REF RunRef
);
972 ExInitializeRundownProtection(
973 _Out_ PEX_RUNDOWN_REF RunRef
);
978 ExReInitializeRundownProtection(
979 _Inout_ PEX_RUNDOWN_REF RunRef
);
984 ExReleaseRundownProtection(
985 _Inout_ PEX_RUNDOWN_REF RunRef
);
991 _Out_ PEX_RUNDOWN_REF RunRef
);
997 __drv_strictTypeMatch(__drv_typeExpr
) _In_ SUITE_TYPE SuiteType
);
1002 ExWaitForRundownProtectionRelease(
1003 _Inout_ PEX_RUNDOWN_REF RunRef
);
1009 InterlockedPushListSList(
1010 _Inout_ PSLIST_HEADER ListHead
,
1011 _Inout_ __drv_aliasesMem PSLIST_ENTRY List
,
1012 _Inout_ PSLIST_ENTRY ListEnd
,
1015 $
if (_WDMDDK_
|| _NTIFS_
)
1016 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
1017 $
endif (_WDMDDK_
|| _NTIFS_
)
1020 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
1022 _Must_inspect_result_
1023 _Post_satisfies_(return == 0 || return == 1)
1027 ExAcquireRundownProtectionEx(
1028 _Inout_ PEX_RUNDOWN_REF RunRef
,
1034 ExReleaseRundownProtectionEx(
1035 _Inout_ PEX_RUNDOWN_REF RunRef
,
1038 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) */
1040 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
1042 _Must_inspect_result_
1043 _IRQL_requires_max_(APC_LEVEL
)
1045 PEX_RUNDOWN_REF_CACHE_AWARE
1047 ExAllocateCacheAwareRundownProtection(
1048 __drv_strictTypeMatch(__drv_typeExpr
) _In_ POOL_TYPE PoolType
,
1049 _In_ ULONG PoolTag
);
1051 _IRQL_requires_max_(APC_LEVEL
)
1055 ExSizeOfRundownProtectionCacheAware(VOID
);
1057 _IRQL_requires_max_(APC_LEVEL
)
1058 _Acquires_lock_(_Global_critical_region_
)
1062 ExEnterCriticalRegionAndAcquireResourceShared(
1063 _Inout_
_Requires_lock_not_held_(*_Curr_
) _Acquires_shared_lock_(*_Curr_
)
1064 PERESOURCE Resource
);
1066 _IRQL_requires_max_(APC_LEVEL
)
1067 _Acquires_lock_(_Global_critical_region_
)
1071 ExEnterCriticalRegionAndAcquireResourceExclusive(
1072 _Inout_
_Requires_lock_not_held_(*_Curr_
) _Acquires_exclusive_lock_(*_Curr_
)
1073 PERESOURCE Resource
);
1075 _IRQL_requires_max_(APC_LEVEL
)
1076 _Acquires_lock_(_Global_critical_region_
)
1080 ExEnterCriticalRegionAndAcquireSharedWaitForExclusive(
1081 _Inout_
_Requires_lock_not_held_(*_Curr_
) _Acquires_lock_(*_Curr_
)
1082 PERESOURCE Resource
);
1084 _IRQL_requires_max_(DISPATCH_LEVEL
)
1085 _Releases_lock_(_Global_critical_region_
)
1089 ExReleaseResourceAndLeaveCriticalRegion(
1090 _Inout_
_Requires_lock_held_(*_Curr_
) _Releases_lock_(*_Curr_
)
1091 PERESOURCE Resource
);
1093 _IRQL_requires_max_(APC_LEVEL
)
1097 ExInitializeRundownProtectionCacheAware(
1098 _Out_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware
,
1099 _In_ SIZE_T RunRefSize
);
1101 _IRQL_requires_max_(APC_LEVEL
)
1105 ExFreeCacheAwareRundownProtection(
1106 _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware
);
1108 _Must_inspect_result_
1109 _Post_satisfies_(return == 0 || return == 1)
1113 ExAcquireRundownProtectionCacheAware(
1114 _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware
);
1119 ExReleaseRundownProtectionCacheAware(
1120 _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware
);
1122 _Must_inspect_result_
1123 _Post_satisfies_(return == 0 || return == 1)
1127 ExAcquireRundownProtectionCacheAwareEx(
1128 _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware
,
1134 ExReleaseRundownProtectionCacheAwareEx(
1135 _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRef
,
1141 ExWaitForRundownProtectionReleaseCacheAware(
1142 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRef
);
1147 ExReInitializeRundownProtectionCacheAware(
1148 _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware
);
1153 ExRundownCompletedCacheAware(
1154 _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware
);
1156 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
1158 #if (NTDDI_VERSION >= NTDDI_VISTA)
1160 _IRQL_requires_max_(DISPATCH_LEVEL
)
1164 ExInitializeLookasideListEx(
1165 _Out_ PLOOKASIDE_LIST_EX Lookaside
,
1166 _In_opt_ PALLOCATE_FUNCTION_EX Allocate
,
1167 _In_opt_ PFREE_FUNCTION_EX Free
,
1168 _In_ POOL_TYPE PoolType
,
1174 _IRQL_requires_max_(DISPATCH_LEVEL
)
1178 ExDeleteLookasideListEx(
1179 _Inout_ PLOOKASIDE_LIST_EX Lookaside
);
1181 _IRQL_requires_max_(DISPATCH_LEVEL
)
1185 ExFlushLookasideListEx(
1186 _Inout_ PLOOKASIDE_LIST_EX Lookaside
);
1188 _Must_inspect_result_
1189 _IRQL_requires_max_(DISPATCH_LEVEL
)
1192 ExAllocateFromLookasideListEx(
1193 _Inout_ PLOOKASIDE_LIST_EX Lookaside
)
1197 Lookaside
->L
.TotalAllocates
+= 1;
1198 #ifdef NONAMELESSUNION
1199 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.u
.ListHead
);
1200 if (Entry
== NULL
) {
1201 Lookaside
->L
.u2
.AllocateMisses
+= 1;
1202 Entry
= (Lookaside
->L
.u4
.AllocateEx
)(Lookaside
->L
.Type
,
1207 #else /* NONAMELESSUNION */
1208 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
1209 if (Entry
== NULL
) {
1210 Lookaside
->L
.AllocateMisses
+= 1;
1211 Entry
= (Lookaside
->L
.AllocateEx
)(Lookaside
->L
.Type
,
1216 #endif /* NONAMELESSUNION */
1220 _IRQL_requires_max_(DISPATCH_LEVEL
)
1223 ExFreeToLookasideListEx(
1224 _Inout_ PLOOKASIDE_LIST_EX Lookaside
,
1227 Lookaside
->L
.TotalFrees
+= 1;
1228 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
1229 Lookaside
->L
.FreeMisses
+= 1;
1230 (Lookaside
->L
.FreeEx
)(Entry
, Lookaside
);
1232 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
1237 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
1239 #if (NTDDI_VERSION >= NTDDI_WIN7)
1241 _IRQL_requires_max_(DISPATCH_LEVEL
)
1245 ExSetResourceOwnerPointerEx(
1246 _Inout_ PERESOURCE Resource
,
1247 _In_ PVOID OwnerPointer
,
1250 #define FLAG_OWNER_POINTER_IS_THREAD 0x1
1252 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
1254 _IRQL_requires_max_(DISPATCH_LEVEL
)
1255 static __inline PVOID
1256 ExAllocateFromNPagedLookasideList(
1257 _Inout_ PNPAGED_LOOKASIDE_LIST Lookaside
)
1261 Lookaside
->L
.TotalAllocates
++;
1262 #ifdef NONAMELESSUNION
1263 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
1264 Entry
= ExInterlockedPopEntrySList(&Lookaside
->L
.u
.ListHead
,
1265 &Lookaside
->Lock__ObsoleteButDoNotDelete
);
1267 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.u
.ListHead
);
1269 if (Entry
== NULL
) {
1270 Lookaside
->L
.u2
.AllocateMisses
++;
1271 Entry
= (Lookaside
->L
.u4
.Allocate
)(Lookaside
->L
.Type
,
1275 #else /* NONAMELESSUNION */
1276 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
1277 Entry
= ExInterlockedPopEntrySList(&Lookaside
->L
.ListHead
,
1278 &Lookaside
->Lock__ObsoleteButDoNotDelete
);
1280 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
1282 if (Entry
== NULL
) {
1283 Lookaside
->L
.AllocateMisses
++;
1284 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
,
1288 #endif /* NONAMELESSUNION */
1292 _IRQL_requires_max_(DISPATCH_LEVEL
)
1293 static __inline VOID
1294 ExFreeToNPagedLookasideList(
1295 _Inout_ PNPAGED_LOOKASIDE_LIST Lookaside
,
1298 Lookaside
->L
.TotalFrees
++;
1299 #ifdef NONAMELESSUNION
1300 if (ExQueryDepthSList(&Lookaside
->L
.u
.ListHead
) >= Lookaside
->L
.Depth
) {
1301 Lookaside
->L
.u3
.FreeMisses
++;
1302 (Lookaside
->L
.u5
.Free
)(Entry
);
1304 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
1305 ExInterlockedPushEntrySList(&Lookaside
->L
.u
.ListHead
,
1306 (PSLIST_ENTRY
)Entry
,
1307 &Lookaside
->Lock__ObsoleteButDoNotDelete
);
1309 InterlockedPushEntrySList(&Lookaside
->L
.u
.ListHead
, (PSLIST_ENTRY
)Entry
);
1312 #else /* NONAMELESSUNION */
1313 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
1314 Lookaside
->L
.FreeMisses
++;
1315 (Lookaside
->L
.Free
)(Entry
);
1317 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
1318 ExInterlockedPushEntrySList(&Lookaside
->L
.ListHead
,
1319 (PSLIST_ENTRY
)Entry
,
1320 &Lookaside
->Lock__ObsoleteButDoNotDelete
);
1322 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
1325 #endif /* NONAMELESSUNION */