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
;
312 Exfi386InterlockedIncrementLong(
313 IN OUT LONG
volatile *Addend
);
318 Exfi386InterlockedDecrementLong(
324 Exfi386InterlockedExchangeUlong(
332 #define ExDisableResourceBoost ExDisableResourceBoostLite
335 ExInitializePushLock (
336 OUT PEX_PUSH_LOCK PushLock
);
339 #if (NTDDI_VERSION >= NTDDI_WIN2K)
344 ExAcquireFastMutexUnsafe(
345 IN OUT PFAST_MUTEX FastMutex
);
350 ExReleaseFastMutexUnsafe(
351 IN OUT PFAST_MUTEX FastMutex
);
356 ExAcquireResourceExclusiveLite(
357 IN OUT PERESOURCE Resource
,
363 ExAcquireResourceSharedLite(
364 IN OUT PERESOURCE Resource
,
370 ExAcquireSharedStarveExclusive(
371 IN OUT PERESOURCE Resource
,
377 ExAcquireSharedWaitForExclusive(
378 IN OUT PERESOURCE Resource
,
385 IN POOL_TYPE PoolType
,
386 IN SIZE_T NumberOfBytes
);
391 ExAllocatePoolWithQuota(
392 IN POOL_TYPE PoolType
,
393 IN SIZE_T NumberOfBytes
);
398 ExAllocatePoolWithQuotaTag(
399 IN POOL_TYPE PoolType
,
400 IN SIZE_T NumberOfBytes
,
404 #define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b)
410 ExAllocatePoolWithTag(
411 IN POOL_TYPE PoolType
,
412 IN SIZE_T NumberOfBytes
,
416 #define ExAllocatePoolWithTag(a,b,c) ExAllocatePool(a,b)
422 ExAllocatePoolWithTagPriority(
423 IN POOL_TYPE PoolType
,
424 IN SIZE_T NumberOfBytes
,
426 IN EX_POOL_PRIORITY Priority
);
431 ExConvertExclusiveToSharedLite(
432 IN OUT PERESOURCE Resource
);
438 OUT PCALLBACK_OBJECT
*CallbackObject
,
439 IN POBJECT_ATTRIBUTES ObjectAttributes
,
441 IN BOOLEAN AllowMultipleCallbacks
);
446 ExDeleteNPagedLookasideList(
447 IN OUT PNPAGED_LOOKASIDE_LIST Lookaside
);
452 ExDeletePagedLookasideList(
453 IN PPAGED_LOOKASIDE_LIST Lookaside
);
458 ExDeleteResourceLite(
459 IN OUT PERESOURCE Resource
);
477 ExGetExclusiveWaiterCount(
478 IN PERESOURCE Resource
);
483 ExGetPreviousMode(VOID
);
488 ExGetSharedWaiterCount(
489 IN PERESOURCE Resource
);
494 ExInitializeNPagedLookasideList(
495 IN PNPAGED_LOOKASIDE_LIST Lookaside
,
496 IN PALLOCATE_FUNCTION Allocate OPTIONAL
,
497 IN PFREE_FUNCTION Free OPTIONAL
,
506 ExInitializePagedLookasideList(
507 IN PPAGED_LOOKASIDE_LIST Lookaside
,
508 IN PALLOCATE_FUNCTION Allocate OPTIONAL
,
509 IN PFREE_FUNCTION Free OPTIONAL
,
518 ExInitializeResourceLite(
519 OUT PERESOURCE Resource
);
524 ExInterlockedAddLargeInteger(
525 IN PLARGE_INTEGER Addend
,
526 IN LARGE_INTEGER Increment
,
527 IN PKSPIN_LOCK Lock
);
530 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
531 (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment)
533 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
534 _InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment)
540 ExInterlockedAddUlong(
543 IN OUT PKSPIN_LOCK Lock
);
545 #if defined(_AMD64_) || defined(_IA64_)
547 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
548 InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand))
555 ExfInterlockedCompareExchange64(
556 IN OUT LONGLONG
volatile *Destination
,
557 IN PLONGLONG Exchange
,
558 IN PLONGLONG Comperand
);
560 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
561 ExfInterlockedCompareExchange64(Destination, Exchange, Comperand)
568 ExInterlockedCompareExchange64(
569 IN OUT LONGLONG
volatile *Destination
,
570 IN PLONGLONG Exchange
,
571 IN PLONGLONG Comparand
,
572 IN PKSPIN_LOCK Lock
);
574 #endif /* defined(_AMD64_) || defined(_IA64_) */
579 ExInterlockedInsertHeadList(
580 IN OUT PLIST_ENTRY ListHead
,
581 IN OUT PLIST_ENTRY ListEntry
,
582 IN OUT PKSPIN_LOCK Lock
);
587 ExInterlockedInsertTailList(
588 IN OUT PLIST_ENTRY ListHead
,
589 IN OUT PLIST_ENTRY ListEntry
,
590 IN OUT PKSPIN_LOCK Lock
);
595 ExInterlockedPopEntryList(
596 IN OUT PSINGLE_LIST_ENTRY ListHead
,
597 IN OUT PKSPIN_LOCK Lock
);
602 ExInterlockedPushEntryList(
603 IN OUT PSINGLE_LIST_ENTRY ListHead
,
604 IN OUT PSINGLE_LIST_ENTRY ListEntry
,
605 IN OUT PKSPIN_LOCK Lock
);
610 ExInterlockedRemoveHeadList(
611 IN OUT PLIST_ENTRY ListHead
,
612 IN OUT PKSPIN_LOCK Lock
);
617 ExIsProcessorFeaturePresent(
618 IN ULONG ProcessorFeature
);
623 ExIsResourceAcquiredExclusiveLite(
624 IN PERESOURCE Resource
);
629 ExIsResourceAcquiredSharedLite(
630 IN PERESOURCE Resource
);
632 #define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite
637 ExLocalTimeToSystemTime(
638 IN PLARGE_INTEGER LocalTime
,
639 OUT PLARGE_INTEGER SystemTime
);
645 IN PCALLBACK_OBJECT CallbackObject
,
646 IN PVOID Argument1 OPTIONAL
,
647 IN PVOID Argument2 OPTIONAL
);
653 IN OUT PWORK_QUEUE_ITEM WorkItem
,
654 IN WORK_QUEUE_TYPE QueueType
);
667 IN PCALLBACK_OBJECT CallbackObject
,
668 IN PCALLBACK_FUNCTION CallbackFunction
,
669 IN PVOID CallbackContext OPTIONAL
);
674 ExReinitializeResourceLite(
675 IN OUT PERESOURCE Resource
);
680 ExReleaseResourceForThreadLite(
681 IN OUT PERESOURCE Resource
,
682 IN ERESOURCE_THREAD ResourceThreadId
);
687 ExReleaseResourceLite(
688 IN OUT PERESOURCE Resource
);
693 ExSetResourceOwnerPointer(
694 IN OUT PERESOURCE Resource
,
695 IN PVOID OwnerPointer
);
700 ExSetTimerResolution(
701 IN ULONG DesiredTime
,
702 IN BOOLEAN SetResolution
);
707 ExSystemTimeToLocalTime(
708 IN PLARGE_INTEGER SystemTime
,
709 OUT PLARGE_INTEGER LocalTime
);
714 ExUnregisterCallback(
715 IN OUT PVOID CbRegistration
);
723 IN OUT PZONE_HEADER Zone
,
724 IN OUT PVOID Segment
,
725 IN ULONG SegmentSize
);
731 OUT PZONE_HEADER Zone
,
733 IN OUT PVOID InitialSegment
,
734 IN ULONG InitialSegmentSize
);
739 ExInterlockedExtendZone(
740 IN OUT PZONE_HEADER Zone
,
741 IN OUT PVOID Segment
,
742 IN ULONG SegmentSize
,
743 IN OUT PKSPIN_LOCK Lock
);
755 ExRaiseAccessViolation(VOID
);
761 ExRaiseDatatypeMisalignment(VOID
);
769 ExQueryPoolBlockSize(
771 OUT PBOOLEAN QuotaCharged
);
774 ExAdjustLookasideDepth(
780 ExDisableResourceBoostLite(
781 IN PERESOURCE Resource
);
783 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
785 $
if (_WDMDDK_
|| _NTIFS_
)
786 #if (NTDDI_VERSION >= NTDDI_WINXP)
793 ExAcquireRundownProtection(
794 IN OUT PEX_RUNDOWN_REF RunRef
);
799 ExInitializeRundownProtection(
800 OUT PEX_RUNDOWN_REF RunRef
);
805 ExReInitializeRundownProtection(
806 IN OUT PEX_RUNDOWN_REF RunRef
);
811 ExReleaseRundownProtection(
812 IN OUT PEX_RUNDOWN_REF RunRef
);
818 OUT PEX_RUNDOWN_REF RunRef
);
824 IN SUITE_TYPE SuiteType
);
829 ExWaitForRundownProtectionRelease(
830 IN OUT PEX_RUNDOWN_REF RunRef
);
836 InterlockedPushListSList(
837 IN OUT PSLIST_HEADER ListHead
,
838 IN OUT PSLIST_ENTRY List
,
839 IN OUT PSLIST_ENTRY ListEnd
,
842 $
if (_WDMDDK_
|| _NTIFS_
)
843 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
847 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
852 ExAcquireRundownProtectionEx(
853 IN OUT PEX_RUNDOWN_REF RunRef
,
859 ExReleaseRundownProtectionEx(
860 IN OUT PEX_RUNDOWN_REF RunRef
,
863 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) */
865 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
868 PEX_RUNDOWN_REF_CACHE_AWARE
870 ExAllocateCacheAwareRundownProtection(
871 IN POOL_TYPE PoolType
,
877 ExSizeOfRundownProtectionCacheAware(VOID
);
882 ExEnterCriticalRegionAndAcquireResourceShared(
883 IN OUT PERESOURCE Resource
);
888 ExEnterCriticalRegionAndAcquireResourceExclusive(
889 IN OUT PERESOURCE Resource
);
894 ExEnterCriticalRegionAndAcquireSharedWaitForExclusive(
895 IN OUT PERESOURCE Resource
);
900 ExReleaseResourceAndLeaveCriticalRegion(
901 IN OUT PERESOURCE Resource
);
906 ExInitializeRundownProtectionCacheAware(
907 OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware
,
908 IN SIZE_T RunRefSize
);
913 ExFreeCacheAwareRundownProtection(
914 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware
);
919 ExAcquireRundownProtectionCacheAware(
920 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware
);
925 ExReleaseRundownProtectionCacheAware(
926 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware
);
931 ExAcquireRundownProtectionCacheAwareEx(
932 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware
,
938 ExReleaseRundownProtectionCacheAwareEx(
939 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRef
,
945 ExWaitForRundownProtectionReleaseCacheAware(
946 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRef
);
951 ExReInitializeRundownProtectionCacheAware(
952 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware
);
957 ExRundownCompletedCacheAware(
958 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware
);
960 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
962 #if (NTDDI_VERSION >= NTDDI_VISTA)
967 ExInitializeLookasideListEx(
968 OUT PLOOKASIDE_LIST_EX Lookaside
,
969 IN PALLOCATE_FUNCTION_EX Allocate OPTIONAL
,
970 IN PFREE_FUNCTION_EX Free OPTIONAL
,
971 IN POOL_TYPE PoolType
,
980 ExDeleteLookasideListEx(
981 IN OUT PLOOKASIDE_LIST_EX Lookaside
);
986 ExFlushLookasideListEx(
987 IN OUT PLOOKASIDE_LIST_EX Lookaside
);
991 ExAllocateFromLookasideListEx(
992 IN OUT PLOOKASIDE_LIST_EX Lookaside
)
996 Lookaside
->L
.TotalAllocates
+= 1;
997 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
999 Lookaside
->L
.AllocateMisses
+= 1;
1000 Entry
= (Lookaside
->L
.AllocateEx
)(Lookaside
->L
.Type
,
1010 ExFreeToLookasideListEx(
1011 IN OUT PLOOKASIDE_LIST_EX Lookaside
,
1014 Lookaside
->L
.TotalFrees
+= 1;
1015 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
1016 Lookaside
->L
.FreeMisses
+= 1;
1017 (Lookaside
->L
.FreeEx
)(Entry
, Lookaside
);
1019 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);
1024 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
1026 #if (NTDDI_VERSION >= NTDDI_WIN7)
1031 ExSetResourceOwnerPointerEx(
1032 IN OUT PERESOURCE Resource
,
1033 IN PVOID OwnerPointer
,
1036 #define FLAG_OWNER_POINTER_IS_THREAD 0x1
1038 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
1040 static __inline PVOID
1041 ExAllocateFromNPagedLookasideList(
1042 IN OUT PNPAGED_LOOKASIDE_LIST Lookaside
)
1046 Lookaside
->L
.TotalAllocates
++;
1047 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
1048 Entry
= ExInterlockedPopEntrySList(&Lookaside
->L
.ListHead
,
1049 &Lookaside
->Lock__ObsoleteButDoNotDelete
);
1051 Entry
= InterlockedPopEntrySList(&Lookaside
->L
.ListHead
);
1053 if (Entry
== NULL
) {
1054 Lookaside
->L
.AllocateMisses
++;
1055 Entry
= (Lookaside
->L
.Allocate
)(Lookaside
->L
.Type
,
1062 static __inline VOID
1063 ExFreeToNPagedLookasideList(
1064 IN OUT PNPAGED_LOOKASIDE_LIST Lookaside
,
1067 Lookaside
->L
.TotalFrees
++;
1068 if (ExQueryDepthSList(&Lookaside
->L
.ListHead
) >= Lookaside
->L
.Depth
) {
1069 Lookaside
->L
.FreeMisses
++;
1070 (Lookaside
->L
.Free
)(Entry
);
1072 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
1073 ExInterlockedPushEntrySList(&Lookaside
->L
.ListHead
,
1074 (PSLIST_ENTRY
)Entry
,
1075 &Lookaside
->Lock__ObsoleteButDoNotDelete
);
1077 InterlockedPushEntrySList(&Lookaside
->L
.ListHead
, (PSLIST_ENTRY
)Entry
);