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
19 #define ExAcquireFastMutex ExiAcquireFastMutex
20 #define ExReleaseFastMutex ExiReleaseFastMutex
21 #define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex
23 #define ExInterlockedAddUlong ExfInterlockedAddUlong
24 #define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList
25 #define ExInterlockedInsertTailList ExfInterlockedInsertTailList
26 #define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList
27 #define ExInterlockedPopEntryList ExfInterlockedPopEntryList
28 #define ExInterlockedPushEntryList ExfInterlockedPushEntryList
33 #if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || \
34 defined(_NTHAL_) || defined(_NTOSP_)
37 ExQueryDepthSList(IN PSLIST_HEADER ListHead
);
41 ExQueryDepthSList(IN PSLIST_HEADER ListHead
)
43 return (USHORT
)(ListHead
->Alignment
& 0xffff);
49 ExpInterlockedFlushSList(
50 PSLIST_HEADER ListHead
);
54 ExpInterlockedPopEntrySList(
55 PSLIST_HEADER ListHead
);
59 ExpInterlockedPushEntrySList(
60 PSLIST_HEADER ListHead
,
61 PSLIST_ENTRY ListEntry
);
63 #define ExInterlockedFlushSList(Head) \
64 ExpInterlockedFlushSList(Head)
65 #define ExInterlockedPopEntrySList(Head, Lock) \
66 ExpInterlockedPopEntrySList(Head)
67 #define ExInterlockedPushEntrySList(Head, Entry, Lock) \
68 ExpInterlockedPushEntrySList(Head, Entry)
70 #else // !defined(_WIN64)
72 #define ExQueryDepthSList(listhead) (listhead)->Depth
77 ExInterlockedFlushSList(
78 IN PSLIST_HEADER ListHead
);
80 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
84 ExInterlockedPopEntrySList(
85 IN PSLIST_HEADER ListHead
,
91 ExInterlockedPushEntrySList(
92 IN PSLIST_HEADER ListHead
,
93 IN PSINGLE_LIST_ENTRY ListEntry
,
96 #define ExInterlockedPopEntrySList(_ListHead, _Lock) \
97 InterlockedPopEntrySList(_ListHead)
98 #define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \
99 InterlockedPushEntrySList(_ListHead, _ListEntry)
100 #endif // _WIN2K_COMPAT_SLIST_USAGE
102 #endif // !defined(_WIN64)
105 * ExGetCurrentResourceThread(
108 #define ExGetCurrentResourceThread() ((ERESOURCE_THREAD)PsGetCurrentThread())
110 #define ExReleaseResource(R) (ExReleaseResourceLite(R))
113 * ExInitializeWorkItem(
114 * IN PWORK_QUEUE_ITEM Item,
115 * IN PWORKER_THREAD_ROUTINE Routine,
118 #define ExInitializeWorkItem(Item, Routine, Context) \
120 (Item)->WorkerRoutine = Routine; \
121 (Item)->Parameter = Context; \
122 (Item)->List.Flink = NULL; \
127 ExInitializeFastMutex(
128 OUT PFAST_MUTEX FastMutex
)
130 FastMutex
->Count
= FM_LOCK_BIT
;
131 FastMutex
->Owner
= NULL
;
132 FastMutex
->Contention
= 0;
133 KeInitializeEvent(&FastMutex
->Event
, SynchronizationEvent
, FALSE
);
137 #if (NTDDI_VERSION >= NTDDI_WIN2K)
143 IN OUT PFAST_MUTEX FastMutex
);
149 IN OUT PFAST_MUTEX FastMutex
);
154 ExTryToAcquireFastMutex(
155 IN OUT PFAST_MUTEX FastMutex
);
160 ExAcquireFastMutexUnsafe(
161 IN OUT PFAST_MUTEX FastMutex
);
166 ExReleaseFastMutexUnsafe(
167 IN OUT PFAST_MUTEX FastMutex
);
172 ExAcquireResourceExclusiveLite(
173 IN PERESOURCE Resource
,
179 ExAcquireResourceSharedLite(
180 IN PERESOURCE Resource
,
186 ExAcquireSharedStarveExclusive(
187 IN PERESOURCE Resource
,
193 ExAcquireSharedWaitForExclusive(
194 IN PERESOURCE Resource
,
201 IN POOL_TYPE PoolType
,
202 IN SIZE_T NumberOfBytes
);
205 #define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD')
206 #endif /* POOL_TAGGING */
211 ExAllocatePoolWithQuota(
212 IN POOL_TYPE PoolType
,
213 IN SIZE_T NumberOfBytes
);
216 #define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD')
217 #endif /* POOL_TAGGING */
222 ExAllocatePoolWithQuotaTag(
223 IN POOL_TYPE PoolType
,
224 IN SIZE_T NumberOfBytes
,
228 #define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b)
229 #endif /* POOL_TAGGING */
234 ExAllocatePoolWithTag(
235 IN POOL_TYPE PoolType
,
236 IN SIZE_T NumberOfBytes
,
242 ExAllocatePoolWithTagPriority(
243 IN POOL_TYPE PoolType
,
244 IN SIZE_T NumberOfBytes
,
246 IN EX_POOL_PRIORITY Priority
);
251 ExConvertExclusiveToSharedLite(
252 IN PERESOURCE Resource
);
258 OUT PCALLBACK_OBJECT
*CallbackObject
,
259 IN POBJECT_ATTRIBUTES ObjectAttributes
,
261 IN BOOLEAN AllowMultipleCallbacks
);
266 ExDeleteNPagedLookasideList(
267 IN PNPAGED_LOOKASIDE_LIST Lookaside
);
272 ExDeletePagedLookasideList(
273 IN PPAGED_LOOKASIDE_LIST Lookaside
);
278 ExDeleteResourceLite(
279 IN PERESOURCE Resource
);
288 #define ExFreePool(P) ExFreePoolWithTag(P, 0)
301 ExGetExclusiveWaiterCount(
302 IN PERESOURCE Resource
);
313 ExGetSharedWaiterCount(
314 IN PERESOURCE Resource
);
319 ExInitializeNPagedLookasideList(
320 IN PNPAGED_LOOKASIDE_LIST Lookaside
,
321 IN PALLOCATE_FUNCTION Allocate OPTIONAL
,
322 IN PFREE_FUNCTION Free OPTIONAL
,
331 ExInitializePagedLookasideList(
332 IN PPAGED_LOOKASIDE_LIST Lookaside
,
333 IN PALLOCATE_FUNCTION Allocate OPTIONAL
,
334 IN PFREE_FUNCTION Free OPTIONAL
,
343 ExInitializeResourceLite(
344 IN PERESOURCE Resource
);
349 ExInterlockedAddLargeInteger(
350 IN PLARGE_INTEGER Addend
,
351 IN LARGE_INTEGER Increment
,
352 IN PKSPIN_LOCK Lock
);
355 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
356 (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment)
358 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
359 _InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment)
365 ExInterlockedAddUlong(
370 #if defined(_AMD64_) || defined(_IA64_)
371 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
372 InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand))
377 ExfInterlockedCompareExchange64(
378 IN OUT LONGLONG
volatile *Destination
,
379 IN PLONGLONG Exchange
,
380 IN PLONGLONG Comperand
);
381 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
382 ExfInterlockedCompareExchange64(Destination, Exchange, Comperand)
387 ExInterlockedCompareExchange64(
388 IN OUT LONGLONG
volatile *Destination
,
389 IN PLONGLONG Exchange
,
390 IN PLONGLONG Comparand
,
391 IN PKSPIN_LOCK Lock
);
397 ExInterlockedInsertHeadList(
398 IN PLIST_ENTRY ListHead
,
399 IN PLIST_ENTRY ListEntry
,
400 IN PKSPIN_LOCK Lock
);
405 ExInterlockedInsertTailList(
406 IN PLIST_ENTRY ListHead
,
407 IN PLIST_ENTRY ListEntry
,
408 IN PKSPIN_LOCK Lock
);
413 ExInterlockedPopEntryList(
414 IN PSINGLE_LIST_ENTRY ListHead
,
415 IN PKSPIN_LOCK Lock
);
420 ExInterlockedPushEntryList(
421 IN PSINGLE_LIST_ENTRY ListHead
,
422 IN PSINGLE_LIST_ENTRY ListEntry
,
423 IN PKSPIN_LOCK Lock
);
428 ExInterlockedRemoveHeadList(
429 IN PLIST_ENTRY ListHead
,
430 IN PKSPIN_LOCK Lock
);
435 ExIsProcessorFeaturePresent(
436 IN ULONG ProcessorFeature
);
441 ExIsResourceAcquiredExclusiveLite(
442 IN PERESOURCE Resource
);
447 ExIsResourceAcquiredSharedLite(
448 IN PERESOURCE Resource
);
450 #define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite
455 ExLocalTimeToSystemTime(
456 IN PLARGE_INTEGER LocalTime
,
457 OUT PLARGE_INTEGER SystemTime
);
463 IN PCALLBACK_OBJECT CallbackObject
,
471 IN PWORK_QUEUE_ITEM WorkItem
,
472 IN WORK_QUEUE_TYPE QueueType
);
485 IN PCALLBACK_OBJECT CallbackObject
,
486 IN PCALLBACK_FUNCTION CallbackFunction
,
487 IN PVOID CallbackContext
);
492 ExReinitializeResourceLite(
493 IN PERESOURCE Resource
);
498 ExReleaseResourceForThreadLite(
499 IN PERESOURCE Resource
,
500 IN ERESOURCE_THREAD ResourceThreadId
);
505 ExReleaseResourceLite(
506 IN PERESOURCE Resource
);
511 ExSetResourceOwnerPointer(
512 IN PERESOURCE Resource
,
513 IN PVOID OwnerPointer
);
518 ExSetTimerResolution(
519 IN ULONG DesiredTime
,
520 IN BOOLEAN SetResolution
);
525 ExSystemTimeToLocalTime(
526 IN PLARGE_INTEGER SystemTime
,
527 OUT PLARGE_INTEGER LocalTime
);
532 ExUnregisterCallback(
533 IN PVOID CbRegistration
);
536 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
538 #if (NTDDI_VERSION >= NTDDI_WINXP)
542 ExAcquireRundownProtection(
543 IN OUT PEX_RUNDOWN_REF RunRef
);
548 ExInitializeRundownProtection(
549 OUT PEX_RUNDOWN_REF RunRef
);
554 ExReInitializeRundownProtection(
555 OUT PEX_RUNDOWN_REF RunRef
);
560 ExReleaseRundownProtection(
561 IN OUT PEX_RUNDOWN_REF RunRef
);
567 OUT PEX_RUNDOWN_REF RunRef
);
573 IN SUITE_TYPE SuiteType
);
578 ExWaitForRundownProtectionRelease(
579 IN OUT PEX_RUNDOWN_REF RunRef
);
581 #endif // (NTDDI_VERSION >= NTDDI_WINXP)
583 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
587 ExAcquireRundownProtectionEx(
588 IN OUT PEX_RUNDOWN_REF RunRef
,
594 ExReleaseRundownProtectionEx(
595 IN OUT PEX_RUNDOWN_REF RunRef
,
597 #endif // (NTDDI_VERSION >= NTDDI_WINXPSP2)
599 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
601 PEX_RUNDOWN_REF_CACHE_AWARE
603 ExAllocateCacheAwareRundownProtection(
604 IN POOL_TYPE PoolType
,
610 ExSizeOfRundownProtectionCacheAware(VOID
);
611 #endif // (NTDDI_VERSION >= NTDDI_WS03SP1)
613 #if (NTDDI_VERSION >= NTDDI_VISTA)
617 ExInitializeLookasideListEx(
618 OUT PLOOKASIDE_LIST_EX Lookaside
,
619 IN PALLOCATE_FUNCTION_EX Allocate OPTIONAL
,
620 IN PFREE_FUNCTION_EX Free OPTIONAL
,
621 IN POOL_TYPE PoolType
,
628 #if !defined(MIDL_PASS)
630 static __inline PVOID
631 ExAllocateFromNPagedLookasideList(
632 IN PNPAGED_LOOKASIDE_LIST Lookaside
)
636 Lookaside
->L
.TotalAllocates
++;
637 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
639 Lookaside
->L
.AllocateMisses
++;
640 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
,
647 static __inline PVOID
648 ExAllocateFromPagedLookasideList(
649 IN PPAGED_LOOKASIDE_LIST Lookaside
)
653 Lookaside
->L
.TotalAllocates
++;
654 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
656 Lookaside
->L
.AllocateMisses
++;
657 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
,
665 ExFreeToNPagedLookasideList(
666 IN PNPAGED_LOOKASIDE_LIST Lookaside
,
669 Lookaside
->L
.TotalFrees
++;
670 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
671 Lookaside
->L
.FreeMisses
++;
672 (Lookaside
->L
.Free
)(Entry
);
674 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
679 ExFreeToPagedLookasideList(
680 IN PPAGED_LOOKASIDE_LIST Lookaside
,
683 Lookaside
->L
.TotalFrees
++;
684 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
685 Lookaside
->L
.FreeMisses
++;
686 (Lookaside
->L
.Free
)(Entry
);
688 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
692 #endif // !defined(MIDL_PASS)