#else /* !defined(_WIN64) */
+#ifdef NONAMELESSUNION
+#define ExQueryDepthSList(listhead) (listhead)->s.Depth
+#else
#define ExQueryDepthSList(listhead) (listhead)->Depth
+#endif
NTKERNELAPI
PSINGLE_LIST_ENTRY
ExInterlockedFlushSList(
IN OUT PSLIST_HEADER ListHead);
+#endif /* !defined(_WIN64) */
+
#if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
NTKERNELAPI
IN OUT PPAGED_LOOKASIDE_LIST Lookaside,
IN PVOID Entry);
-#else
+#else /* !_WIN2K_COMPAT_SLIST_USAGE */
+#if !defined(_WIN64)
#define ExInterlockedPopEntrySList(_ListHead, _Lock) \
InterlockedPopEntrySList(_ListHead)
#define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \
InterlockedPushEntrySList(_ListHead, _ListEntry)
+#endif
static __inline
PVOID
PVOID Entry;
Lookaside->L.TotalAllocates++;
+#ifdef NONAMELESSUNION
+ Entry = InterlockedPopEntrySList(&Lookaside->L.u.ListHead);
+ if (Entry == NULL) {
+ Lookaside->L.u2.AllocateMisses++;
+ Entry = (Lookaside->L.u4.Allocate)(Lookaside->L.Type,
+ Lookaside->L.Size,
+ Lookaside->L.Tag);
+ }
+#else /* NONAMELESSUNION */
Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
if (Entry == NULL) {
Lookaside->L.AllocateMisses++;
Lookaside->L.Size,
Lookaside->L.Tag);
}
+#endif /* NONAMELESSUNION */
return Entry;
}
IN PVOID Entry)
{
Lookaside->L.TotalFrees++;
+#ifdef NONAMELESSUNION
+ if (ExQueryDepthSList(&Lookaside->L.u.ListHead) >= Lookaside->L.Depth) {
+ Lookaside->L.u3.FreeMisses++;
+ (Lookaside->L.u5.Free)(Entry);
+ } else {
+ InterlockedPushEntrySList(&Lookaside->L.u.ListHead, (PSLIST_ENTRY)Entry);
+ }
+#else /* NONAMELESSUNION */
if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
Lookaside->L.FreeMisses++;
(Lookaside->L.Free)(Entry);
} else {
InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
}
+#endif /* NONAMELESSUNION */
}
#endif /* _WIN2K_COMPAT_SLIST_USAGE */
-#endif /* !defined(_WIN64) */
/* ERESOURCE_THREAD
* ExGetCurrentResourceThread(
return;
}
-#if (NTDDI_VERSION >= NTDDI_WIN2K)
+$endif (_WDMDDK_)
+$if (_NTDDK_)
+static __inline PVOID
+ExAllocateFromZone(
+ IN PZONE_HEADER Zone)
+{
+ if (Zone->FreeList.Next)
+ Zone->FreeList.Next = Zone->FreeList.Next->Next;
+ return (PVOID) Zone->FreeList.Next;
+}
+
+static __inline PVOID
+ExFreeToZone(
+ IN PZONE_HEADER Zone,
+ IN PVOID Block)
+{
+ ((PSINGLE_LIST_ENTRY) Block)->Next = Zone->FreeList.Next;
+ Zone->FreeList.Next = ((PSINGLE_LIST_ENTRY) Block);
+ return ((PSINGLE_LIST_ENTRY) Block)->Next;
+}
+
+/*
+ * PVOID
+ * ExInterlockedAllocateFromZone(
+ * IN PZONE_HEADER Zone,
+ * IN PKSPIN_LOCK Lock)
+ */
+#define ExInterlockedAllocateFromZone(Zone, Lock) \
+ ((PVOID) ExInterlockedPopEntryList(&Zone->FreeList, Lock))
+
+/* PVOID
+ * ExInterlockedFreeToZone(
+ * IN PZONE_HEADER Zone,
+ * IN PVOID Block,
+ * IN PKSPIN_LOCK Lock);
+ */
+#define ExInterlockedFreeToZone(Zone, Block, Lock) \
+ ExInterlockedPushEntryList(&(Zone)->FreeList, (PSINGLE_LIST_ENTRY)(Block), Lock)
+
+/*
+ * BOOLEAN
+ * ExIsFullZone(
+ * IN PZONE_HEADER Zone)
+ */
+#define ExIsFullZone(Zone) \
+ ((Zone)->FreeList.Next == (PSINGLE_LIST_ENTRY) NULL)
+
+/* BOOLEAN
+ * ExIsObjectInFirstZoneSegment(
+ * IN PZONE_HEADER Zone,
+ * IN PVOID Object);
+ */
+#define ExIsObjectInFirstZoneSegment(Zone,Object) \
+ ((BOOLEAN)( ((PUCHAR)(Object) >= (PUCHAR)(Zone)->SegmentList.Next) && \
+ ((PUCHAR)(Object) < (PUCHAR)(Zone)->SegmentList.Next + \
+ (Zone)->TotalSegmentSize)) )
+
+#define ExAcquireResourceExclusive ExAcquireResourceExclusiveLite
+#define ExAcquireResourceShared ExAcquireResourceSharedLite
+#define ExConvertExclusiveToShared ExConvertExclusiveToSharedLite
+#define ExDeleteResource ExDeleteResourceLite
+#define ExInitializeResource ExInitializeResourceLite
+#define ExIsResourceAcquiredExclusive ExIsResourceAcquiredExclusiveLite
+#define ExIsResourceAcquiredShared ExIsResourceAcquiredSharedLite
+#define ExIsResourceAcquired ExIsResourceAcquiredSharedLite
+#define ExReleaseResourceForThread ExReleaseResourceForThreadLite
+
+#ifndef _M_IX86
+#define RESULT_ZERO 0
+#define RESULT_NEGATIVE 1
+#define RESULT_POSITIVE 2
+#endif
+
+typedef enum _INTERLOCKED_RESULT {
+ ResultNegative = RESULT_NEGATIVE,
+ ResultZero = RESULT_ZERO,
+ ResultPositive = RESULT_POSITIVE
+} INTERLOCKED_RESULT;
+
+#ifdef _X86_
+
+NTKERNELAPI
+INTERLOCKED_RESULT
+FASTCALL
+Exfi386InterlockedIncrementLong(
+ IN OUT LONG volatile *Addend);
+
+NTKERNELAPI
+INTERLOCKED_RESULT
+FASTCALL
+Exfi386InterlockedDecrementLong(
+ IN PLONG Addend);
+NTKERNELAPI
+ULONG
+FASTCALL
+Exfi386InterlockedExchangeUlong(
+ IN PULONG Target,
+ IN ULONG Value);
+
+#endif
+
+$endif (_NTDDK_)
+$if (_NTIFS_)
+
+#define ExDisableResourceBoost ExDisableResourceBoostLite
+
+VOID
+ExInitializePushLock (
+ OUT PEX_PUSH_LOCK PushLock);
+$endif (_NTIFS_)
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+$if (_WDMDDK_)
NTKERNELAPI
VOID
FASTCALL
ExUnregisterCallback(
IN OUT PVOID CbRegistration);
+$endif (_WDMDDK_)
+$if (_NTDDK_)
+NTKERNELAPI
+NTSTATUS
+NTAPI
+ExExtendZone(
+ IN OUT PZONE_HEADER Zone,
+ IN OUT PVOID Segment,
+ IN ULONG SegmentSize);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+ExInitializeZone(
+ OUT PZONE_HEADER Zone,
+ IN ULONG BlockSize,
+ IN OUT PVOID InitialSegment,
+ IN ULONG InitialSegmentSize);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+ExInterlockedExtendZone(
+ IN OUT PZONE_HEADER Zone,
+ IN OUT PVOID Segment,
+ IN ULONG SegmentSize,
+ IN OUT PKSPIN_LOCK Lock);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+ExUuidCreate(
+ OUT UUID *Uuid);
+
+NTKERNELAPI
+DECLSPEC_NORETURN
+VOID
+NTAPI
+ExRaiseAccessViolation(VOID);
+
+NTKERNELAPI
+DECLSPEC_NORETURN
+VOID
+NTAPI
+ExRaiseDatatypeMisalignment(VOID);
+
+$endif (_NTDDK_)
+$if (_NTIFS_)
+
+NTKERNELAPI
+SIZE_T
+NTAPI
+ExQueryPoolBlockSize(
+ IN PVOID PoolBlock,
+ OUT PBOOLEAN QuotaCharged);
+
+VOID
+ExAdjustLookasideDepth(
+ VOID);
+
+NTKERNELAPI
+VOID
+NTAPI
+ExDisableResourceBoostLite(
+ IN PERESOURCE Resource);
+$endif (_NTIFS_)
#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
+$if (_WDMDDK_ || _NTIFS_)
#if (NTDDI_VERSION >= NTDDI_WINXP)
+$endif
+$if (_WDMDDK_)
NTKERNELAPI
BOOLEAN
FASTCALL
ExWaitForRundownProtectionRelease(
IN OUT PEX_RUNDOWN_REF RunRef);
+$endif (_WDMDDK_)
+$if (_NTIFS_)
+PSLIST_ENTRY
+FASTCALL
+InterlockedPushListSList(
+ IN OUT PSLIST_HEADER ListHead,
+ IN OUT PSLIST_ENTRY List,
+ IN OUT PSLIST_ENTRY ListEnd,
+ IN ULONG Count);
+$endif (_NTIFS_)
+$if (_WDMDDK_ || _NTIFS_)
#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
+$endif
+$if (_WDMDDK_)
#if (NTDDI_VERSION >= NTDDI_WINXPSP2)
NTKERNELAPI
PVOID Entry;
Lookaside->L.TotalAllocates += 1;
+#ifdef NONAMELESSUNION
+ Entry = InterlockedPopEntrySList(&Lookaside->L.u.ListHead);
+ if (Entry == NULL) {
+ Lookaside->L.u2.AllocateMisses += 1;
+ Entry = (Lookaside->L.u4.AllocateEx)(Lookaside->L.Type,
+ Lookaside->L.Size,
+ Lookaside->L.Tag,
+ Lookaside);
+ }
+#else /* NONAMELESSUNION */
Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
if (Entry == NULL) {
Lookaside->L.AllocateMisses += 1;
Lookaside->L.Tag,
Lookaside);
}
+#endif /* NONAMELESSUNION */
return Entry;
}
PVOID Entry;
Lookaside->L.TotalAllocates++;
+#ifdef NONAMELESSUNION
+#if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
+ Entry = ExInterlockedPopEntrySList(&Lookaside->L.u.ListHead,
+ &Lookaside->Lock__ObsoleteButDoNotDelete);
+#else
+ Entry = InterlockedPopEntrySList(&Lookaside->L.u.ListHead);
+#endif
+ if (Entry == NULL) {
+ Lookaside->L.u2.AllocateMisses++;
+ Entry = (Lookaside->L.u4.Allocate)(Lookaside->L.Type,
+ Lookaside->L.Size,
+ Lookaside->L.Tag);
+ }
+#else /* NONAMELESSUNION */
#if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
Entry = ExInterlockedPopEntrySList(&Lookaside->L.ListHead,
&Lookaside->Lock__ObsoleteButDoNotDelete);
Lookaside->L.Size,
Lookaside->L.Tag);
}
+#endif /* NONAMELESSUNION */
return Entry;
}
IN PVOID Entry)
{
Lookaside->L.TotalFrees++;
+#ifdef NONAMELESSUNION
+ if (ExQueryDepthSList(&Lookaside->L.u.ListHead) >= Lookaside->L.Depth) {
+ Lookaside->L.u3.FreeMisses++;
+ (Lookaside->L.u5.Free)(Entry);
+ } else {
+#if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
+ ExInterlockedPushEntrySList(&Lookaside->L.u.ListHead,
+ (PSLIST_ENTRY)Entry,
+ &Lookaside->Lock__ObsoleteButDoNotDelete);
+#else
+ InterlockedPushEntrySList(&Lookaside->L.u.ListHead, (PSLIST_ENTRY)Entry);
+#endif
+ }
+#else /* NONAMELESSUNION */
if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
Lookaside->L.FreeMisses++;
(Lookaside->L.Free)(Entry);
InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
#endif
}
+#endif /* NONAMELESSUNION */
}
-$endif
-
+$endif (_WDMDDK_)