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
);
307 ExGetPreviousMode(VOID
);
312 ExGetSharedWaiterCount(
313 IN PERESOURCE Resource
);
318 ExInitializeNPagedLookasideList(
319 IN PNPAGED_LOOKASIDE_LIST Lookaside
,
320 IN PALLOCATE_FUNCTION Allocate OPTIONAL
,
321 IN PFREE_FUNCTION Free OPTIONAL
,
330 ExInitializePagedLookasideList(
331 IN PPAGED_LOOKASIDE_LIST Lookaside
,
332 IN PALLOCATE_FUNCTION Allocate OPTIONAL
,
333 IN PFREE_FUNCTION Free OPTIONAL
,
342 ExInitializeResourceLite(
343 IN PERESOURCE Resource
);
348 ExInterlockedAddLargeInteger(
349 IN PLARGE_INTEGER Addend
,
350 IN LARGE_INTEGER Increment
,
351 IN PKSPIN_LOCK Lock
);
354 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
355 (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment)
357 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
358 _InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment)
364 ExInterlockedAddUlong(
369 #if defined(_AMD64_) || defined(_IA64_)
371 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
372 InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand))
379 ExfInterlockedCompareExchange64(
380 IN OUT LONGLONG
volatile *Destination
,
381 IN PLONGLONG Exchange
,
382 IN PLONGLONG Comperand
);
384 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
385 ExfInterlockedCompareExchange64(Destination, Exchange, Comperand)
392 ExInterlockedCompareExchange64(
393 IN OUT LONGLONG
volatile *Destination
,
394 IN PLONGLONG Exchange
,
395 IN PLONGLONG Comparand
,
396 IN PKSPIN_LOCK Lock
);
398 #endif /* defined(_AMD64_) || defined(_IA64_) */
403 ExInterlockedInsertHeadList(
404 IN PLIST_ENTRY ListHead
,
405 IN PLIST_ENTRY ListEntry
,
406 IN PKSPIN_LOCK Lock
);
411 ExInterlockedInsertTailList(
412 IN PLIST_ENTRY ListHead
,
413 IN PLIST_ENTRY ListEntry
,
414 IN PKSPIN_LOCK Lock
);
419 ExInterlockedPopEntryList(
420 IN PSINGLE_LIST_ENTRY ListHead
,
421 IN PKSPIN_LOCK Lock
);
426 ExInterlockedPushEntryList(
427 IN PSINGLE_LIST_ENTRY ListHead
,
428 IN PSINGLE_LIST_ENTRY ListEntry
,
429 IN PKSPIN_LOCK Lock
);
434 ExInterlockedRemoveHeadList(
435 IN PLIST_ENTRY ListHead
,
436 IN PKSPIN_LOCK Lock
);
441 ExIsProcessorFeaturePresent(
442 IN ULONG ProcessorFeature
);
447 ExIsResourceAcquiredExclusiveLite(
448 IN PERESOURCE Resource
);
453 ExIsResourceAcquiredSharedLite(
454 IN PERESOURCE Resource
);
456 #define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite
461 ExLocalTimeToSystemTime(
462 IN PLARGE_INTEGER LocalTime
,
463 OUT PLARGE_INTEGER SystemTime
);
469 IN PCALLBACK_OBJECT CallbackObject
,
477 IN PWORK_QUEUE_ITEM WorkItem
,
478 IN WORK_QUEUE_TYPE QueueType
);
491 IN PCALLBACK_OBJECT CallbackObject
,
492 IN PCALLBACK_FUNCTION CallbackFunction
,
493 IN PVOID CallbackContext
);
498 ExReinitializeResourceLite(
499 IN PERESOURCE Resource
);
504 ExReleaseResourceForThreadLite(
505 IN PERESOURCE Resource
,
506 IN ERESOURCE_THREAD ResourceThreadId
);
511 ExReleaseResourceLite(
512 IN PERESOURCE Resource
);
517 ExSetResourceOwnerPointer(
518 IN PERESOURCE Resource
,
519 IN PVOID OwnerPointer
);
524 ExSetTimerResolution(
525 IN ULONG DesiredTime
,
526 IN BOOLEAN SetResolution
);
531 ExSystemTimeToLocalTime(
532 IN PLARGE_INTEGER SystemTime
,
533 OUT PLARGE_INTEGER LocalTime
);
538 ExUnregisterCallback(
539 IN PVOID CbRegistration
);
541 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
543 #if (NTDDI_VERSION >= NTDDI_WINXP)
548 ExAcquireRundownProtection(
549 IN OUT PEX_RUNDOWN_REF RunRef
);
554 ExInitializeRundownProtection(
555 OUT PEX_RUNDOWN_REF RunRef
);
560 ExReInitializeRundownProtection(
561 OUT PEX_RUNDOWN_REF RunRef
);
566 ExReleaseRundownProtection(
567 IN OUT PEX_RUNDOWN_REF RunRef
);
573 OUT PEX_RUNDOWN_REF RunRef
);
579 IN SUITE_TYPE SuiteType
);
584 ExWaitForRundownProtectionRelease(
585 IN OUT PEX_RUNDOWN_REF RunRef
);
587 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
589 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
594 ExAcquireRundownProtectionEx(
595 IN OUT PEX_RUNDOWN_REF RunRef
,
601 ExReleaseRundownProtectionEx(
602 IN OUT PEX_RUNDOWN_REF RunRef
,
605 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) */
607 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
610 PEX_RUNDOWN_REF_CACHE_AWARE
612 ExAllocateCacheAwareRundownProtection(
613 IN POOL_TYPE PoolType
,
619 ExSizeOfRundownProtectionCacheAware(VOID
);
621 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
623 #if (NTDDI_VERSION >= NTDDI_VISTA)
627 ExInitializeLookasideListEx(
628 OUT PLOOKASIDE_LIST_EX Lookaside
,
629 IN PALLOCATE_FUNCTION_EX Allocate OPTIONAL
,
630 IN PFREE_FUNCTION_EX Free OPTIONAL
,
631 IN POOL_TYPE PoolType
,
638 #if !defined(MIDL_PASS)
640 static __inline PVOID
641 ExAllocateFromNPagedLookasideList(
642 IN PNPAGED_LOOKASIDE_LIST Lookaside
)
646 Lookaside
->L
.TotalAllocates
++;
647 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
649 Lookaside
->L
.AllocateMisses
++;
650 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
,
657 static __inline PVOID
658 ExAllocateFromPagedLookasideList(
659 IN PPAGED_LOOKASIDE_LIST Lookaside
)
663 Lookaside
->L
.TotalAllocates
++;
664 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
666 Lookaside
->L
.AllocateMisses
++;
667 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
,
675 ExFreeToNPagedLookasideList(
676 IN PNPAGED_LOOKASIDE_LIST Lookaside
,
679 Lookaside
->L
.TotalFrees
++;
680 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
681 Lookaside
->L
.FreeMisses
++;
682 (Lookaside
->L
.Free
)(Entry
);
684 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
689 ExFreeToPagedLookasideList(
690 IN PPAGED_LOOKASIDE_LIST Lookaside
,
693 Lookaside
->L
.TotalFrees
++;
694 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
695 Lookaside
->L
.FreeMisses
++;
696 (Lookaside
->L
.Free
)(Entry
);
698 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
702 #endif /* !defined(MIDL_PASS) */