/* EXECUTIVE ROUTINES ******************************************************/
-VOID ExReleaseResourceLite(PERESOURCE Resource);
-VOID ExAcquireFastMutex (PFAST_MUTEX FastMutex);
-VOID ExAcquireFastMutexUnsafe (PFAST_MUTEX FastMutex);
-BOOLEAN ExAcquireResourceExclusive (PERESOURCE Resource, BOOLEAN Wait);
-BOOLEAN ExAcquireResourceExclusiveLite (PERESOURCE Resource, BOOLEAN Wait);
-BOOLEAN ExAcquireResourceSharedLite (
+#ifdef __NTOSKRNL__
+extern POBJECT_TYPE EXPORTED ExDesktopObjectType;
+extern POBJECT_TYPE EXPORTED ExEventObjectType;
+extern POBJECT_TYPE EXPORTED ExWindowStationObjectType;
+extern POBJECT_TYPE EXPORTED ExIoCompletionType;
+#else
+extern POBJECT_TYPE IMPORTED ExDesktopObjectType;
+extern POBJECT_TYPE IMPORTED ExEventObjectType;
+extern POBJECT_TYPE IMPORTED ExWindowStationObjectType;
+extern POBJECT_TYPE IMPORTED ExIoCompletionType;
+#endif
+
+#define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24))
+
+VOID
+FASTCALL
+ExAcquireFastMutex (
+ PFAST_MUTEX FastMutex
+ );
+VOID
+FASTCALL
+ExAcquireFastMutexUnsafe (
+ PFAST_MUTEX FastMutex
+ );
+BOOLEAN
+STDCALL
+ExAcquireResourceExclusive (
PERESOURCE Resource,
BOOLEAN Wait
);
BOOLEAN
-ExAcquireSharedStarveExclusive (
+STDCALL
+ExAcquireResourceExclusiveLite (
PERESOURCE Resource,
BOOLEAN Wait
);
BOOLEAN
-ExAcquireSharedWaitForExclusive (
+STDCALL
+ExAcquireResourceSharedLite (
PERESOURCE Resource,
BOOLEAN Wait
);
+BOOLEAN
+FASTCALL
+ExAcquireRundownProtection (
+ IN PEX_RUNDOWN_REF RunRef
+ );
+BOOLEAN
+FASTCALL
+ExAcquireRundownProtectionEx (
+ IN PEX_RUNDOWN_REF RunRef,
+ IN ULONG Count
+ );
+PVOID
+FASTCALL
+ExfAcquirePushLockExclusive (
+ PVOID Lock
+ );
PVOID
-ExAllocateFromNPagedLookasideList (
- PNPAGED_LOOKASIDE_LIST LookSide
+FASTCALL
+ExfAcquirePushLockShared (
+ PVOID Lock
);
PVOID
-ExAllocateFromPagedLookasideList (
- PPAGED_LOOKASIDE_LIST LookSide
+FASTCALL
+ExfReleasePushLock (
+ PVOID Lock
+ );
+BOOLEAN
+STDCALL
+ExAcquireSharedStarveExclusive (
+ PERESOURCE Resource,
+ BOOLEAN Wait
);
+BOOLEAN
+STDCALL
+ExAcquireSharedWaitForExclusive (
+ PERESOURCE Resource,
+ BOOLEAN Wait
+ );
+
PVOID
+STDCALL
ExAllocateFromZone (
PZONE_HEADER Zone
);
+/*
+ * PVOID
+ * ExAllocateFromZone (
+ * PZONE_HEADER Zone
+ * );
+ *
+ * FUNCTION:
+ * Allocate a block from a zone
+ *
+ * ARGUMENTS:
+ * Zone = Zone to allocate from
+ *
+ * RETURNS:
+ * The base address of the block allocated
+ */
+#define ExAllocateFromZone(Zone) \
+ (PVOID)((Zone)->FreeList.Next); \
+ if ((Zone)->FreeList.Next) \
+ (Zone)->FreeList.Next = (Zone)->FreeList.Next->Next
+
/*
* FUNCTION: Allocates memory from the nonpaged pool
* ARGUMENTS:
- * size = minimum size of the block to be allocated
+ * NumberOfBytes = minimum size of the block to be allocated
* PoolType = the type of memory to use for the block (ignored)
* RETURNS:
* the address of the block if it succeeds
*/
PVOID
+STDCALL
ExAllocatePool (
- POOL_TYPE PoolType,
- ULONG size
+ IN POOL_TYPE PoolType,
+ IN ULONG NumberOfBytes
);
PVOID
+STDCALL
ExAllocatePoolWithQuota (
- POOL_TYPE PoolType,
- ULONG NumberOfBytes
+ IN POOL_TYPE PoolType,
+ IN ULONG NumberOfBytes
);
PVOID
+STDCALL
ExAllocatePoolWithQuotaTag (
- POOL_TYPE PoolType,
- ULONG NumberOfBytes,
- ULONG Tag
+ IN POOL_TYPE PoolType,
+ IN ULONG NumberOfBytes,
+ IN ULONG Tag
);
PVOID
+STDCALL
ExAllocatePoolWithTag (
- POOL_TYPE PoolType,
- ULONG NumberOfBytes,
- ULONG Tag
+ IN POOL_TYPE PoolType,
+ IN ULONG NumberOfBytes,
+ IN ULONG Tag
);
+
+PVOID
+NTAPI
+ExAllocatePoolWithTagPriority(
+ IN POOL_TYPE PoolType,
+ IN SIZE_T NumberOfBytes,
+ IN ULONG Tag,
+ IN EX_POOL_PRIORITY Priority
+ );
+
VOID
+STDCALL
ExConvertExclusiveToSharedLite (
PERESOURCE Resource
);
-VOID
-ExDeleteNPagedLookasideList (
- PNPAGED_LOOKASIDE_LIST Lookaside
- );
-VOID
-ExDeletePagedLookasideList (
- PPAGED_LOOKASIDE_LIST Lookaside
+
+NTSTATUS
+STDCALL
+ExCreateCallback (
+ OUT PCALLBACK_OBJECT * CallbackObject,
+ IN POBJECT_ATTRIBUTES ObjectAttributes,
+ IN BOOLEAN Create,
+ IN BOOLEAN AllowMultipleCallbacks
);
+
NTSTATUS
+STDCALL
ExDeleteResource (
PERESOURCE Resource
);
NTSTATUS
+STDCALL
ExDeleteResourceLite (
PERESOURCE Resource
);
+
+VOID
+STDCALL
+ExDisableResourceBoostLite (
+ PERESOURCE Resource
+ );
+
+VOID
+STDCALL
+ExEnumHandleTable (
+ PULONG HandleTable,
+ PVOID Callback,
+ PVOID Param,
+ PHANDLE Handle OPTIONAL
+ );
+
NTSTATUS
+STDCALL
ExExtendZone (
PZONE_HEADER Zone,
PVOID Segment,
* block = block to free
*/
VOID
+STDCALL
ExFreePool (
PVOID block
);
+/*
+ * PVOID
+ * ExFreeToZone (
+ * PZONE_HEADER Zone,
+ * PVOID Block
+ * );
+ *
+ * FUNCTION:
+ * Frees a block from a zone
+ *
+ * ARGUMENTS:
+ * Zone = Zone the block was allocated from
+ * Block = Block to free
+ */
+#define ExFreeToZone(Zone,Block) \
+ (((PSINGLE_LIST_ENTRY)(Block))->Next = (Zone)->FreeList.Next, \
+ (Zone)->FreeList.Next = ((PSINGLE_LIST_ENTRY)(Block)), \
+ ((PSINGLE_LIST_ENTRY)(Block))->Next)
+
+/*
+ * ERESOURCE_THREAD
+ * ExGetCurrentResourceThread (
+ * VOID
+ * );
+ */
+#define ExGetCurrentResourceThread() \
+ ((ERESOURCE_THREAD)KeGetCurrentThread())
+
+LONGLONG
+FASTCALL
+ExfInterlockedCompareExchange64(
+ IN OUT LONGLONG volatile *Destination,
+ IN PLONGLONG ExChange,
+ IN PLONGLONG Comperand
+ );
+
VOID
-ExFreeToNPagedLookasideList (
- PNPAGED_LOOKASIDE_LIST Lookaside,
- PVOID Entry
- );
+STDCALL
+ExGetCurrentProcessorCounts (
+ PULONG ThreadKernelTime,
+ PULONG TotalCpuTime,
+ PULONG ProcessorNumber
+);
+
VOID
-ExFreeToPagedLookasideList (
- PPAGED_LOOKASIDE_LIST Lookaside,
- PVOID Entry
- );
-PVOID
-ExFreeToZone (
- PZONE_HEADER Zone,
- PVOID Block
- );
-ERESOURCE_THREAD
-ExGetCurrentResourceThread (
- VOID
+STDCALL
+ExGetCurrentProcessorCpuUsage (
+ PULONG CpuUsage
);
+
ULONG
+STDCALL
ExGetExclusiveWaiterCount (
PERESOURCE Resource
);
+
+KPROCESSOR_MODE
+STDCALL
+ExGetPreviousMode (
+ VOID
+ );
+
ULONG
+STDCALL
ExGetSharedWaiterCount (
PERESOURCE Resource
);
-VOID
-ExInitializeFastMutex (
- PFAST_MUTEX FastMutex
- );
-VOID
-ExInitializeNPagedLookasideList (
- PNPAGED_LOOKASIDE_LIST Lookaside,
- PALLOCATE_FUNCTION Allocate,
- PFREE_FUNCTION Free,
- ULONG Flags,
- ULONG Size,
- ULONG Tag,
- USHORT Depth
- );
-VOID
-ExInitializePagedLookasideList (
- PPAGED_LOOKASIDE_LIST Lookaside,
- PALLOCATE_FUNCTION Allocate,
- PFREE_FUNCTION Free,
- ULONG Flags,
- ULONG Size,
- ULONG Tag,
- USHORT Depth
- );
+
+/*
+ * VOID
+ * ExInitializeFastMutex (
+ * PFAST_MUTEX FastMutex
+ * );
+ */
+#define ExInitializeFastMutex(_FastMutex) \
+ ((PFAST_MUTEX)_FastMutex)->Count = 1; \
+ ((PFAST_MUTEX)_FastMutex)->Owner = NULL; \
+ ((PFAST_MUTEX)_FastMutex)->Contention = 0; \
+ KeInitializeEvent(&((PFAST_MUTEX)_FastMutex)->Event, \
+ SynchronizationEvent, \
+ FALSE);
+
NTSTATUS
+STDCALL
ExInitializeResource (
PERESOURCE Resource
);
NTSTATUS
+STDCALL
ExInitializeResourceLite (
PERESOURCE Resource
);
+
VOID
-ExInitializeSListHead (
- PSLIST_HEADER SListHead
- );
-VOID
-ExInitializeWorkItem (
- PWORK_QUEUE_ITEM Item,
- PWORKER_THREAD_ROUTINE Routine,
- PVOID Context
- );
+FASTCALL
+ExInitializeRundownProtection (
+ IN PEX_RUNDOWN_REF RunRef
+ );
+
+/*
+ * VOID
+ * ExInitializeSListHead (
+ * PSLIST_HEADER SListHead
+ * );
+ */
+#define ExInitializeSListHead(ListHead) \
+ (ListHead)->Alignment = 0
+
+/*
+ * VOID
+ * ExInitializeWorkItem (
+ * PWORK_QUEUE_ITEM Item,
+ * PWORKER_THREAD_ROUTINE Routine,
+ * PVOID Context
+ * );
+ *
+ * FUNCTION:
+ * Initializes a work item to be processed by one of the system
+ * worker threads
+ *
+ * ARGUMENTS:
+ * Item = Pointer to the item to be initialized
+ * Routine = Routine to be called by the worker thread
+ * Context = Parameter to be passed to the callback
+ */
+#define ExInitializeWorkItem(Item, Routine, RoutineContext) \
+ ASSERT_IRQL(DISPATCH_LEVEL); \
+ (Item)->WorkerRoutine = (Routine); \
+ (Item)->Parameter = (RoutineContext); \
+ (Item)->List.Flink = NULL;
+
NTSTATUS
+STDCALL
ExInitializeZone (
PZONE_HEADER Zone,
ULONG BlockSize,
PVOID InitialSegment,
ULONG InitialSegmentSize
);
+
LARGE_INTEGER
+STDCALL
ExInterlockedAddLargeInteger (
PLARGE_INTEGER Addend,
LARGE_INTEGER Increment,
PKSPIN_LOCK Lock
);
+
+VOID
+FASTCALL
+ExInterlockedAddLargeStatistic (
+ IN PLARGE_INTEGER Addend,
+ IN ULONG Increment
+ );
+
ULONG
+STDCALL
ExInterlockedAddUlong (
PULONG Addend,
ULONG Increment,
PKSPIN_LOCK Lock
);
-VOID
-ExInterlockedRemoveEntryList (
- PLIST_ENTRY ListHead,
- PLIST_ENTRY Entry,
+/*
+ * PVOID
+ * STDCALL
+ * ExInterlockedAllocateFromZone (
+ * PZONE_HEADER Zone,
+ * PKSPIN_LOCK Lock
+ * );
+ */
+#define ExInterlockedAllocateFromZone(Zone,Lock) \
+ (PVOID)ExInterlockedPopEntryList(&(Zone)->FreeList,Lock)
+
+LONGLONG
+FASTCALL
+ExInterlockedCompareExchange64 (
+ IN OUT PLONGLONG Destination,
+ IN PLONGLONG Exchange,
+ IN PLONGLONG Comparand,
+ IN PKSPIN_LOCK Lock
+ );
+
+INTERLOCKED_RESULT
+STDCALL
+ExInterlockedDecrementLong (
+ PLONG Addend,
PKSPIN_LOCK Lock
);
-VOID
-RemoveEntryFromList (
- PLIST_ENTRY ListHead,
- PLIST_ENTRY Entry
- );
-PLIST_ENTRY
-ExInterlockedRemoveHeadList (
- PLIST_ENTRY Head,
+
+ULONG
+STDCALL
+ExInterlockedExchangeUlong (
+ PULONG Target,
+ ULONG Value,
+ PKSPIN_LOCK Lock
+ );
+
+NTSTATUS
+STDCALL
+ExInterlockedExtendZone (
+ PZONE_HEADER Zone,
+ PVOID Segment,
+ ULONG SegmentSize,
+ PKSPIN_LOCK Lock
+ );
+
+PSLIST_ENTRY
+FASTCALL
+ExInterlockedFlushSList (
+ IN PSLIST_HEADER ListHead
+ );
+
+/*
+ * PVOID
+ * ExInterlockedFreeToZone (
+ * PZONE_HEADER Zone,
+ * PVOID Block,
+ * PKSPIN_LOCK Lock
+ * );
+ */
+#define ExInterlockedFreeToZone(Zone,Block,Lock) \
+ ExInterlockedPushEntryList(&(Zone)->FreeList,((PSINGLE_LIST_ENTRY)(Block)),(Lock))
+
+INTERLOCKED_RESULT
+STDCALL
+ExInterlockedIncrementLong (
+ PLONG Addend,
PKSPIN_LOCK Lock
);
PLIST_ENTRY
-ExInterlockedInsertTailList (
+STDCALL
+ExInterlockedInsertHeadList (
PLIST_ENTRY ListHead,
PLIST_ENTRY ListEntry,
PKSPIN_LOCK Lock
);
PLIST_ENTRY
-ExInterlockedInsertHeadList (
+STDCALL
+ExInterlockedInsertTailList (
PLIST_ENTRY ListHead,
PLIST_ENTRY ListEntry,
PKSPIN_LOCK Lock
);
+PSINGLE_LIST_ENTRY
+STDCALL
+ExInterlockedPopEntryList (
+ PSINGLE_LIST_ENTRY ListHead,
+ PKSPIN_LOCK Lock
+ );
+PSINGLE_LIST_ENTRY
+FASTCALL
+ExInterlockedPopEntrySList (
+ PSLIST_HEADER ListHead,
+ PKSPIN_LOCK Lock
+ );
+PSINGLE_LIST_ENTRY
+STDCALL
+ExInterlockedPushEntryList (
+ PSINGLE_LIST_ENTRY ListHead,
+ PSINGLE_LIST_ENTRY ListEntry,
+ PKSPIN_LOCK Lock
+ );
+PSINGLE_LIST_ENTRY
+FASTCALL
+ExInterlockedPushEntrySList (
+ PSLIST_HEADER ListHead,
+ PSINGLE_LIST_ENTRY ListEntry,
+ PKSPIN_LOCK Lock
+ );
+PLIST_ENTRY
+STDCALL
+ExInterlockedRemoveHeadList (
+ PLIST_ENTRY Head,
+ PKSPIN_LOCK Lock
+ );
+
+/*
+ * BOOLEAN
+ * ExIsFullZone (
+ * PZONE_HEADER Zone
+ * );
+ */
+#define ExIsFullZone(Zone) \
+ ((Zone)->FreeList.Next==(PSINGLE_LIST_ENTRY)NULL)
+
+/*
+ * BOOLEAN
+ * ExIsObjectInFirstZoneSegment (
+ * PZONE_HEADER Zone,
+ * PVOID Object
+ * );
+ */
+#define ExIsObjectInFirstZoneSegment(Zone,Object) \
+ (((PUCHAR)(Object)>=(PUCHAR)(Zone)->SegmentList.Next) && \
+ ((PUCHAR)(Object)<(PUCHAR)(Zone)->SegmentList.Next+(Zone)->TotalSegmentSize))
+
+BOOLEAN
+STDCALL
+ExIsProcessorFeaturePresent (
+ IN ULONG ProcessorFeature
+ );
+
+BOOLEAN
+STDCALL
+ExIsResourceAcquiredExclusiveLite (
+ PERESOURCE Resource
+ );
+
+/* was ULONG */
+USHORT
+STDCALL
+ExIsResourceAcquiredSharedLite (
+ PERESOURCE Resource
+ );
+
+VOID
+STDCALL
+ExLocalTimeToSystemTime (
+ PLARGE_INTEGER LocalTime,
+ PLARGE_INTEGER SystemTime
+ );
+
+VOID
+STDCALL
+ExNotifyCallback (
+ IN PCALLBACK_OBJECT CallbackObject,
+ IN PVOID Argument1,
+ IN PVOID Argument2
+ );
+
+VOID
+STDCALL
+ExPostSystemEvent (
+ ULONG Unknown1,
+ ULONG Unknown2,
+ ULONG Unknown3
+ );
+
+/*
+ * USHORT
+ * ExQueryDepthSList (
+ * PSLIST_HEADER SListHead
+ * );
+ */
+#define ExQueryDepthSList(ListHead) \
+ (USHORT)(ListHead)->Depth
+
VOID
+STDCALL
ExQueueWorkItem (
PWORK_QUEUE_ITEM WorkItem,
WORK_QUEUE_TYPE QueueType
);
+
+SIZE_T
+STDCALL
+ExQueryPoolBlockSize (
+ IN PVOID PoolBlock,
+ OUT PBOOLEAN QuotaCharged
+ );
+
+VOID
+STDCALL
+ExRaiseAccessViolation (
+ VOID
+ );
+VOID
+STDCALL
+ExRaiseDatatypeMisalignment (
+ VOID
+ );
VOID
+STDCALL
ExRaiseStatus (
NTSTATUS Status
);
VOID
+STDCALL
+ExRaiseException (
+ PEXCEPTION_RECORD pExcptRec
+ );
+VOID
+STDCALL
+ExRaiseHardError (
+ IN NTSTATUS ErrorStatus,
+ IN ULONG NumberOfParameters,
+ IN PUNICODE_STRING UnicodeStringParameterMask OPTIONAL,
+ IN PVOID *Parameters,
+ IN HARDERROR_RESPONSE_OPTION ResponseOption,
+ OUT PHARDERROR_RESPONSE Response
+ );
+
+PVOID
+STDCALL
+ExRegisterCallback (
+ IN PCALLBACK_OBJECT CallbackObject,
+ IN PCALLBACK_FUNCTION CallbackFunction,
+ IN PVOID CallbackContext
+ );
+
+VOID
+STDCALL
ExReinitializeResourceLite (
PERESOURCE Resource
);
VOID
+FASTCALL
+ExReInitializeRundownProtection (
+ IN PEX_RUNDOWN_REF RunRef
+ );
+
+/* ReactOS Specific: begin */
+VOID
+FASTCALL
ExReleaseFastMutex (
PFAST_MUTEX Mutex
);
+/* ReactOS Specific: end */
VOID
+FASTCALL
ExReleaseFastMutexUnsafe (
PFAST_MUTEX Mutex
);
+/*
VOID
+STDCALL
ExReleaseResource (
PERESOURCE Resource
);
+*/
+#define ExReleaseResource(Resource) \
+ (ExReleaseResourceLite (Resource))
+
+VOID
+FASTCALL
+ExReleaseResourceLite (
+ PERESOURCE Resource
+ );
VOID
+STDCALL
ExReleaseResourceForThread (
- PERESOURCE Resource,
+ PERESOURCE Resource,
ERESOURCE_THREAD ResourceThreadId
);
VOID
+STDCALL
ExReleaseResourceForThreadLite (
PERESOURCE Resource,
ERESOURCE_THREAD ResourceThreadId
);
VOID
+FASTCALL
+ExReleaseRundownProtection (
+ IN PEX_RUNDOWN_REF RunRef
+ );
+VOID
+FASTCALL
+ExReleaseRundownProtectionEx (
+ IN PEX_RUNDOWN_REF RunRef,
+ IN ULONG Count
+ );
+/* ReactOS Specific: begin */
+VOID STDCALL
+ExRosDumpPagedPoolByTag (
+ IN ULONG Tag
+ );
+ULONG STDCALL
+ExRosQueryPoolTag (
+ IN PVOID Block
+ );
+/* ReactOS Specific: end */
+VOID
+FASTCALL
+ExRundownCompleted (
+ IN PEX_RUNDOWN_REF RunRef
+ );
+VOID
+STDCALL
+ExSetResourceOwnerPointer (
+ IN PERESOURCE Resource,
+ IN PVOID OwnerPointer
+ );
+
+VOID
+STDCALL
+ExSetTimerResolution (
+ IN ULONG DesiredTime,
+ IN BOOLEAN SetResolution
+ );
+
+BOOLEAN
+STDCALL
+ExVerifySuite(
+ SUITE_TYPE SuiteType
+ );
+
+BOOLEAN
+STDCALL
+ExSystemExceptionFilter();
+
+VOID
+STDCALL
ExSystemTimeToLocalTime (
PLARGE_INTEGER SystemTime,
PLARGE_INTEGER LocalTime
);
+
BOOLEAN
+FASTCALL
ExTryToAcquireFastMutex (
PFAST_MUTEX FastMutex
);
+
BOOLEAN
+STDCALL
ExTryToAcquireResourceExclusiveLite (
PERESOURCE Resource
);
-/*
-LONG
-FASTCALL
-InterlockedCompareExchange (
- PLONG Target,
- LONG Value,
- LONG Reference
+
+VOID
+STDCALL
+ExUnregisterCallback (
+ IN PVOID CallbackRegistration
);
-*/
+
+typedef GUID UUID;
+
+NTSTATUS
+STDCALL
+ExUuidCreate(
+ OUT UUID *Uuid
+ );
+
+VOID
+FASTCALL
+ExWaitForRundownProtectionRelease (
+ IN PEX_RUNDOWN_REF RunRef
+ );
+
+PSLIST_ENTRY
+FASTCALL
+InterlockedPopEntrySList (
+ IN PSLIST_HEADER ListHead
+ );
+
+PSLIST_ENTRY
+FASTCALL
+InterlockedPushEntrySList(
+ IN PSLIST_HEADER ListHead,
+ IN PSLIST_ENTRY ListEntry
+ );
+
+/*
+ * PVOID
+ * ExAllocateFromNPagedLookasideList (
+ * PNPAGED_LOOKASIDE_LIST LookSide
+ * );
+ *
+ * FUNCTION:
+ * Removes (pops) the first entry from the specified nonpaged
+ * lookaside list.
+ *
+ * ARGUMENTS:
+ * Lookaside = Pointer to a nonpaged lookaside list
+ *
+ * RETURNS:
+ * Address of the allocated list entry
+ */
+static
+inline
PVOID
+ExAllocateFromNPagedLookasideList (
+ IN PNPAGED_LOOKASIDE_LIST Lookaside
+ )
+{
+ PVOID Entry;
+
+ Lookaside->TotalAllocates++;
+ Entry = ExInterlockedPopEntrySList (&Lookaside->ListHead,
+ &Lookaside->Obsoleted);
+ if (Entry == NULL)
+ {
+ Lookaside->AllocateMisses++;
+ Entry = (Lookaside->Allocate)(Lookaside->Type,
+ Lookaside->Size,
+ Lookaside->Tag);
+ }
+
+ return Entry;
+}
+
+static inline PVOID
+ExAllocateFromPagedLookasideList(
+ IN PPAGED_LOOKASIDE_LIST Lookaside)
+{
+ PVOID Entry;
+
+ Lookaside->TotalAllocates++;
+ Entry = InterlockedPopEntrySList(&Lookaside->ListHead);
+ if (Entry == NULL) {
+ Lookaside->AllocateMisses++;
+ Entry = (Lookaside->Allocate)(Lookaside->Type,
+ Lookaside->Size, Lookaside->Tag);
+ }
+ return Entry;
+}
+
+VOID
+STDCALL
+ExDeleteNPagedLookasideList (
+ PNPAGED_LOOKASIDE_LIST Lookaside
+ );
+
+VOID
+STDCALL
+ExDeletePagedLookasideList (
+ PPAGED_LOOKASIDE_LIST Lookaside
+ );
+
+
+/*
+ * VOID
+ * ExFreeToNPagedLookasideList (
+ * PNPAGED_LOOKASIDE_LIST Lookaside,
+ * PVOID Entry
+ * );
+ *
+ * FUNCTION:
+ * Inserts (pushes) the specified entry into the specified
+ * nonpaged lookaside list.
+ *
+ * ARGUMENTS:
+ * Lookaside = Pointer to the nonpaged lookaside list
+ * Entry = Pointer to the entry that is inserted in the lookaside list
+ */
+static
+inline
+VOID
+ExFreeToNPagedLookasideList (
+ IN PNPAGED_LOOKASIDE_LIST Lookaside,
+ IN PVOID Entry
+ )
+{
+ Lookaside->TotalFrees++;
+ if (ExQueryDepthSList (&Lookaside->ListHead) >= Lookaside->Depth)
+ {
+ Lookaside->FreeMisses++;
+ (Lookaside->Free)(Entry);
+ }
+ else
+ {
+ ExInterlockedPushEntrySList (&Lookaside->ListHead,
+ (PSINGLE_LIST_ENTRY)Entry,
+ &Lookaside->Obsoleted);
+ }
+}
+
+static inline VOID
+ExFreeToPagedLookasideList(
+ IN PPAGED_LOOKASIDE_LIST Lookaside,
+ IN PVOID Entry)
+{
+ Lookaside->TotalFrees++;
+ if (ExQueryDepthSList(&Lookaside->ListHead) >= Lookaside->Depth) {
+ Lookaside->FreeMisses++;
+ (Lookaside->Free)(Entry);
+ } else {
+ InterlockedPushEntrySList(&Lookaside->ListHead, (PSLIST_ENTRY)Entry);
+ }
+}
+
+VOID
+STDCALL
+ExInitializeNPagedLookasideList (
+ PNPAGED_LOOKASIDE_LIST Lookaside,
+ PALLOCATE_FUNCTION Allocate,
+ PFREE_FUNCTION Free,
+ ULONG Flags,
+ ULONG Size,
+ ULONG Tag,
+ USHORT Depth
+ );
+
+VOID
+STDCALL
+ExInitializePagedLookasideList (
+ PPAGED_LOOKASIDE_LIST Lookaside,
+ PALLOCATE_FUNCTION Allocate,
+ PFREE_FUNCTION Free,
+ ULONG Flags,
+ ULONG Size,
+ ULONG Tag,
+ USHORT Depth
+ );
+
+ULONG FASTCALL
+ExfInterlockedAddUlong(IN PULONG Addend,
+ IN ULONG Increment,
+ IN PKSPIN_LOCK Lock);
+
+PLIST_ENTRY FASTCALL
+ExfInterlockedInsertHeadList(IN PLIST_ENTRY ListHead,
+ IN PLIST_ENTRY ListEntry,
+ IN PKSPIN_LOCK Lock);
+
+PLIST_ENTRY FASTCALL
+ExfInterlockedInsertTailList(IN PLIST_ENTRY ListHead,
+ IN PLIST_ENTRY ListEntry,
+ IN PKSPIN_LOCK Lock);
+
+PSINGLE_LIST_ENTRY FASTCALL
+ExfInterlockedPopEntryList(IN PSINGLE_LIST_ENTRY ListHead,
+ IN PKSPIN_LOCK Lock);
+
+PSINGLE_LIST_ENTRY FASTCALL
+ExfInterlockedPushEntryList(IN PSINGLE_LIST_ENTRY ListHead,
+ IN PSINGLE_LIST_ENTRY ListEntry,
+ IN PKSPIN_LOCK Lock);
+
+PLIST_ENTRY FASTCALL
+ExfInterlockedRemoveHeadList(IN PLIST_ENTRY Head,
+ IN PKSPIN_LOCK Lock);
+
+INTERLOCKED_RESULT FASTCALL
+Exfi386InterlockedIncrementLong(IN PLONG Addend);
+
+INTERLOCKED_RESULT FASTCALL
+Exfi386InterlockedDecrementLong(IN PLONG Addend);
+
+ULONG FASTCALL
+Exfi386InterlockedExchangeUlong(IN PULONG Target,
+ IN ULONG Value);
+
+INTERLOCKED_RESULT STDCALL
+Exi386InterlockedIncrementLong(IN PLONG Addend);
+
+INTERLOCKED_RESULT STDCALL
+Exi386InterlockedDecrementLong(IN PLONG Addend);
+
+ULONG STDCALL
+Exi386InterlockedExchangeUlong(IN PULONG Target,
+ IN ULONG Value);
+
+
+LONG
FASTCALL
InterlockedCompareExchange (
- PVOID * Destination,
- PVOID Exchange,
- PVOID Comperand
+ PLONG Destination,
+ LONG Exchange,
+ LONG Comperand
);
+
#ifdef _GNU_H_WINDOWS_H
#ifdef InterlockedDecrement
#undef InterlockedDecrement
InterlockedIncrement (
PLONG Addend
);
+
+#ifndef InterlockedExchangePointer
+# ifdef _WIN64
+# define InterlockedExchangePointer(__T__, __V__) \
+ (PVOID)InterlockedExchange64((PLONGLONG)(__T__), (LONGLONG)(__V__))
+# else
+# define InterlockedExchangePointer(__T__, __V__) \
+ (PVOID)InterlockedExchange((PLONG)(__T__), (LONG)(__V__))
+# endif
+#endif
+
+#ifndef InterlockedCompareExchangePointer
+# ifdef _WIN64
+# define InterlockedCompareExchangePointer(__T__, __V__, __C__) \
+ (PVOID)InterlockedCompareExchange64((PLONGLONG)(__T__), (LONGLONG)(__V__), (LONGLONG)(__C__))
+# else
+# define InterlockedCompareExchangePointer(__T__, __V__, __C__) \
+ (PVOID)InterlockedCompareExchange((PLONG)(__T__), (LONG)(__V__), (LONG)(__C__))
+# endif
+#endif
+
/*---*/
-PVOID
-ExInterlockedAllocateFromZone (
- PZONE_HEADER Zone,
- PKSPIN_LOCK Lock
- );
-PVOID
-ExInterlockedFreeToZone (
- PZONE_HEADER Zone,
- PVOID Block,
- PKSPIN_LOCK Lock
- );
-NTSTATUS
-ExInterlockedExtendZone (
- PZONE_HEADER Zone,
- PVOID Segment,
- ULONG SegmentSize,
- PKSPIN_LOCK Lock
- );
-PSINGLE_LIST_ENTRY
-ExInterlockedPopEntryList (
- PSINGLE_LIST_ENTRY ListHead,
- PKSPIN_LOCK Lock
- );
-PSINGLE_LIST_ENTRY
-ExInterlockedPushEntryList (
- PSINGLE_LIST_ENTRY ListHead,
- PSINGLE_LIST_ENTRY ListEntry,
- PKSPIN_LOCK Lock
- );
-PSINGLE_LIST_ENTRY
-ExInterlockedPushEntrySList (
- PSLIST_HEADER ListHead,
- PSINGLE_LIST_ENTRY ListEntry,
- PKSPIN_LOCK Lock
- );
-PSINGLE_LIST_ENTRY
-ExInterlockedPopEntrySList (
- PSLIST_HEADER ListHead,
- PKSPIN_LOCK Lock
- );
-BOOLEAN
-ExIsFullZone (
- PZONE_HEADER Zone
- );
-BOOLEAN
-ExIsObjectInFirstZoneSegment (
- PZONE_HEADER Zone,
- PVOID Object
- );
-VOID
-ExLocalTimeToSystemTime (
- PLARGE_INTEGER LocalTime,
- PLARGE_INTEGER SystemTime
- );
typedef
unsigned int
-(exception_hook) (
+(*exception_hook) (
CONTEXT * c,
unsigned int exp
);
exception_hook fn,
unsigned int exp
);
-INTERLOCKED_RESULT
-ExInterlockedDecrementLong (
- PLONG Addend,
- PKSPIN_LOCK Lock
- );
-ULONG
-ExInterlockedExchangeUlong (
- PULONG Target,
- ULONG Value,
- PKSPIN_LOCK Lock
- );
-INTERLOCKED_RESULT
-ExInterlockedIncrementLong (
- PLONG Addend,
- PKSPIN_LOCK Lock
- );
-BOOLEAN
-ExIsResourceAcquiredExclusiveLite (
- PERESOURCE Resource
- );
-ULONG
-ExIsResourceAcquiredSharedLite (
- PERESOURCE Resource
- );
-USHORT
-ExQueryDepthSListHead (
- PSLIST_HEADER SListHead
- );
#endif /* ndef _NTOS_EXFUNCS_H */