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)KeGetCurrentThread())
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, Routine, RoutineContext) \
260 ASSERT_IRQL(DISPATCH_LEVEL); \
261 (Item)->WorkerRoutine = (Routine); \
262 (Item)->Parameter = (RoutineContext); \
263 (Item)->List.Flink = NULL; \
264 (Item)->List.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 (
447 ExIsResourceAcquiredSharedLite (
453 ExLocalTimeToSystemTime (
454 PLARGE_INTEGER LocalTime,
455 PLARGE_INTEGER SystemTime
461 IN PCALLBACK_OBJECT CallbackObject,
476 * ExQueryDepthSList (
477 * PSLIST_HEADER SListHead
480 #define ExQueryDepthSList(ListHead) \
481 (USHORT)(ListHead)->Depth
486 PWORK_QUEUE_ITEM WorkItem,
487 WORK_QUEUE_TYPE QueueType
491 ExRaiseAccessViolation (
496 ExRaiseDatatypeMisalignment (
508 IN PCALLBACK_OBJECT CallbackObject,
509 IN PCALLBACK_FUNCTION CallbackFunction,
510 IN PVOID CallbackContext
515 ExReinitializeResourceLite (
518 /* ReactOS Specific: begin */
524 /* ReactOS Specific: end */
527 ExReleaseFastMutexUnsafe (
537 #define ExReleaseResource(Resource) \
538 (ExReleaseResourceLite (Resource))
542 ExReleaseResourceLite (
547 ExReleaseResourceForThread (
549 ERESOURCE_THREAD ResourceThreadId
553 ExReleaseResourceForThreadLite (
555 ERESOURCE_THREAD ResourceThreadId
560 ExSetResourceOwnerPointer (
561 IN PERESOURCE Resource,
562 IN PVOID OwnerPointer
567 ExSystemTimeToLocalTime (
568 PLARGE_INTEGER SystemTime,
569 PLARGE_INTEGER LocalTime
574 ExTryToAcquireFastMutex (
575 PFAST_MUTEX FastMutex
580 ExTryToAcquireResourceExclusiveLite (
586 ExUnregisterCallback (
587 IN PVOID CallbackRegistration
592 InterlockedPopEntrySList (
593 IN PSLIST_HEADER ListHead
598 InterlockedPushEntrySList(
599 IN PSLIST_HEADER ListHead,
600 IN PSLIST_ENTRY ListEntry
605 * ExAllocateFromNPagedLookasideList (
606 * PNPAGED_LOOKASIDE_LIST LookSide
610 * Removes (pops) the first entry from the specified nonpaged
614 * Lookaside = Pointer to a nonpaged lookaside list
617 * Address of the allocated list entry
622 ExAllocateFromNPagedLookasideList (
623 IN PNPAGED_LOOKASIDE_LIST Lookaside
628 Lookaside->TotalAllocates++;
629 Entry = ExInterlockedPopEntrySList (&Lookaside->ListHead,
630 &Lookaside->Obsoleted);
633 Lookaside->AllocateMisses++;
634 Entry = (Lookaside->Allocate)(Lookaside->Type,
643 ExAllocateFromPagedLookasideList(
644 IN PPAGED_LOOKASIDE_LIST Lookaside)
648 Lookaside->TotalAllocates++;
649 Entry = InterlockedPopEntrySList(&Lookaside->ListHead);
651 Lookaside->AllocateMisses++;
652 Entry = (Lookaside->Allocate)(Lookaside->Type,
653 Lookaside->Size, Lookaside->Tag);
660 ExDeleteNPagedLookasideList (
661 PNPAGED_LOOKASIDE_LIST Lookaside
666 ExDeletePagedLookasideList (
667 PPAGED_LOOKASIDE_LIST Lookaside
673 * ExFreeToNPagedLookasideList (
674 * PNPAGED_LOOKASIDE_LIST Lookaside,
679 * Inserts (pushes) the specified entry into the specified
680 * nonpaged lookaside list.
683 * Lookaside = Pointer to the nonpaged lookaside list
684 * Entry = Pointer to the entry that is inserted in the lookaside list
689 ExFreeToNPagedLookasideList (
690 IN PNPAGED_LOOKASIDE_LIST Lookaside,
694 Lookaside->TotalFrees++;
695 if (ExQueryDepthSList (&Lookaside->ListHead) >= Lookaside->Depth)
697 Lookaside->FreeMisses++;
698 (Lookaside->Free)(Entry);
702 ExInterlockedPushEntrySList (&Lookaside->ListHead,
703 (PSINGLE_LIST_ENTRY)Entry,
704 &Lookaside->Obsoleted);
709 ExFreeToPagedLookasideList(
710 IN PPAGED_LOOKASIDE_LIST Lookaside,
713 Lookaside->TotalFrees++;
714 if (ExQueryDepthSList(&Lookaside->ListHead) >= Lookaside->Depth) {
715 Lookaside->FreeMisses++;
716 (Lookaside->Free)(Entry);
718 InterlockedPushEntrySList(&Lookaside->ListHead, (PSLIST_ENTRY)Entry);
724 ExInitializeNPagedLookasideList (
725 PNPAGED_LOOKASIDE_LIST Lookaside,
726 PALLOCATE_FUNCTION Allocate,
736 ExInitializePagedLookasideList (
737 PPAGED_LOOKASIDE_LIST Lookaside,
738 PALLOCATE_FUNCTION Allocate,
747 ExfInterlockedAddUlong(IN PULONG Addend,
749 IN PKSPIN_LOCK Lock);
752 ExfInterlockedInsertHeadList(IN PLIST_ENTRY ListHead,
753 IN PLIST_ENTRY ListEntry,
754 IN PKSPIN_LOCK Lock);
757 ExfInterlockedInsertTailList(IN PLIST_ENTRY ListHead,
758 IN PLIST_ENTRY ListEntry,
759 IN PKSPIN_LOCK Lock);
761 PSINGLE_LIST_ENTRY FASTCALL
762 ExfInterlockedPopEntryList(IN PSINGLE_LIST_ENTRY ListHead,
763 IN PKSPIN_LOCK Lock);
765 PSINGLE_LIST_ENTRY FASTCALL
766 ExfInterlockedPushEntryList(IN PSINGLE_LIST_ENTRY ListHead,
767 IN PSINGLE_LIST_ENTRY ListEntry,
768 IN PKSPIN_LOCK Lock);
771 ExfInterlockedRemoveHeadList(IN PLIST_ENTRY Head,
772 IN PKSPIN_LOCK Lock);
774 INTERLOCKED_RESULT FASTCALL
775 Exfi386InterlockedIncrementLong(IN PLONG Addend);
777 INTERLOCKED_RESULT FASTCALL
778 Exfi386InterlockedDecrementLong(IN PLONG Addend);
781 Exfi386InterlockedExchangeUlong(IN PULONG Target,
784 INTERLOCKED_RESULT STDCALL
785 Exi386InterlockedIncrementLong(IN PLONG Addend);
787 INTERLOCKED_RESULT STDCALL
788 Exi386InterlockedDecrementLong(IN PLONG Addend);
791 Exi386InterlockedExchangeUlong(IN PULONG Target,
797 InterlockedCompareExchange (
803 #ifdef _GNU_H_WINDOWS_H
804 #ifdef InterlockedDecrement
805 #undef InterlockedDecrement
806 #undef InterlockedExchange
807 #undef InterlockedExchangeAdd
808 #undef InterlockedIncrement
809 #endif /* def InterlockedDecrement */
810 #endif /* def _GNU_H_WINDOWS_H */
813 InterlockedDecrement (
818 InterlockedExchange (
824 InterlockedExchangeAdd (
830 InterlockedIncrement (
834 #ifndef InterlockedExchangePointer
835 #define InterlockedExchangePointer(__T__, __V__) \
836 (PVOID)InterlockedExchange((PLONG)(__T__), (LONG)(__V__))
853 #endif /* ndef _NTOS_EXFUNCS_H */