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 #endif /* !defined(_WIN64) */
127 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
132 ExInterlockedPopEntrySList(
133 IN PSLIST_HEADER ListHead
,
134 IN PKSPIN_LOCK Lock
);
139 ExInterlockedPushEntrySList(
140 IN PSLIST_HEADER ListHead
,
141 IN PSINGLE_LIST_ENTRY ListEntry
,
142 IN PKSPIN_LOCK Lock
);
147 ExAllocateFromPagedLookasideList(
148 IN OUT PPAGED_LOOKASIDE_LIST Lookaside
);
153 ExFreeToPagedLookasideList(
154 IN OUT PPAGED_LOOKASIDE_LIST Lookaside
,
157 #else /* !_WIN2K_COMPAT_SLIST_USAGE */
160 #define ExInterlockedPopEntrySList(_ListHead, _Lock) \
161 InterlockedPopEntrySList(_ListHead)
162 #define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \
163 InterlockedPushEntrySList(_ListHead, _ListEntry)
168 ExAllocateFromPagedLookasideList(
169 IN OUT PPAGED_LOOKASIDE_LIST Lookaside
)
173 Lookaside
->L
.TotalAllocates
++;
174 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
176 Lookaside
->L
.AllocateMisses
++;
177 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
,
186 ExFreeToPagedLookasideList(
187 IN OUT PPAGED_LOOKASIDE_LIST Lookaside
,
190 Lookaside
->L
.TotalFrees
++;
191 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
192 Lookaside
->L
.FreeMisses
++;
193 (Lookaside
->L
.Free
)(Entry
);
195 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
199 #endif /* _WIN2K_COMPAT_SLIST_USAGE */
203 * ExGetCurrentResourceThread(
206 #define ExGetCurrentResourceThread() ((ULONG_PTR)PsGetCurrentThread())
208 #define ExReleaseResource(R) (ExReleaseResourceLite(R))
211 * ExInitializeWorkItem(
212 * IN PWORK_QUEUE_ITEM Item,
213 * IN PWORKER_THREAD_ROUTINE Routine,
216 #define ExInitializeWorkItem(Item, Routine, Context) \
218 (Item)->WorkerRoutine = Routine; \
219 (Item)->Parameter = Context; \
220 (Item)->List.Flink = NULL; \
225 ExInitializeFastMutex(
226 OUT PFAST_MUTEX FastMutex
)
228 FastMutex
->Count
= FM_LOCK_BIT
;
229 FastMutex
->Owner
= NULL
;
230 FastMutex
->Contention
= 0;
231 KeInitializeEvent(&FastMutex
->Event
, SynchronizationEvent
, FALSE
);
237 static __inline PVOID
239 IN PZONE_HEADER Zone
)
241 if (Zone
->FreeList
.Next
)
242 Zone
->FreeList
.Next
= Zone
->FreeList
.Next
->Next
;
243 return (PVOID
) Zone
->FreeList
.Next
;
246 static __inline PVOID
248 IN PZONE_HEADER Zone
,
251 ((PSINGLE_LIST_ENTRY
) Block
)->Next
= Zone
->FreeList
.Next
;
252 Zone
->FreeList
.Next
= ((PSINGLE_LIST_ENTRY
) Block
);
253 return ((PSINGLE_LIST_ENTRY
) Block
)->Next
;
258 * ExInterlockedAllocateFromZone(
259 * IN PZONE_HEADER Zone,
260 * IN PKSPIN_LOCK Lock)
262 #define ExInterlockedAllocateFromZone(Zone, Lock) \
263 ((PVOID) ExInterlockedPopEntryList(&Zone->FreeList, Lock))
266 * ExInterlockedFreeToZone(
267 * IN PZONE_HEADER Zone,
269 * IN PKSPIN_LOCK Lock);
271 #define ExInterlockedFreeToZone(Zone, Block, Lock) \
272 ExInterlockedPushEntryList(&(Zone)->FreeList, (PSINGLE_LIST_ENTRY)(Block), Lock)
277 * IN PZONE_HEADER Zone)
279 #define ExIsFullZone(Zone) \
280 ((Zone)->FreeList.Next == (PSINGLE_LIST_ENTRY) NULL)
283 * ExIsObjectInFirstZoneSegment(
284 * IN PZONE_HEADER Zone,
287 #define ExIsObjectInFirstZoneSegment(Zone,Object) \
288 ((BOOLEAN)( ((PUCHAR)(Object) >= (PUCHAR)(Zone)->SegmentList.Next) && \
289 ((PUCHAR)(Object) < (PUCHAR)(Zone)->SegmentList.Next + \
290 (Zone)->TotalSegmentSize)) )
292 #define ExAcquireResourceExclusive ExAcquireResourceExclusiveLite
293 #define ExAcquireResourceShared ExAcquireResourceSharedLite
294 #define ExConvertExclusiveToShared ExConvertExclusiveToSharedLite
295 #define ExDeleteResource ExDeleteResourceLite
296 #define ExInitializeResource ExInitializeResourceLite
297 #define ExIsResourceAcquiredExclusive ExIsResourceAcquiredExclusiveLite
298 #define ExIsResourceAcquiredShared ExIsResourceAcquiredSharedLite
299 #define ExIsResourceAcquired ExIsResourceAcquiredSharedLite
300 #define ExReleaseResourceForThread ExReleaseResourceForThreadLite
302 typedef enum _INTERLOCKED_RESULT
{
303 ResultNegative
= RESULT_NEGATIVE
,
304 ResultZero
= RESULT_ZERO
,
305 ResultPositive
= RESULT_POSITIVE
306 } INTERLOCKED_RESULT
;
313 Exfi386InterlockedIncrementLong(
314 IN OUT LONG
volatile *Addend
);
319 Exfi386InterlockedDecrementLong(
325 Exfi386InterlockedExchangeUlong(
334 #define ExDisableResourceBoost ExDisableResourceBoostLite
337 ExInitializePushLock (
338 OUT PEX_PUSH_LOCK PushLock
);
341 #if (NTDDI_VERSION >= NTDDI_WIN2K)
346 ExAcquireFastMutexUnsafe(
347 IN OUT PFAST_MUTEX FastMutex
);
352 ExReleaseFastMutexUnsafe(
353 IN OUT PFAST_MUTEX FastMutex
);
358 ExAcquireResourceExclusiveLite(
359 IN OUT PERESOURCE Resource
,
365 ExAcquireResourceSharedLite(
366 IN OUT PERESOURCE Resource
,
372 ExAcquireSharedStarveExclusive(
373 IN OUT PERESOURCE Resource
,
379 ExAcquireSharedWaitForExclusive(
380 IN OUT PERESOURCE Resource
,
387 IN POOL_TYPE PoolType
,
388 IN SIZE_T NumberOfBytes
);
393 ExAllocatePoolWithQuota(
394 IN POOL_TYPE PoolType
,
395 IN SIZE_T NumberOfBytes
);
400 ExAllocatePoolWithQuotaTag(
401 IN POOL_TYPE PoolType
,
402 IN SIZE_T NumberOfBytes
,
406 #define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b)
412 ExAllocatePoolWithTag(
413 IN POOL_TYPE PoolType
,
414 IN SIZE_T NumberOfBytes
,
418 #define ExAllocatePoolWithTag(a,b,c) ExAllocatePool(a,b)
424 ExAllocatePoolWithTagPriority(
425 IN POOL_TYPE PoolType
,
426 IN SIZE_T NumberOfBytes
,
428 IN EX_POOL_PRIORITY Priority
);
433 ExConvertExclusiveToSharedLite(
434 IN OUT PERESOURCE Resource
);
440 OUT PCALLBACK_OBJECT
*CallbackObject
,
441 IN POBJECT_ATTRIBUTES ObjectAttributes
,
443 IN BOOLEAN AllowMultipleCallbacks
);
448 ExDeleteNPagedLookasideList(
449 IN OUT PNPAGED_LOOKASIDE_LIST Lookaside
);
454 ExDeletePagedLookasideList(
455 IN PPAGED_LOOKASIDE_LIST Lookaside
);
460 ExDeleteResourceLite(
461 IN OUT PERESOURCE Resource
);
479 ExGetExclusiveWaiterCount(
480 IN PERESOURCE Resource
);
485 ExGetPreviousMode(VOID
);
490 ExGetSharedWaiterCount(
491 IN PERESOURCE Resource
);
496 ExInitializeNPagedLookasideList(
497 IN PNPAGED_LOOKASIDE_LIST Lookaside
,
498 IN PALLOCATE_FUNCTION Allocate OPTIONAL
,
499 IN PFREE_FUNCTION Free OPTIONAL
,
508 ExInitializePagedLookasideList(
509 IN PPAGED_LOOKASIDE_LIST Lookaside
,
510 IN PALLOCATE_FUNCTION Allocate OPTIONAL
,
511 IN PFREE_FUNCTION Free OPTIONAL
,
520 ExInitializeResourceLite(
521 OUT PERESOURCE Resource
);
526 ExInterlockedAddLargeInteger(
527 IN PLARGE_INTEGER Addend
,
528 IN LARGE_INTEGER Increment
,
529 IN PKSPIN_LOCK Lock
);
532 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
533 (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment)
535 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
536 _InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment)
542 ExInterlockedAddUlong(
545 IN OUT PKSPIN_LOCK Lock
);
547 #if defined(_AMD64_) || defined(_IA64_)
549 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
550 InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand))
557 ExfInterlockedCompareExchange64(
558 IN OUT LONGLONG
volatile *Destination
,
559 IN PLONGLONG Exchange
,
560 IN PLONGLONG Comperand
);
562 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
563 ExfInterlockedCompareExchange64(Destination, Exchange, Comperand)
570 ExInterlockedCompareExchange64(
571 IN OUT LONGLONG
volatile *Destination
,
572 IN PLONGLONG Exchange
,
573 IN PLONGLONG Comparand
,
574 IN PKSPIN_LOCK Lock
);
576 #endif /* defined(_AMD64_) || defined(_IA64_) */
581 ExInterlockedInsertHeadList(
582 IN OUT PLIST_ENTRY ListHead
,
583 IN OUT PLIST_ENTRY ListEntry
,
584 IN OUT PKSPIN_LOCK Lock
);
589 ExInterlockedInsertTailList(
590 IN OUT PLIST_ENTRY ListHead
,
591 IN OUT PLIST_ENTRY ListEntry
,
592 IN OUT PKSPIN_LOCK Lock
);
597 ExInterlockedPopEntryList(
598 IN OUT PSINGLE_LIST_ENTRY ListHead
,
599 IN OUT PKSPIN_LOCK Lock
);
604 ExInterlockedPushEntryList(
605 IN OUT PSINGLE_LIST_ENTRY ListHead
,
606 IN OUT PSINGLE_LIST_ENTRY ListEntry
,
607 IN OUT PKSPIN_LOCK Lock
);
612 ExInterlockedRemoveHeadList(
613 IN OUT PLIST_ENTRY ListHead
,
614 IN OUT PKSPIN_LOCK Lock
);
619 ExIsProcessorFeaturePresent(
620 IN ULONG ProcessorFeature
);
625 ExIsResourceAcquiredExclusiveLite(
626 IN PERESOURCE Resource
);
631 ExIsResourceAcquiredSharedLite(
632 IN PERESOURCE Resource
);
634 #define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite
639 ExLocalTimeToSystemTime(
640 IN PLARGE_INTEGER LocalTime
,
641 OUT PLARGE_INTEGER SystemTime
);
647 IN PCALLBACK_OBJECT CallbackObject
,
648 IN PVOID Argument1 OPTIONAL
,
649 IN PVOID Argument2 OPTIONAL
);
655 IN OUT PWORK_QUEUE_ITEM WorkItem
,
656 IN WORK_QUEUE_TYPE QueueType
);
669 IN PCALLBACK_OBJECT CallbackObject
,
670 IN PCALLBACK_FUNCTION CallbackFunction
,
671 IN PVOID CallbackContext OPTIONAL
);
676 ExReinitializeResourceLite(
677 IN OUT PERESOURCE Resource
);
682 ExReleaseResourceForThreadLite(
683 IN OUT PERESOURCE Resource
,
684 IN ERESOURCE_THREAD ResourceThreadId
);
689 ExReleaseResourceLite(
690 IN OUT PERESOURCE Resource
);
695 ExSetResourceOwnerPointer(
696 IN OUT PERESOURCE Resource
,
697 IN PVOID OwnerPointer
);
702 ExSetTimerResolution(
703 IN ULONG DesiredTime
,
704 IN BOOLEAN SetResolution
);
709 ExSystemTimeToLocalTime(
710 IN PLARGE_INTEGER SystemTime
,
711 OUT PLARGE_INTEGER LocalTime
);
716 ExUnregisterCallback(
717 IN OUT PVOID CbRegistration
);
725 IN OUT PZONE_HEADER Zone
,
726 IN OUT PVOID Segment
,
727 IN ULONG SegmentSize
);
733 OUT PZONE_HEADER Zone
,
735 IN OUT PVOID InitialSegment
,
736 IN ULONG InitialSegmentSize
);
741 ExInterlockedExtendZone(
742 IN OUT PZONE_HEADER Zone
,
743 IN OUT PVOID Segment
,
744 IN ULONG SegmentSize
,
745 IN OUT PKSPIN_LOCK Lock
);
757 ExRaiseAccessViolation(VOID
);
763 ExRaiseDatatypeMisalignment(VOID
);
771 ExQueryPoolBlockSize(
773 OUT PBOOLEAN QuotaCharged
);
776 ExAdjustLookasideDepth(
782 ExDisableResourceBoostLite(
783 IN PERESOURCE Resource
);
785 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
787 $
if (_WDMDDK_
|| _NTIFS_
)
788 #if (NTDDI_VERSION >= NTDDI_WINXP)
795 ExAcquireRundownProtection(
796 IN OUT PEX_RUNDOWN_REF RunRef
);
801 ExInitializeRundownProtection(
802 OUT PEX_RUNDOWN_REF RunRef
);
807 ExReInitializeRundownProtection(
808 IN OUT PEX_RUNDOWN_REF RunRef
);
813 ExReleaseRundownProtection(
814 IN OUT PEX_RUNDOWN_REF RunRef
);
820 OUT PEX_RUNDOWN_REF RunRef
);
826 IN SUITE_TYPE SuiteType
);
831 ExWaitForRundownProtectionRelease(
832 IN OUT PEX_RUNDOWN_REF RunRef
);
838 InterlockedPushListSList(
839 IN OUT PSLIST_HEADER ListHead
,
840 IN OUT PSLIST_ENTRY List
,
841 IN OUT PSLIST_ENTRY ListEnd
,
844 $
if (_WDMDDK_
|| _NTIFS_
)
845 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
849 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
854 ExAcquireRundownProtectionEx(
855 IN OUT PEX_RUNDOWN_REF RunRef
,
861 ExReleaseRundownProtectionEx(
862 IN OUT PEX_RUNDOWN_REF RunRef
,
865 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) */
867 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
870 PEX_RUNDOWN_REF_CACHE_AWARE
872 ExAllocateCacheAwareRundownProtection(
873 IN POOL_TYPE PoolType
,
879 ExSizeOfRundownProtectionCacheAware(VOID
);
884 ExEnterCriticalRegionAndAcquireResourceShared(
885 IN OUT PERESOURCE Resource
);
890 ExEnterCriticalRegionAndAcquireResourceExclusive(
891 IN OUT PERESOURCE Resource
);
896 ExEnterCriticalRegionAndAcquireSharedWaitForExclusive(
897 IN OUT PERESOURCE Resource
);
902 ExReleaseResourceAndLeaveCriticalRegion(
903 IN OUT PERESOURCE Resource
);
908 ExInitializeRundownProtectionCacheAware(
909 OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware
,
910 IN SIZE_T RunRefSize
);
915 ExFreeCacheAwareRundownProtection(
916 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware
);
921 ExAcquireRundownProtectionCacheAware(
922 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware
);
927 ExReleaseRundownProtectionCacheAware(
928 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware
);
933 ExAcquireRundownProtectionCacheAwareEx(
934 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware
,
940 ExReleaseRundownProtectionCacheAwareEx(
941 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRef
,
947 ExWaitForRundownProtectionReleaseCacheAware(
948 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRef
);
953 ExReInitializeRundownProtectionCacheAware(
954 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware
);
959 ExRundownCompletedCacheAware(
960 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware
);
962 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
964 #if (NTDDI_VERSION >= NTDDI_VISTA)
969 ExInitializeLookasideListEx(
970 OUT PLOOKASIDE_LIST_EX Lookaside
,
971 IN PALLOCATE_FUNCTION_EX Allocate OPTIONAL
,
972 IN PFREE_FUNCTION_EX Free OPTIONAL
,
973 IN POOL_TYPE PoolType
,
982 ExDeleteLookasideListEx(
983 IN OUT PLOOKASIDE_LIST_EX Lookaside
);
988 ExFlushLookasideListEx(
989 IN OUT PLOOKASIDE_LIST_EX Lookaside
);
993 ExAllocateFromLookasideListEx(
994 IN OUT PLOOKASIDE_LIST_EX Lookaside
)
998 Lookaside
->L
.TotalAllocates
+= 1;
999 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
1000 if (Entry
== NULL
) {
1001 Lookaside
->L
.AllocateMisses
+= 1;
1002 Entry
= (Lookaside
->L
.AllocateEx
)(Lookaside
->L
.Type
,
1012 ExFreeToLookasideListEx(
1013 IN OUT PLOOKASIDE_LIST_EX Lookaside
,
1016 Lookaside
->L
.TotalFrees
+= 1;
1017 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
1018 Lookaside
->L
.FreeMisses
+= 1;
1019 (Lookaside
->L
.FreeEx
)(Entry
, Lookaside
);
1021 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
1026 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
1028 #if (NTDDI_VERSION >= NTDDI_WIN7)
1033 ExSetResourceOwnerPointerEx(
1034 IN OUT PERESOURCE Resource
,
1035 IN PVOID OwnerPointer
,
1038 #define FLAG_OWNER_POINTER_IS_THREAD 0x1
1040 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
1042 static __inline PVOID
1043 ExAllocateFromNPagedLookasideList(
1044 IN OUT PNPAGED_LOOKASIDE_LIST Lookaside
)
1048 Lookaside
->L
.TotalAllocates
++;
1049 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
1050 Entry
= ExInterlockedPopEntrySList(&Lookaside
->L
.ListHead
,
1051 &Lookaside
->Lock__ObsoleteButDoNotDelete
);
1053 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
1055 if (Entry
== NULL
) {
1056 Lookaside
->L
.AllocateMisses
++;
1057 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
,
1064 static __inline VOID
1065 ExFreeToNPagedLookasideList(
1066 IN OUT PNPAGED_LOOKASIDE_LIST Lookaside
,
1069 Lookaside
->L
.TotalFrees
++;
1070 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
1071 Lookaside
->L
.FreeMisses
++;
1072 (Lookaside
->L
.Free
)(Entry
);
1074 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
1075 ExInterlockedPushEntrySList(&Lookaside
->L
.ListHead
,
1076 (PSLIST_ENTRY
)Entry
,
1077 &Lookaside
->Lock__ObsoleteButDoNotDelete
);
1079 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);