1 /******************************************************************************
2 * Executive Functions *
3 ******************************************************************************/
9 if (Zone
->FreeList
.Next
)
10 Zone
->FreeList
.Next
= Zone
->FreeList
.Next
->Next
;
11 return (PVOID
) Zone
->FreeList
.Next
;
19 ((PSINGLE_LIST_ENTRY
) Block
)->Next
= Zone
->FreeList
.Next
;
20 Zone
->FreeList
.Next
= ((PSINGLE_LIST_ENTRY
) Block
);
21 return ((PSINGLE_LIST_ENTRY
) Block
)->Next
;
26 * ExInterlockedAllocateFromZone(
27 * IN PZONE_HEADER Zone,
28 * IN PKSPIN_LOCK Lock)
30 #define ExInterlockedAllocateFromZone(Zone, Lock) \
31 ((PVOID) ExInterlockedPopEntryList(&Zone->FreeList, Lock))
34 * ExInterlockedFreeToZone(
35 * IN PZONE_HEADER Zone,
37 * IN PKSPIN_LOCK Lock);
39 #define ExInterlockedFreeToZone(Zone, Block, Lock) \
40 ExInterlockedPushEntryList(&(Zone)->FreeList, (PSINGLE_LIST_ENTRY)(Block), Lock)
45 * IN PZONE_HEADER Zone)
47 #define ExIsFullZone(Zone) \
48 ((Zone)->FreeList.Next == (PSINGLE_LIST_ENTRY) NULL)
51 * ExIsObjectInFirstZoneSegment(
52 * IN PZONE_HEADER Zone,
55 #define ExIsObjectInFirstZoneSegment(Zone,Object) \
56 ((BOOLEAN)( ((PUCHAR)(Object) >= (PUCHAR)(Zone)->SegmentList.Next) && \
57 ((PUCHAR)(Object) < (PUCHAR)(Zone)->SegmentList.Next + \
58 (Zone)->TotalSegmentSize)) )
60 #define ExAcquireResourceExclusive ExAcquireResourceExclusiveLite
61 #define ExAcquireResourceShared ExAcquireResourceSharedLite
62 #define ExConvertExclusiveToShared ExConvertExclusiveToSharedLite
63 #define ExDeleteResource ExDeleteResourceLite
64 #define ExInitializeResource ExInitializeResourceLite
65 #define ExIsResourceAcquiredExclusive ExIsResourceAcquiredExclusiveLite
66 #define ExIsResourceAcquiredShared ExIsResourceAcquiredSharedLite
67 #define ExIsResourceAcquired ExIsResourceAcquiredSharedLite
68 #define ExReleaseResourceForThread ExReleaseResourceForThreadLite
72 #define ExInterlockedIncrementLong(Addend,Lock) Exfi386InterlockedIncrementLong(Addend)
73 #define ExInterlockedDecrementLong(Addend,Lock) Exfi386InterlockedDecrementLong(Addend)
74 #define ExInterlockedExchangeUlong(Target, Value, Lock) Exfi386InterlockedExchangeUlong(Target, Value)
76 #define ExAcquireSpinLock(Lock, OldIrql) KeAcquireSpinLock((Lock), (OldIrql))
77 #define ExReleaseSpinLock(Lock, OldIrql) KeReleaseSpinLock((Lock), (OldIrql))
78 #define ExAcquireSpinLockAtDpcLevel(Lock) KeAcquireSpinLockAtDpcLevel(Lock)
79 #define ExReleaseSpinLockFromDpcLevel(Lock) KeReleaseSpinLockFromDpcLevel(Lock)
81 #define ExInitializeSListHead InitializeSListHead
83 #if defined(_NTHAL_) && defined(_X86_)
89 IN OUT PFAST_MUTEX FastMutex
);
95 IN OUT PFAST_MUTEX FastMutex
);
100 ExiTryToAcquireFastMutex(
101 IN OUT PFAST_MUTEX FastMutex
);
103 #define ExAcquireFastMutex ExiAcquireFastMutex
104 #define ExReleaseFastMutex ExiReleaseFastMutex
105 #define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex
109 #if (NTDDI_VERSION >= NTDDI_WIN2K)
115 IN OUT PFAST_MUTEX FastMutex
);
121 IN OUT PFAST_MUTEX FastMutex
);
126 ExTryToAcquireFastMutex(
127 IN OUT PFAST_MUTEX FastMutex
);
129 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
131 #endif /* defined(_NTHAL_) && defined(_X86_) */
134 #define ExInterlockedAddUlong ExfInterlockedAddUlong
135 #define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList
136 #define ExInterlockedInsertTailList ExfInterlockedInsertTailList
137 #define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList
138 #define ExInterlockedPopEntryList ExfInterlockedPopEntryList
139 #define ExInterlockedPushEntryList ExfInterlockedPushEntryList
140 #endif /* defined(_X86_) */
144 #if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || \
145 defined(_NTHAL_) || defined(_NTOSP_)
148 ExQueryDepthSList(IN PSLIST_HEADER ListHead
);
152 ExQueryDepthSList(IN PSLIST_HEADER ListHead
)
154 return (USHORT
)(ListHead
->Alignment
& 0xffff);
160 ExpInterlockedFlushSList(
161 PSLIST_HEADER ListHead
);
165 ExpInterlockedPopEntrySList(
166 PSLIST_HEADER ListHead
);
170 ExpInterlockedPushEntrySList(
171 PSLIST_HEADER ListHead
,
172 PSLIST_ENTRY ListEntry
);
174 #define ExInterlockedFlushSList(Head) \
175 ExpInterlockedFlushSList(Head)
176 #define ExInterlockedPopEntrySList(Head, Lock) \
177 ExpInterlockedPopEntrySList(Head)
178 #define ExInterlockedPushEntrySList(Head, Entry, Lock) \
179 ExpInterlockedPushEntrySList(Head, Entry)
181 #else /* !defined(_WIN64) */
183 #define ExQueryDepthSList(listhead) (listhead)->Depth
188 ExInterlockedFlushSList(
189 IN OUT PSLIST_HEADER ListHead
);
191 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
196 ExInterlockedPopEntrySList(
197 IN PSLIST_HEADER ListHead
,
198 IN PKSPIN_LOCK Lock
);
203 ExInterlockedPushEntrySList(
204 IN PSLIST_HEADER ListHead
,
205 IN PSINGLE_LIST_ENTRY ListEntry
,
206 IN PKSPIN_LOCK Lock
);
211 ExAllocateFromPagedLookasideList(
212 IN OUT PPAGED_LOOKASIDE_LIST Lookaside
);
217 ExFreeToPagedLookasideList(
218 IN OUT PPAGED_LOOKASIDE_LIST Lookaside
,
223 #define ExInterlockedPopEntrySList(_ListHead, _Lock) \
224 InterlockedPopEntrySList(_ListHead)
225 #define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \
226 InterlockedPushEntrySList(_ListHead, _ListEntry)
230 ExAllocateFromPagedLookasideList(
231 IN OUT PPAGED_LOOKASIDE_LIST Lookaside
)
235 Lookaside
->L
.TotalAllocates
++;
236 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
238 Lookaside
->L
.AllocateMisses
++;
239 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
,
248 ExFreeToPagedLookasideList(
249 IN OUT PPAGED_LOOKASIDE_LIST Lookaside
,
252 Lookaside
->L
.TotalFrees
++;
253 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
254 Lookaside
->L
.FreeMisses
++;
255 (Lookaside
->L
.Free
)(Entry
);
257 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
261 #endif /* _WIN2K_COMPAT_SLIST_USAGE */
263 #endif /* !defined(_WIN64) */
266 * ExGetCurrentResourceThread(
269 #define ExGetCurrentResourceThread() ((ULONG_PTR)PsGetCurrentThread())
271 #define ExReleaseResource(R) (ExReleaseResourceLite(R))
274 * ExInitializeWorkItem(
275 * IN PWORK_QUEUE_ITEM Item,
276 * IN PWORKER_THREAD_ROUTINE Routine,
279 #define ExInitializeWorkItem(Item, Routine, Context) \
281 (Item)->WorkerRoutine = Routine; \
282 (Item)->Parameter = Context; \
283 (Item)->List.Flink = NULL; \
288 ExInitializeFastMutex(
289 OUT PFAST_MUTEX FastMutex
)
291 FastMutex
->Count
= FM_LOCK_BIT
;
292 FastMutex
->Owner
= NULL
;
293 FastMutex
->Contention
= 0;
294 KeInitializeEvent(&FastMutex
->Event
, SynchronizationEvent
, FALSE
);
299 #if (NTDDI_VERSION >= NTDDI_WIN2K)
305 IN OUT PZONE_HEADER Zone
,
306 IN OUT PVOID Segment
,
307 IN ULONG SegmentSize
);
313 OUT PZONE_HEADER Zone
,
315 IN OUT PVOID InitialSegment
,
316 IN ULONG InitialSegmentSize
);
321 ExInterlockedExtendZone(
322 IN OUT PZONE_HEADER Zone
,
323 IN OUT PVOID Segment
,
324 IN ULONG SegmentSize
,
325 IN OUT PKSPIN_LOCK Lock
);
337 ExRaiseAccessViolation(VOID
);
343 ExRaiseDatatypeMisalignment(VOID
);
350 ExAcquireFastMutexUnsafe(
351 IN OUT PFAST_MUTEX FastMutex
);
356 ExReleaseFastMutexUnsafe(
357 IN OUT PFAST_MUTEX FastMutex
);
362 ExAcquireResourceExclusiveLite(
363 IN OUT PERESOURCE Resource
,
369 ExAcquireResourceSharedLite(
370 IN OUT PERESOURCE Resource
,
376 ExAcquireSharedStarveExclusive(
377 IN OUT PERESOURCE Resource
,
383 ExAcquireSharedWaitForExclusive(
384 IN OUT PERESOURCE Resource
,
391 IN POOL_TYPE PoolType
,
392 IN SIZE_T NumberOfBytes
);
397 ExAllocatePoolWithQuota(
398 IN POOL_TYPE PoolType
,
399 IN SIZE_T NumberOfBytes
);
404 ExAllocatePoolWithQuotaTag(
405 IN POOL_TYPE PoolType
,
406 IN SIZE_T NumberOfBytes
,
410 #define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b)
416 ExAllocatePoolWithTag(
417 IN POOL_TYPE PoolType
,
418 IN SIZE_T NumberOfBytes
,
422 #define ExAllocatePoolWithTag(a,b,c) ExAllocatePool(a,b)
428 ExAllocatePoolWithTagPriority(
429 IN POOL_TYPE PoolType
,
430 IN SIZE_T NumberOfBytes
,
432 IN EX_POOL_PRIORITY Priority
);
437 ExConvertExclusiveToSharedLite(
438 IN OUT PERESOURCE Resource
);
444 OUT PCALLBACK_OBJECT
*CallbackObject
,
445 IN POBJECT_ATTRIBUTES ObjectAttributes
,
447 IN BOOLEAN AllowMultipleCallbacks
);
452 ExDeleteNPagedLookasideList(
453 IN OUT PNPAGED_LOOKASIDE_LIST Lookaside
);
458 ExDeletePagedLookasideList(
459 IN PPAGED_LOOKASIDE_LIST Lookaside
);
464 ExDeleteResourceLite(
465 IN OUT PERESOURCE Resource
);
483 ExGetExclusiveWaiterCount(
484 IN PERESOURCE Resource
);
489 ExGetPreviousMode(VOID
);
494 ExGetSharedWaiterCount(
495 IN PERESOURCE Resource
);
500 ExInitializeNPagedLookasideList(
501 IN PNPAGED_LOOKASIDE_LIST Lookaside
,
502 IN PALLOCATE_FUNCTION Allocate OPTIONAL
,
503 IN PFREE_FUNCTION Free OPTIONAL
,
512 ExInitializePagedLookasideList(
513 IN PPAGED_LOOKASIDE_LIST Lookaside
,
514 IN PALLOCATE_FUNCTION Allocate OPTIONAL
,
515 IN PFREE_FUNCTION Free OPTIONAL
,
524 ExInitializeResourceLite(
525 OUT PERESOURCE Resource
);
530 ExInterlockedAddLargeInteger(
531 IN PLARGE_INTEGER Addend
,
532 IN LARGE_INTEGER Increment
,
533 IN PKSPIN_LOCK Lock
);
536 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
537 (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment)
539 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
540 _InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment)
546 ExInterlockedAddUlong(
549 IN OUT PKSPIN_LOCK Lock
);
551 #if defined(_AMD64_) || defined(_IA64_)
553 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
554 InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand))
561 ExfInterlockedCompareExchange64(
562 IN OUT LONGLONG
volatile *Destination
,
563 IN PLONGLONG Exchange
,
564 IN PLONGLONG Comperand
);
566 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
567 ExfInterlockedCompareExchange64(Destination, Exchange, Comperand)
574 ExInterlockedCompareExchange64(
575 IN OUT LONGLONG
volatile *Destination
,
576 IN PLONGLONG Exchange
,
577 IN PLONGLONG Comparand
,
578 IN PKSPIN_LOCK Lock
);
580 #endif /* defined(_AMD64_) || defined(_IA64_) */
585 ExInterlockedInsertHeadList(
586 IN OUT PLIST_ENTRY ListHead
,
587 IN OUT PLIST_ENTRY ListEntry
,
588 IN OUT PKSPIN_LOCK Lock
);
593 ExInterlockedInsertTailList(
594 IN OUT PLIST_ENTRY ListHead
,
595 IN OUT PLIST_ENTRY ListEntry
,
596 IN OUT PKSPIN_LOCK Lock
);
601 ExInterlockedPopEntryList(
602 IN OUT PSINGLE_LIST_ENTRY ListHead
,
603 IN OUT PKSPIN_LOCK Lock
);
608 ExInterlockedPushEntryList(
609 IN OUT PSINGLE_LIST_ENTRY ListHead
,
610 IN OUT PSINGLE_LIST_ENTRY ListEntry
,
611 IN OUT PKSPIN_LOCK Lock
);
616 ExInterlockedRemoveHeadList(
617 IN OUT PLIST_ENTRY ListHead
,
618 IN OUT PKSPIN_LOCK Lock
);
623 ExIsProcessorFeaturePresent(
624 IN ULONG ProcessorFeature
);
629 ExIsResourceAcquiredExclusiveLite(
630 IN PERESOURCE Resource
);
635 ExIsResourceAcquiredSharedLite(
636 IN PERESOURCE Resource
);
638 #define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite
643 ExLocalTimeToSystemTime(
644 IN PLARGE_INTEGER LocalTime
,
645 OUT PLARGE_INTEGER SystemTime
);
651 IN PCALLBACK_OBJECT CallbackObject
,
652 IN PVOID Argument1 OPTIONAL
,
653 IN PVOID Argument2 OPTIONAL
);
659 IN OUT PWORK_QUEUE_ITEM WorkItem
,
660 IN WORK_QUEUE_TYPE QueueType
);
673 IN PCALLBACK_OBJECT CallbackObject
,
674 IN PCALLBACK_FUNCTION CallbackFunction
,
675 IN PVOID CallbackContext OPTIONAL
);
680 ExReinitializeResourceLite(
681 IN OUT PERESOURCE Resource
);
686 ExReleaseResourceForThreadLite(
687 IN OUT PERESOURCE Resource
,
688 IN ERESOURCE_THREAD ResourceThreadId
);
693 ExReleaseResourceLite(
694 IN OUT PERESOURCE Resource
);
699 ExSetResourceOwnerPointer(
700 IN OUT PERESOURCE Resource
,
701 IN PVOID OwnerPointer
);
706 ExSetTimerResolution(
707 IN ULONG DesiredTime
,
708 IN BOOLEAN SetResolution
);
713 ExSystemTimeToLocalTime(
714 IN PLARGE_INTEGER SystemTime
,
715 OUT PLARGE_INTEGER LocalTime
);
720 ExUnregisterCallback(
721 IN OUT PVOID CbRegistration
);
724 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
727 #if (NTDDI_VERSION >= NTDDI_WINXP)
732 ExAcquireRundownProtection(
733 IN OUT PEX_RUNDOWN_REF RunRef
);
738 ExInitializeRundownProtection(
739 OUT PEX_RUNDOWN_REF RunRef
);
744 ExReInitializeRundownProtection(
745 IN OUT PEX_RUNDOWN_REF RunRef
);
750 ExReleaseRundownProtection(
751 IN OUT PEX_RUNDOWN_REF RunRef
);
757 OUT PEX_RUNDOWN_REF RunRef
);
763 IN SUITE_TYPE SuiteType
);
768 ExWaitForRundownProtectionRelease(
769 IN OUT PEX_RUNDOWN_REF RunRef
);
771 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
773 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
778 ExAcquireRundownProtectionEx(
779 IN OUT PEX_RUNDOWN_REF RunRef
,
785 ExReleaseRundownProtectionEx(
786 IN OUT PEX_RUNDOWN_REF RunRef
,
789 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) */
791 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
794 PEX_RUNDOWN_REF_CACHE_AWARE
796 ExAllocateCacheAwareRundownProtection(
797 IN POOL_TYPE PoolType
,
803 ExSizeOfRundownProtectionCacheAware(VOID
);
808 ExEnterCriticalRegionAndAcquireResourceShared(
809 IN OUT PERESOURCE Resource
);
814 ExEnterCriticalRegionAndAcquireResourceExclusive(
815 IN OUT PERESOURCE Resource
);
820 ExEnterCriticalRegionAndAcquireSharedWaitForExclusive(
821 IN OUT PERESOURCE Resource
);
826 ExReleaseResourceAndLeaveCriticalRegion(
827 IN OUT PERESOURCE Resource
);
832 ExInitializeRundownProtectionCacheAware(
833 OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware
,
834 IN SIZE_T RunRefSize
);
839 ExFreeCacheAwareRundownProtection(
840 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware
);
845 ExAcquireRundownProtectionCacheAware(
846 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware
);
851 ExReleaseRundownProtectionCacheAware(
852 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware
);
857 ExAcquireRundownProtectionCacheAwareEx(
858 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware
,
864 ExReleaseRundownProtectionCacheAwareEx(
865 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRef
,
871 ExWaitForRundownProtectionReleaseCacheAware(
872 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRef
);
877 ExReInitializeRundownProtectionCacheAware(
878 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware
);
883 ExRundownCompletedCacheAware(
884 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware
);
886 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
888 #if (NTDDI_VERSION >= NTDDI_VISTA)
893 ExInitializeLookasideListEx(
894 OUT PLOOKASIDE_LIST_EX Lookaside
,
895 IN PALLOCATE_FUNCTION_EX Allocate OPTIONAL
,
896 IN PFREE_FUNCTION_EX Free OPTIONAL
,
897 IN POOL_TYPE PoolType
,
906 ExDeleteLookasideListEx(
907 IN OUT PLOOKASIDE_LIST_EX Lookaside
);
912 ExFlushLookasideListEx(
913 IN OUT PLOOKASIDE_LIST_EX Lookaside
);
917 ExAllocateFromLookasideListEx(
918 IN OUT PLOOKASIDE_LIST_EX Lookaside
)
922 Lookaside
->L
.TotalAllocates
+= 1;
923 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
925 Lookaside
->L
.AllocateMisses
+= 1;
926 Entry
= (Lookaside
->L
.AllocateEx
)(Lookaside
->L
.Type
,
936 ExFreeToLookasideListEx(
937 IN OUT PLOOKASIDE_LIST_EX Lookaside
,
940 Lookaside
->L
.TotalFrees
+= 1;
941 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
942 Lookaside
->L
.FreeMisses
+= 1;
943 (Lookaside
->L
.FreeEx
)(Entry
, Lookaside
);
945 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
950 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
952 #if (NTDDI_VERSION >= NTDDI_WIN7)
957 ExSetResourceOwnerPointerEx(
958 IN OUT PERESOURCE Resource
,
959 IN PVOID OwnerPointer
,
962 #define FLAG_OWNER_POINTER_IS_THREAD 0x1
964 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
966 static __inline PVOID
967 ExAllocateFromNPagedLookasideList(
968 IN OUT PNPAGED_LOOKASIDE_LIST Lookaside
)
972 Lookaside
->L
.TotalAllocates
++;
973 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
974 Entry
= ExInterlockedPopEntrySList(&Lookaside
->L
.ListHead
,
975 &Lookaside
->Lock__ObsoleteButDoNotDelete
);
977 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
980 Lookaside
->L
.AllocateMisses
++;
981 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
,
989 ExFreeToNPagedLookasideList(
990 IN OUT PNPAGED_LOOKASIDE_LIST Lookaside
,
993 Lookaside
->L
.TotalFrees
++;
994 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
995 Lookaside
->L
.FreeMisses
++;
996 (Lookaside
->L
.Free
)(Entry
);
998 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
999 ExInterlockedPushEntrySList(&Lookaside
->L
.ListHead
,
1000 (PSLIST_ENTRY
)Entry
,
1001 &Lookaside
->Lock__ObsoleteButDoNotDelete
);
1003 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);