1 #ifndef _NTOS_EXFUNCS_H
2 #define _NTOS_EXFUNCS_H
4 /* EXECUTIVE ROUTINES ******************************************************/
6 #define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24))
15 ExAcquireFastMutexUnsafe (
20 ExAcquireResourceExclusive (
26 ExAcquireResourceExclusiveLite (
32 ExAcquireResourceSharedLite (
38 ExAcquireSharedStarveExclusive (
44 ExAcquireSharedWaitForExclusive (
57 * ExAllocateFromZone (
62 * Allocate a block from a zone
65 * Zone = Zone to allocate from
68 * The base address of the block allocated
70 #define ExAllocateFromZone(Zone) \
71 (PVOID)((Zone)->FreeList.Next); \
72 if ((Zone)->FreeList.Next) \
73 (Zone)->FreeList.Next = (Zone)->FreeList.Next->Next
76 * FUNCTION: Allocates memory from the nonpaged pool
78 * NumberOfBytes = minimum size of the block to be allocated
79 * PoolType = the type of memory to use for the block (ignored)
81 * the address of the block if it succeeds
86 IN POOL_TYPE PoolType
,
87 IN ULONG NumberOfBytes
92 ExAllocatePoolWithQuota (
93 IN POOL_TYPE PoolType
,
94 IN ULONG NumberOfBytes
98 ExAllocatePoolWithQuotaTag (
99 IN POOL_TYPE PoolType
,
100 IN ULONG NumberOfBytes
,
105 ExAllocatePoolWithTag (
106 IN POOL_TYPE PoolType
,
107 IN ULONG NumberOfBytes
,
113 ExConvertExclusiveToSharedLite (
120 OUT PCALLBACK_OBJECT
* CallbackObject
,
121 IN POBJECT_ATTRIBUTES ObjectAttributes
,
123 IN BOOLEAN AllowMultipleCallbacks
133 ExDeleteResourceLite (
139 ExDisableResourceBoostLite (
152 * FUNCTION: Releases previously allocated memory
154 * block = block to free
170 * Frees a block from a zone
173 * Zone = Zone the block was allocated from
174 * Block = Block to free
176 #define ExFreeToZone(Zone,Block) \
177 (((PSINGLE_LIST_ENTRY)(Block))->Next = (Zone)->FreeList.Next, \
178 (Zone)->FreeList.Next = ((PSINGLE_LIST_ENTRY)(Block)), \
179 ((PSINGLE_LIST_ENTRY)(Block))->Next)
183 * ExGetCurrentResourceThread (
187 #define ExGetCurrentResourceThread() \
188 ((ERESOURCE_THREAD)PsGetCurrentThread())
192 ExGetExclusiveWaiterCount (
204 ExGetSharedWaiterCount (
210 * ExInitializeFastMutex (
211 * PFAST_MUTEX FastMutex
214 #define ExInitializeFastMutex(_FastMutex) \
215 ((PFAST_MUTEX)_FastMutex)->Count = 1; \
216 ((PFAST_MUTEX)_FastMutex)->Owner = NULL; \
217 ((PFAST_MUTEX)_FastMutex)->Contention = 0; \
218 KeInitializeEvent(&((PFAST_MUTEX)_FastMutex)->Event, \
219 SynchronizationEvent, \
224 ExInitializeResource (
229 ExInitializeResourceLite (
235 * ExInitializeSListHead (
236 * PSLIST_HEADER SListHead
239 #define ExInitializeSListHead(ListHead) \
240 (ListHead)->Alignment = 0
244 * ExInitializeWorkItem (
245 * PWORK_QUEUE_ITEM Item,
246 * PWORKER_THREAD_ROUTINE Routine,
251 * Initializes a work item to be processed by one of the system
255 * Item = Pointer to the item to be initialized
256 * Routine = Routine to be called by the worker thread
257 * Context = Parameter to be passed to the callback
259 #define ExInitializeWorkItem(Item, WorkerRoutine, RoutineContext) \
260 ASSERT_IRQL(DISPATCH_LEVEL); \
261 (Item)->Routine = (WorkerRoutine); \
262 (Item)->Context = (RoutineContext); \
263 (Item)->Entry.Flink = NULL; \
264 (Item)->Entry.Blink = NULL;
271 PVOID InitialSegment
,
272 ULONG InitialSegmentSize
277 ExInterlockedAddLargeInteger (
278 PLARGE_INTEGER Addend
,
279 LARGE_INTEGER Increment
,
285 ExInterlockedAddLargeStatistic (
286 IN PLARGE_INTEGER Addend
,
292 ExInterlockedAddUlong (
301 * ExInterlockedAllocateFromZone (
306 #define ExInterlockedAllocateFromZone(Zone,Lock) \
307 (PVOID)ExInterlockedPopEntryList(&(Zone)->FreeList,Lock)
311 ExInterlockedCompareExchange64 (
312 IN OUT PLONGLONG Destination
,
313 IN PLONGLONG Exchange
,
314 IN PLONGLONG Comparand
,
320 ExInterlockedDecrementLong (
326 ExInterlockedExchangeUlong (
333 ExInterlockedExtendZone (
342 * ExInterlockedFreeToZone (
348 #define ExInterlockedFreeToZone(Zone,Block,Lock) \
349 ExInterlockedPushEntryList(&(Zone)->FreeList,((PSINGLE_LIST_ENTRY)(Block)),(Lock))
353 ExInterlockedIncrementLong (
359 ExInterlockedInsertHeadList (
360 PLIST_ENTRY ListHead
,
361 PLIST_ENTRY ListEntry
,
366 ExInterlockedInsertTailList (
367 PLIST_ENTRY ListHead
,
368 PLIST_ENTRY ListEntry
,
373 ExInterlockedPopEntryList (
374 PSINGLE_LIST_ENTRY ListHead
,
379 ExInterlockedPopEntrySList (
380 PSLIST_HEADER ListHead
,
385 ExInterlockedPushEntryList (
386 PSINGLE_LIST_ENTRY ListHead
,
387 PSINGLE_LIST_ENTRY ListEntry
,
392 ExInterlockedPushEntrySList (
393 PSLIST_HEADER ListHead
,
394 PSINGLE_LIST_ENTRY ListEntry
,
399 ExInterlockedRemoveEntryList (
400 PLIST_ENTRY ListHead
,
407 ExInterlockedRemoveHeadList (
418 #define ExIsFullZone(Zone) \
419 ((Zone)->FreeList.Next==(PSINGLE_LIST_ENTRY)NULL)
423 * ExIsObjectInFirstZoneSegment (
428 #define ExIsObjectInFirstZoneSegment(Zone,Object) \
429 (((PUCHAR)(Object)>=(PUCHAR)(Zone)->SegmentList.Next) && \
430 ((PUCHAR)(Object)<(PUCHAR)(Zone)->SegmentList.Next+(Zone)->TotalSegmentSize))
434 ExIsProcessorFeaturePresent (
435 IN ULONG ProcessorFeature
440 ExIsResourceAcquiredExclusiveLite (
446 ExIsResourceAcquiredSharedLite (
452 ExLocalTimeToSystemTime (
453 PLARGE_INTEGER LocalTime
,
454 PLARGE_INTEGER SystemTime
460 IN PVOID CallbackObject
,
475 * ExQueryDepthSList (
476 * PSLIST_HEADER SListHead
479 #define ExQueryDepthSList(ListHead) \
480 (USHORT)(ListHead)->s.Depth
485 PWORK_QUEUE_ITEM WorkItem
,
486 WORK_QUEUE_TYPE QueueType
490 ExRaiseAccessViolation (
495 ExRaiseDatatypeMisalignment (
507 IN PCALLBACK_OBJECT CallbackObject
,
508 IN PCALLBACK_FUNCTION CallbackFunction
,
509 IN PVOID CallbackContext
514 ExReinitializeResourceLite (
517 /* ReactOS Specific: begin */
523 /* ReactOS Specific: end */
526 ExReleaseFastMutexUnsafe (
536 #define ExReleaseResource(Resource) \
537 (ExReleaseResourceLite (Resource))
541 ExReleaseResourceLite (
546 ExReleaseResourceForThread (
548 ERESOURCE_THREAD ResourceThreadId
552 ExReleaseResourceForThreadLite (
554 ERESOURCE_THREAD ResourceThreadId
559 ExSetResourceOwnerPointer (
560 IN PERESOURCE Resource
,
561 IN PVOID OwnerPointer
566 ExSystemTimeToLocalTime (
567 PLARGE_INTEGER SystemTime
,
568 PLARGE_INTEGER LocalTime
573 ExTryToAcquireFastMutex (
574 PFAST_MUTEX FastMutex
579 ExTryToAcquireResourceExclusiveLite (
585 ExUnregisterCallback (
586 IN PVOID CallbackRegistration
592 * ExAllocateFromNPagedLookasideList (
593 * PNPAGED_LOOKASIDE_LIST LookSide
597 * Removes (pops) the first entry from the specified nonpaged
601 * Lookaside = Pointer to a nonpaged lookaside list
604 * Address of the allocated list entry
609 ExAllocateFromNPagedLookasideList (
610 IN PNPAGED_LOOKASIDE_LIST Lookaside
615 Lookaside
->TotalAllocates
++;
616 Entry
= ExInterlockedPopEntrySList (&Lookaside
->ListHead
,
620 Lookaside
->AllocateMisses
++;
621 Entry
= (Lookaside
->Allocate
)(Lookaside
->Type
,
631 ExAllocateFromPagedLookasideList (
632 PPAGED_LOOKASIDE_LIST LookSide
637 ExDeleteNPagedLookasideList (
638 PNPAGED_LOOKASIDE_LIST Lookaside
643 ExDeletePagedLookasideList (
644 PPAGED_LOOKASIDE_LIST Lookaside
650 * ExFreeToNPagedLookasideList (
651 * PNPAGED_LOOKASIDE_LIST Lookaside,
656 * Inserts (pushes) the specified entry into the specified
657 * nonpaged lookaside list.
660 * Lookaside = Pointer to the nonpaged lookaside list
661 * Entry = Pointer to the entry that is inserted in the lookaside list
666 ExFreeToNPagedLookasideList (
667 IN PNPAGED_LOOKASIDE_LIST Lookaside
,
671 Lookaside
->TotalFrees
++;
672 if (ExQueryDepthSList (&Lookaside
->ListHead
) >= Lookaside
->MinimumDepth
)
674 Lookaside
->FreeMisses
++;
675 (Lookaside
->Free
)(Entry
);
679 ExInterlockedPushEntrySList (&Lookaside
->ListHead
,
680 (PSINGLE_LIST_ENTRY
)Entry
,
687 ExFreeToPagedLookasideList (
688 PPAGED_LOOKASIDE_LIST Lookaside
,
694 ExInitializeNPagedLookasideList (
695 PNPAGED_LOOKASIDE_LIST Lookaside
,
696 PALLOCATE_FUNCTION Allocate
,
706 ExInitializePagedLookasideList (
707 PPAGED_LOOKASIDE_LIST Lookaside
,
708 PALLOCATE_FUNCTION Allocate
,
717 ExfInterlockedAddUlong(IN PULONG Addend
,
719 IN PKSPIN_LOCK Lock
);
722 ExfInterlockedInsertHeadList(IN PLIST_ENTRY ListHead
,
723 IN PLIST_ENTRY ListEntry
,
724 IN PKSPIN_LOCK Lock
);
727 ExfInterlockedInsertTailList(IN PLIST_ENTRY ListHead
,
728 IN PLIST_ENTRY ListEntry
,
729 IN PKSPIN_LOCK Lock
);
731 PSINGLE_LIST_ENTRY FASTCALL
732 ExfInterlockedPopEntryList(IN PSINGLE_LIST_ENTRY ListHead
,
733 IN PKSPIN_LOCK Lock
);
735 PSINGLE_LIST_ENTRY FASTCALL
736 ExfInterlockedPushEntryList(IN PSINGLE_LIST_ENTRY ListHead
,
737 IN PSINGLE_LIST_ENTRY ListEntry
,
738 IN PKSPIN_LOCK Lock
);
741 ExfInterlockedRemoveHeadList(IN PLIST_ENTRY Head
,
742 IN PKSPIN_LOCK Lock
);
744 INTERLOCKED_RESULT FASTCALL
745 Exfi386InterlockedIncrementLong(IN PLONG Addend
);
747 INTERLOCKED_RESULT FASTCALL
748 Exfi386InterlockedDecrementLong(IN PLONG Addend
);
751 Exfi386InterlockedExchangeUlong(IN PULONG Target
,
754 INTERLOCKED_RESULT STDCALL
755 Exi386InterlockedIncrementLong(IN PLONG Addend
);
757 INTERLOCKED_RESULT STDCALL
758 Exi386InterlockedDecrementLong(IN PLONG Addend
);
761 Exi386InterlockedExchangeUlong(IN PULONG Target
,
767 InterlockedCompareExchange (
773 #ifdef _GNU_H_WINDOWS_H
774 #ifdef InterlockedDecrement
775 #undef InterlockedDecrement
776 #undef InterlockedExchange
777 #undef InterlockedExchangeAdd
778 #undef InterlockedIncrement
779 #endif /* def InterlockedDecrement */
780 #endif /* def _GNU_H_WINDOWS_H */
783 InterlockedDecrement (
788 InterlockedExchange (
794 InterlockedExchangeAdd (
800 InterlockedIncrement (
818 /* BEGIN REACTOS ONLY */
821 ExInitializeBinaryTree(IN PBINARY_TREE Tree
,
822 IN PKEY_COMPARATOR Compare
,
823 IN BOOLEAN UseNonPagedPool
);
826 ExDeleteBinaryTree(IN PBINARY_TREE Tree
);
829 ExInsertBinaryTree(IN PBINARY_TREE Tree
,
834 ExSearchBinaryTree(IN PBINARY_TREE Tree
,
839 ExRemoveBinaryTree(IN PBINARY_TREE Tree
,
844 ExTraverseBinaryTree(IN PBINARY_TREE Tree
,
845 IN TRAVERSE_METHOD Method
,
846 IN PTRAVERSE_ROUTINE Routine
,
850 ExInitializeSplayTree(IN PSPLAY_TREE Tree
,
851 IN PKEY_COMPARATOR Compare
,
853 IN BOOLEAN UseNonPagedPool
);
856 ExDeleteSplayTree(IN PSPLAY_TREE Tree
);
859 ExInsertSplayTree(IN PSPLAY_TREE Tree
,
864 ExSearchSplayTree(IN PSPLAY_TREE Tree
,
869 ExRemoveSplayTree(IN PSPLAY_TREE Tree
,
874 ExWeightOfSplayTree(IN PSPLAY_TREE Tree
,
878 ExTraverseSplayTree(IN PSPLAY_TREE Tree
,
879 IN TRAVERSE_METHOD Method
,
880 IN PTRAVERSE_ROUTINE Routine
,
884 ExInitializeHashTable(IN PHASH_TABLE HashTable
,
885 IN ULONG HashTableSize
,
886 IN PKEY_COMPARATOR Compare OPTIONAL
,
887 IN BOOLEAN UseNonPagedPool
);
890 ExDeleteHashTable(IN PHASH_TABLE HashTable
);
893 ExInsertHashTable(IN PHASH_TABLE HashTable
,
899 ExSearchHashTable(IN PHASH_TABLE HashTable
,
905 ExRemoveHashTable(IN PHASH_TABLE HashTable
,
910 /* END REACTOS ONLY */
912 #endif /* ndef _NTOS_EXFUNCS_H */