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)
49 IN OUT PFAST_MUTEX FastMutex
);
55 IN OUT PFAST_MUTEX FastMutex
);
60 ExTryToAcquireFastMutex(
61 IN OUT PFAST_MUTEX FastMutex
);
63 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
65 #endif /* defined(_NTHAL_) && defined(_X86_) */
68 #define ExInterlockedAddUlong ExfInterlockedAddUlong
69 #define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList
70 #define ExInterlockedInsertTailList ExfInterlockedInsertTailList
71 #define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList
72 #define ExInterlockedPopEntryList ExfInterlockedPopEntryList
73 #define ExInterlockedPushEntryList ExfInterlockedPushEntryList
74 #endif /* defined(_X86_) */
78 #if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || \
79 defined(_NTHAL_) || defined(_NTOSP_)
82 ExQueryDepthSList(IN PSLIST_HEADER ListHead
);
86 ExQueryDepthSList(IN PSLIST_HEADER ListHead
)
88 return (USHORT
)(ListHead
->Alignment
& 0xffff);
94 ExpInterlockedFlushSList(
95 PSLIST_HEADER ListHead
);
99 ExpInterlockedPopEntrySList(
100 PSLIST_HEADER ListHead
);
104 ExpInterlockedPushEntrySList(
105 PSLIST_HEADER ListHead
,
106 PSLIST_ENTRY ListEntry
);
108 #define ExInterlockedFlushSList(Head) \
109 ExpInterlockedFlushSList(Head)
110 #define ExInterlockedPopEntrySList(Head, Lock) \
111 ExpInterlockedPopEntrySList(Head)
112 #define ExInterlockedPushEntrySList(Head, Entry, Lock) \
113 ExpInterlockedPushEntrySList(Head, Entry)
115 #else /* !defined(_WIN64) */
117 #define ExQueryDepthSList(listhead) (listhead)->Depth
122 ExInterlockedFlushSList(
123 IN OUT PSLIST_HEADER ListHead
);
125 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
130 ExInterlockedPopEntrySList(
131 IN PSLIST_HEADER ListHead
,
132 IN PKSPIN_LOCK Lock
);
137 ExInterlockedPushEntrySList(
138 IN PSLIST_HEADER ListHead
,
139 IN PSINGLE_LIST_ENTRY ListEntry
,
140 IN PKSPIN_LOCK Lock
);
145 ExAllocateFromPagedLookasideList(
146 IN OUT PPAGED_LOOKASIDE_LIST Lookaside
);
151 ExFreeToPagedLookasideList(
152 IN OUT PPAGED_LOOKASIDE_LIST Lookaside
,
157 #define ExInterlockedPopEntrySList(_ListHead, _Lock) \
158 InterlockedPopEntrySList(_ListHead)
159 #define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \
160 InterlockedPushEntrySList(_ListHead, _ListEntry)
164 ExAllocateFromPagedLookasideList(
165 IN OUT PPAGED_LOOKASIDE_LIST Lookaside
)
169 Lookaside
->L
.TotalAllocates
++;
170 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
172 Lookaside
->L
.AllocateMisses
++;
173 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
,
182 ExFreeToPagedLookasideList(
183 IN OUT PPAGED_LOOKASIDE_LIST Lookaside
,
186 Lookaside
->L
.TotalFrees
++;
187 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
188 Lookaside
->L
.FreeMisses
++;
189 (Lookaside
->L
.Free
)(Entry
);
191 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
195 #endif /* _WIN2K_COMPAT_SLIST_USAGE */
197 #endif /* !defined(_WIN64) */
200 * ExGetCurrentResourceThread(
203 #define ExGetCurrentResourceThread() ((ERESOURCE_THREAD)PsGetCurrentThread())
205 #define ExReleaseResource(R) (ExReleaseResourceLite(R))
208 * ExInitializeWorkItem(
209 * IN PWORK_QUEUE_ITEM Item,
210 * IN PWORKER_THREAD_ROUTINE Routine,
213 #define ExInitializeWorkItem(Item, Routine, Context) \
215 (Item)->WorkerRoutine = Routine; \
216 (Item)->Parameter = Context; \
217 (Item)->List.Flink = NULL; \
222 ExInitializeFastMutex(
223 OUT PFAST_MUTEX FastMutex
)
225 FastMutex
->Count
= FM_LOCK_BIT
;
226 FastMutex
->Owner
= NULL
;
227 FastMutex
->Contention
= 0;
228 KeInitializeEvent(&FastMutex
->Event
, SynchronizationEvent
, FALSE
);
232 #if (NTDDI_VERSION >= NTDDI_WIN2K)
237 ExAcquireFastMutexUnsafe(
238 IN OUT PFAST_MUTEX FastMutex
);
243 ExReleaseFastMutexUnsafe(
244 IN OUT PFAST_MUTEX FastMutex
);
249 ExAcquireResourceExclusiveLite(
250 IN PERESOURCE Resource
,
256 ExAcquireResourceSharedLite(
257 IN OUT PERESOURCE Resource
,
263 ExAcquireSharedStarveExclusive(
264 IN PERESOURCE Resource
,
270 ExAcquireSharedWaitForExclusive(
271 IN PERESOURCE Resource
,
278 IN POOL_TYPE PoolType
,
279 IN SIZE_T NumberOfBytes
);
284 ExAllocatePoolWithQuota(
285 IN POOL_TYPE PoolType
,
286 IN SIZE_T NumberOfBytes
);
291 ExAllocatePoolWithQuotaTag(
292 IN POOL_TYPE PoolType
,
293 IN SIZE_T NumberOfBytes
,
297 #define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b)
303 ExAllocatePoolWithTag(
304 IN POOL_TYPE PoolType
,
305 IN SIZE_T NumberOfBytes
,
309 #define ExAllocatePoolWithTag(a,b,c) ExAllocatePool(a,b)
315 ExAllocatePoolWithTagPriority(
316 IN POOL_TYPE PoolType
,
317 IN SIZE_T NumberOfBytes
,
319 IN EX_POOL_PRIORITY Priority
);
324 ExConvertExclusiveToSharedLite(
325 IN PERESOURCE Resource
);
331 OUT PCALLBACK_OBJECT
*CallbackObject
,
332 IN POBJECT_ATTRIBUTES ObjectAttributes
,
334 IN BOOLEAN AllowMultipleCallbacks
);
339 ExDeleteNPagedLookasideList(
340 IN OUT PNPAGED_LOOKASIDE_LIST Lookaside
);
345 ExDeletePagedLookasideList(
346 IN PPAGED_LOOKASIDE_LIST Lookaside
);
351 ExDeleteResourceLite(
352 IN PERESOURCE Resource
);
370 ExGetExclusiveWaiterCount(
371 IN PERESOURCE Resource
);
376 ExGetPreviousMode(VOID
);
381 ExGetSharedWaiterCount(
382 IN PERESOURCE Resource
);
387 ExInitializeNPagedLookasideList(
388 IN PNPAGED_LOOKASIDE_LIST Lookaside
,
389 IN PALLOCATE_FUNCTION Allocate OPTIONAL
,
390 IN PFREE_FUNCTION Free OPTIONAL
,
399 ExInitializePagedLookasideList(
400 IN PPAGED_LOOKASIDE_LIST Lookaside
,
401 IN PALLOCATE_FUNCTION Allocate OPTIONAL
,
402 IN PFREE_FUNCTION Free OPTIONAL
,
411 ExInitializeResourceLite(
412 OUT PERESOURCE Resource
);
417 ExInterlockedAddLargeInteger(
418 IN PLARGE_INTEGER Addend
,
419 IN LARGE_INTEGER Increment
,
420 IN PKSPIN_LOCK Lock
);
423 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
424 (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment)
426 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
427 _InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment)
433 ExInterlockedAddUlong(
436 IN OUT PKSPIN_LOCK Lock
);
438 #if defined(_AMD64_) || defined(_IA64_)
440 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
441 InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand))
448 ExfInterlockedCompareExchange64(
449 IN OUT LONGLONG
volatile *Destination
,
450 IN PLONGLONG Exchange
,
451 IN PLONGLONG Comperand
);
453 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
454 ExfInterlockedCompareExchange64(Destination, Exchange, Comperand)
461 ExInterlockedCompareExchange64(
462 IN OUT LONGLONG
volatile *Destination
,
463 IN PLONGLONG Exchange
,
464 IN PLONGLONG Comparand
,
465 IN PKSPIN_LOCK Lock
);
467 #endif /* defined(_AMD64_) || defined(_IA64_) */
472 ExInterlockedInsertHeadList(
473 IN OUT PLIST_ENTRY ListHead
,
474 IN OUT PLIST_ENTRY ListEntry
,
475 IN OUT PKSPIN_LOCK Lock
);
480 ExInterlockedInsertTailList(
481 IN OUT PLIST_ENTRY ListHead
,
482 IN OUT PLIST_ENTRY ListEntry
,
483 IN OUT PKSPIN_LOCK Lock
);
488 ExInterlockedPopEntryList(
489 IN OUT PSINGLE_LIST_ENTRY ListHead
,
490 IN OUT PKSPIN_LOCK Lock
);
495 ExInterlockedPushEntryList(
496 IN OUT PSINGLE_LIST_ENTRY ListHead
,
497 IN OUT PSINGLE_LIST_ENTRY ListEntry
,
498 IN OUT PKSPIN_LOCK Lock
);
503 ExInterlockedRemoveHeadList(
504 IN OUT PLIST_ENTRY ListHead
,
505 IN OUT PKSPIN_LOCK Lock
);
510 ExIsProcessorFeaturePresent(
511 IN ULONG ProcessorFeature
);
516 ExIsResourceAcquiredExclusiveLite(
517 IN PERESOURCE Resource
);
522 ExIsResourceAcquiredSharedLite(
523 IN PERESOURCE Resource
);
525 #define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite
530 ExLocalTimeToSystemTime(
531 IN PLARGE_INTEGER LocalTime
,
532 OUT PLARGE_INTEGER SystemTime
);
538 IN PCALLBACK_OBJECT CallbackObject
,
546 IN OUT PWORK_QUEUE_ITEM WorkItem
,
547 IN WORK_QUEUE_TYPE QueueType
);
560 IN PCALLBACK_OBJECT CallbackObject
,
561 IN PCALLBACK_FUNCTION CallbackFunction
,
562 IN PVOID CallbackContext
);
567 ExReinitializeResourceLite(
568 IN OUT PERESOURCE Resource
);
573 ExReleaseResourceForThreadLite(
574 IN PERESOURCE Resource
,
575 IN ERESOURCE_THREAD ResourceThreadId
);
580 ExReleaseResourceLite(
581 IN PERESOURCE Resource
);
586 ExSetResourceOwnerPointer(
587 IN PERESOURCE Resource
,
588 IN PVOID OwnerPointer
);
593 ExSetTimerResolution(
594 IN ULONG DesiredTime
,
595 IN BOOLEAN SetResolution
);
600 ExSystemTimeToLocalTime(
601 IN PLARGE_INTEGER SystemTime
,
602 OUT PLARGE_INTEGER LocalTime
);
607 ExUnregisterCallback(
608 IN PVOID CbRegistration
);
610 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
612 #if (NTDDI_VERSION >= NTDDI_WINXP)
617 ExAcquireRundownProtection(
618 IN OUT PEX_RUNDOWN_REF RunRef
);
623 ExInitializeRundownProtection(
624 OUT PEX_RUNDOWN_REF RunRef
);
629 ExReInitializeRundownProtection(
630 OUT PEX_RUNDOWN_REF RunRef
);
635 ExReleaseRundownProtection(
636 IN OUT PEX_RUNDOWN_REF RunRef
);
642 OUT PEX_RUNDOWN_REF RunRef
);
648 IN SUITE_TYPE SuiteType
);
653 ExWaitForRundownProtectionRelease(
654 IN OUT PEX_RUNDOWN_REF RunRef
);
656 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
658 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
663 ExAcquireRundownProtectionEx(
664 IN OUT PEX_RUNDOWN_REF RunRef
,
670 ExReleaseRundownProtectionEx(
671 IN OUT PEX_RUNDOWN_REF RunRef
,
674 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) */
676 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
679 PEX_RUNDOWN_REF_CACHE_AWARE
681 ExAllocateCacheAwareRundownProtection(
682 IN POOL_TYPE PoolType
,
688 ExSizeOfRundownProtectionCacheAware(VOID
);
690 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
692 #if (NTDDI_VERSION >= NTDDI_VISTA)
697 ExInitializeLookasideListEx(
698 OUT PLOOKASIDE_LIST_EX Lookaside
,
699 IN PALLOCATE_FUNCTION_EX Allocate OPTIONAL
,
700 IN PFREE_FUNCTION_EX Free OPTIONAL
,
701 IN POOL_TYPE PoolType
,
710 ExDeleteLookasideListEx(
711 IN OUT PLOOKASIDE_LIST_EX Lookaside
);
716 ExFlushLookasideListEx(
717 IN OUT PLOOKASIDE_LIST_EX Lookaside
);
721 ExAllocateFromLookasideListEx(
722 IN OUT PLOOKASIDE_LIST_EX Lookaside
)
726 Lookaside
->L
.TotalAllocates
+= 1;
727 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
729 Lookaside
->L
.AllocateMisses
+= 1;
730 Entry
= (Lookaside
->L
.AllocateEx
)(Lookaside
->L
.Type
,
740 ExFreeToLookasideListEx(
741 IN OUT PLOOKASIDE_LIST_EX Lookaside
,
744 Lookaside
->L
.TotalFrees
+= 1;
745 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
746 Lookaside
->L
.FreeMisses
+= 1;
747 (Lookaside
->L
.FreeEx
)(Entry
, Lookaside
);
749 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
754 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
756 static __inline PVOID
757 ExAllocateFromNPagedLookasideList(
758 IN OUT PNPAGED_LOOKASIDE_LIST Lookaside
)
762 Lookaside
->L
.TotalAllocates
++;
763 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
764 Entry
= ExInterlockedPopEntrySList(&Lookaside
->L
.ListHead
,
765 &Lookaside
->Lock__ObsoleteButDoNotDelete
);
767 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
770 Lookaside
->L
.AllocateMisses
++;
771 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
,
779 ExFreeToNPagedLookasideList(
780 IN OUT PNPAGED_LOOKASIDE_LIST Lookaside
,
783 Lookaside
->L
.TotalFrees
++;
784 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
785 Lookaside
->L
.FreeMisses
++;
786 (Lookaside
->L
.Free
)(Entry
);
788 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
789 ExInterlockedPushEntrySList(&Lookaside
->L
.ListHead
,
791 &Lookaside
->Lock__ObsoleteButDoNotDelete
);
793 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);