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, 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 PCALLBACK_OBJECT 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
591 InterlockedPopEntrySList (
592 IN PSLIST_HEADER ListHead
597 InterlockedPushEntrySList(
598 IN PSLIST_HEADER ListHead
,
599 IN PSLIST_ENTRY ListEntry
604 * ExAllocateFromNPagedLookasideList (
605 * PNPAGED_LOOKASIDE_LIST LookSide
609 * Removes (pops) the first entry from the specified nonpaged
613 * Lookaside = Pointer to a nonpaged lookaside list
616 * Address of the allocated list entry
621 ExAllocateFromNPagedLookasideList (
622 IN PNPAGED_LOOKASIDE_LIST Lookaside
627 Lookaside
->TotalAllocates
++;
628 Entry
= ExInterlockedPopEntrySList (&Lookaside
->ListHead
,
629 &Lookaside
->Obsoleted
);
632 Lookaside
->AllocateMisses
++;
633 Entry
= (Lookaside
->Allocate
)(Lookaside
->Type
,
642 ExAllocateFromPagedLookasideList(
643 IN PPAGED_LOOKASIDE_LIST Lookaside
)
647 Lookaside
->TotalAllocates
++;
648 Entry
= InterlockedPopEntrySList(&Lookaside
->ListHead
);
650 Lookaside
->AllocateMisses
++;
651 Entry
= (Lookaside
->Allocate
)(Lookaside
->Type
,
652 Lookaside
->Size
, Lookaside
->Tag
);
659 ExDeleteNPagedLookasideList (
660 PNPAGED_LOOKASIDE_LIST Lookaside
665 ExDeletePagedLookasideList (
666 PPAGED_LOOKASIDE_LIST Lookaside
672 * ExFreeToNPagedLookasideList (
673 * PNPAGED_LOOKASIDE_LIST Lookaside,
678 * Inserts (pushes) the specified entry into the specified
679 * nonpaged lookaside list.
682 * Lookaside = Pointer to the nonpaged lookaside list
683 * Entry = Pointer to the entry that is inserted in the lookaside list
688 ExFreeToNPagedLookasideList (
689 IN PNPAGED_LOOKASIDE_LIST Lookaside
,
693 Lookaside
->TotalFrees
++;
694 if (ExQueryDepthSList (&Lookaside
->ListHead
) >= Lookaside
->Depth
)
696 Lookaside
->FreeMisses
++;
697 (Lookaside
->Free
)(Entry
);
701 ExInterlockedPushEntrySList (&Lookaside
->ListHead
,
702 (PSINGLE_LIST_ENTRY
)Entry
,
703 &Lookaside
->Obsoleted
);
708 ExFreeToPagedLookasideList(
709 IN PPAGED_LOOKASIDE_LIST Lookaside
,
712 Lookaside
->TotalFrees
++;
713 if (ExQueryDepthSList(&Lookaside
->ListHead
) >= Lookaside
->Depth
) {
714 Lookaside
->FreeMisses
++;
715 (Lookaside
->Free
)(Entry
);
717 InterlockedPushEntrySList(&Lookaside
->ListHead
, (PSLIST_ENTRY
)Entry
);
723 ExInitializeNPagedLookasideList (
724 PNPAGED_LOOKASIDE_LIST Lookaside
,
725 PALLOCATE_FUNCTION Allocate
,
735 ExInitializePagedLookasideList (
736 PPAGED_LOOKASIDE_LIST Lookaside
,
737 PALLOCATE_FUNCTION Allocate
,
746 ExfInterlockedAddUlong(IN PULONG Addend
,
748 IN PKSPIN_LOCK Lock
);
751 ExfInterlockedInsertHeadList(IN PLIST_ENTRY ListHead
,
752 IN PLIST_ENTRY ListEntry
,
753 IN PKSPIN_LOCK Lock
);
756 ExfInterlockedInsertTailList(IN PLIST_ENTRY ListHead
,
757 IN PLIST_ENTRY ListEntry
,
758 IN PKSPIN_LOCK Lock
);
760 PSINGLE_LIST_ENTRY FASTCALL
761 ExfInterlockedPopEntryList(IN PSINGLE_LIST_ENTRY ListHead
,
762 IN PKSPIN_LOCK Lock
);
764 PSINGLE_LIST_ENTRY FASTCALL
765 ExfInterlockedPushEntryList(IN PSINGLE_LIST_ENTRY ListHead
,
766 IN PSINGLE_LIST_ENTRY ListEntry
,
767 IN PKSPIN_LOCK Lock
);
770 ExfInterlockedRemoveHeadList(IN PLIST_ENTRY Head
,
771 IN PKSPIN_LOCK Lock
);
773 INTERLOCKED_RESULT FASTCALL
774 Exfi386InterlockedIncrementLong(IN PLONG Addend
);
776 INTERLOCKED_RESULT FASTCALL
777 Exfi386InterlockedDecrementLong(IN PLONG Addend
);
780 Exfi386InterlockedExchangeUlong(IN PULONG Target
,
783 INTERLOCKED_RESULT STDCALL
784 Exi386InterlockedIncrementLong(IN PLONG Addend
);
786 INTERLOCKED_RESULT STDCALL
787 Exi386InterlockedDecrementLong(IN PLONG Addend
);
790 Exi386InterlockedExchangeUlong(IN PULONG Target
,
796 InterlockedCompareExchange (
802 #ifdef _GNU_H_WINDOWS_H
803 #ifdef InterlockedDecrement
804 #undef InterlockedDecrement
805 #undef InterlockedExchange
806 #undef InterlockedExchangeAdd
807 #undef InterlockedIncrement
808 #endif /* def InterlockedDecrement */
809 #endif /* def _GNU_H_WINDOWS_H */
812 InterlockedDecrement (
817 InterlockedExchange (
823 InterlockedExchangeAdd (
829 InterlockedIncrement (
833 #ifndef InterlockedExchangePointer
834 #define InterlockedExchangePointer(__T__, __V__) \
835 (PVOID)InterlockedExchange((PLONG)(__T__), (LONG)(__V__))
852 #endif /* ndef _NTOS_EXFUNCS_H */