1 #ifndef _NTOS_EXFUNCS_H
2 #define _NTOS_EXFUNCS_H
4 /* EXECUTIVE ROUTINES ******************************************************/
7 extern POBJECT_TYPE EXPORTED ExDesktopObjectType
;
8 extern POBJECT_TYPE EXPORTED ExEventObjectType
;
9 extern POBJECT_TYPE EXPORTED ExWindowStationObjectType
;
10 extern POBJECT_TYPE EXPORTED ExIoCompletionType
;
12 extern POBJECT_TYPE IMPORTED ExDesktopObjectType
;
13 extern POBJECT_TYPE IMPORTED ExEventObjectType
;
14 extern POBJECT_TYPE IMPORTED ExWindowStationObjectType
;
15 extern POBJECT_TYPE IMPORTED ExIoCompletionType
;
18 #define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24))
27 ExAcquireFastMutexUnsafe (
32 ExAcquireResourceExclusive (
38 ExAcquireResourceExclusiveLite (
44 ExAcquireResourceSharedLite (
50 ExAcquireRundownProtection (
51 IN PEX_RUNDOWN_REF RunRef
55 ExAcquireRundownProtectionEx (
56 IN PEX_RUNDOWN_REF RunRef
,
61 ExfAcquirePushLockExclusive (
66 ExfAcquirePushLockShared (
76 ExAcquireSharedStarveExclusive (
82 ExAcquireSharedWaitForExclusive (
95 * ExAllocateFromZone (
100 * Allocate a block from a zone
103 * Zone = Zone to allocate from
106 * The base address of the block allocated
108 #define ExAllocateFromZone(Zone) \
109 (PVOID)((Zone)->FreeList.Next); \
110 if ((Zone)->FreeList.Next) \
111 (Zone)->FreeList.Next = (Zone)->FreeList.Next->Next
114 * FUNCTION: Allocates memory from the nonpaged pool
116 * NumberOfBytes = minimum size of the block to be allocated
117 * PoolType = the type of memory to use for the block (ignored)
119 * the address of the block if it succeeds
124 IN POOL_TYPE PoolType
,
125 IN ULONG NumberOfBytes
130 ExAllocatePoolWithQuota (
131 IN POOL_TYPE PoolType
,
132 IN ULONG NumberOfBytes
136 ExAllocatePoolWithQuotaTag (
137 IN POOL_TYPE PoolType
,
138 IN ULONG NumberOfBytes
,
143 ExAllocatePoolWithTag (
144 IN POOL_TYPE PoolType
,
145 IN ULONG NumberOfBytes
,
151 ExAllocatePoolWithTagPriority(
152 IN POOL_TYPE PoolType
,
153 IN SIZE_T NumberOfBytes
,
155 IN EX_POOL_PRIORITY Priority
160 ExConvertExclusiveToSharedLite (
167 OUT PCALLBACK_OBJECT
* CallbackObject
,
168 IN POBJECT_ATTRIBUTES ObjectAttributes
,
170 IN BOOLEAN AllowMultipleCallbacks
180 ExDeleteResourceLite (
186 ExDisableResourceBoostLite (
196 PHANDLE Handle OPTIONAL
208 * FUNCTION: Releases previously allocated memory
210 * block = block to free
226 * Frees a block from a zone
229 * Zone = Zone the block was allocated from
230 * Block = Block to free
232 #define ExFreeToZone(Zone,Block) \
233 (((PSINGLE_LIST_ENTRY)(Block))->Next = (Zone)->FreeList.Next, \
234 (Zone)->FreeList.Next = ((PSINGLE_LIST_ENTRY)(Block)), \
235 ((PSINGLE_LIST_ENTRY)(Block))->Next)
239 * ExGetCurrentResourceThread (
243 #define ExGetCurrentResourceThread() \
244 ((ERESOURCE_THREAD)KeGetCurrentThread())
248 ExfInterlockedCompareExchange64(
249 IN OUT LONGLONG
volatile *Destination
,
250 IN PLONGLONG ExChange
,
251 IN PLONGLONG Comperand
256 ExGetCurrentProcessorCounts (
257 PVOID IdleThreadTime
,
264 ExGetCurrentProcessorCpuUsage (
270 ExGetExclusiveWaiterCount (
282 ExGetSharedWaiterCount (
288 * ExInitializeFastMutex (
289 * PFAST_MUTEX FastMutex
292 #define ExInitializeFastMutex(_FastMutex) \
293 ((PFAST_MUTEX)_FastMutex)->Count = 1; \
294 ((PFAST_MUTEX)_FastMutex)->Owner = NULL; \
295 ((PFAST_MUTEX)_FastMutex)->Contention = 0; \
296 KeInitializeEvent(&((PFAST_MUTEX)_FastMutex)->Event, \
297 SynchronizationEvent, \
302 ExInitializeResource (
307 ExInitializeResourceLite (
313 ExInitializeRundownProtection (
314 IN PEX_RUNDOWN_REF RunRef
319 * ExInitializeSListHead (
320 * PSLIST_HEADER SListHead
323 #define ExInitializeSListHead(ListHead) \
324 (ListHead)->Alignment = 0
328 * ExInitializeWorkItem (
329 * PWORK_QUEUE_ITEM Item,
330 * PWORKER_THREAD_ROUTINE Routine,
335 * Initializes a work item to be processed by one of the system
339 * Item = Pointer to the item to be initialized
340 * Routine = Routine to be called by the worker thread
341 * Context = Parameter to be passed to the callback
343 #define ExInitializeWorkItem(Item, Routine, RoutineContext) \
344 ASSERT_IRQL(DISPATCH_LEVEL); \
345 (Item)->WorkerRoutine = (Routine); \
346 (Item)->Parameter = (RoutineContext); \
347 (Item)->List.Flink = NULL; \
348 (Item)->List.Blink = NULL;
355 PVOID InitialSegment
,
356 ULONG InitialSegmentSize
361 ExInterlockedAddLargeInteger (
362 PLARGE_INTEGER Addend
,
363 LARGE_INTEGER Increment
,
369 ExInterlockedAddLargeStatistic (
370 IN PLARGE_INTEGER Addend
,
376 ExInterlockedAddUlong (
385 * ExInterlockedAllocateFromZone (
390 #define ExInterlockedAllocateFromZone(Zone,Lock) \
391 (PVOID)ExInterlockedPopEntryList(&(Zone)->FreeList,Lock)
395 ExInterlockedCompareExchange64 (
396 IN OUT PLONGLONG Destination
,
397 IN PLONGLONG Exchange
,
398 IN PLONGLONG Comparand
,
404 ExInterlockedDecrementLong (
411 ExInterlockedExchangeUlong (
419 ExInterlockedExtendZone (
428 ExInterlockedFlushSList (
429 IN PSLIST_HEADER ListHead
434 * ExInterlockedFreeToZone (
440 #define ExInterlockedFreeToZone(Zone,Block,Lock) \
441 ExInterlockedPushEntryList(&(Zone)->FreeList,((PSINGLE_LIST_ENTRY)(Block)),(Lock))
445 ExInterlockedIncrementLong (
451 ExInterlockedInsertHeadList (
452 PLIST_ENTRY ListHead
,
453 PLIST_ENTRY ListEntry
,
458 ExInterlockedInsertTailList (
459 PLIST_ENTRY ListHead
,
460 PLIST_ENTRY ListEntry
,
465 ExInterlockedPopEntryList (
466 PSINGLE_LIST_ENTRY ListHead
,
471 ExInterlockedPopEntrySList (
472 PSLIST_HEADER ListHead
,
477 ExInterlockedPushEntryList (
478 PSINGLE_LIST_ENTRY ListHead
,
479 PSINGLE_LIST_ENTRY ListEntry
,
484 ExInterlockedPushEntrySList (
485 PSLIST_HEADER ListHead
,
486 PSINGLE_LIST_ENTRY ListEntry
,
491 ExInterlockedRemoveEntryList (
492 PLIST_ENTRY ListHead
,
499 ExInterlockedRemoveHeadList (
510 #define ExIsFullZone(Zone) \
511 ((Zone)->FreeList.Next==(PSINGLE_LIST_ENTRY)NULL)
515 * ExIsObjectInFirstZoneSegment (
520 #define ExIsObjectInFirstZoneSegment(Zone,Object) \
521 (((PUCHAR)(Object)>=(PUCHAR)(Zone)->SegmentList.Next) && \
522 ((PUCHAR)(Object)<(PUCHAR)(Zone)->SegmentList.Next+(Zone)->TotalSegmentSize))
526 ExIsProcessorFeaturePresent (
527 IN ULONG ProcessorFeature
532 ExIsResourceAcquiredExclusiveLite (
539 ExIsResourceAcquiredSharedLite (
545 ExLocalTimeToSystemTime (
546 PLARGE_INTEGER LocalTime
,
547 PLARGE_INTEGER SystemTime
553 IN PCALLBACK_OBJECT CallbackObject
,
568 * ExQueryDepthSList (
569 * PSLIST_HEADER SListHead
572 #define ExQueryDepthSList(ListHead) \
573 (USHORT)(ListHead)->Depth
578 PWORK_QUEUE_ITEM WorkItem
,
579 WORK_QUEUE_TYPE QueueType
584 ExQueryPoolBlockSize (
586 OUT PBOOLEAN QuotaCharged
591 ExRaiseAccessViolation (
596 ExRaiseDatatypeMisalignment (
607 PEXCEPTION_RECORD pExcptRec
612 IN NTSTATUS ErrorStatus
,
613 IN ULONG NumberOfParameters
,
614 IN PUNICODE_STRING UnicodeStringParameterMask OPTIONAL
,
615 IN PVOID
*Parameters
,
616 IN HARDERROR_RESPONSE_OPTION ResponseOption
,
617 OUT PHARDERROR_RESPONSE Response
623 IN PCALLBACK_OBJECT CallbackObject
,
624 IN PCALLBACK_FUNCTION CallbackFunction
,
625 IN PVOID CallbackContext
630 ExReinitializeResourceLite (
635 ExReInitializeRundownProtection (
636 IN PEX_RUNDOWN_REF RunRef
639 /* ReactOS Specific: begin */
645 /* ReactOS Specific: end */
648 ExReleaseFastMutexUnsafe (
658 #define ExReleaseResource(Resource) \
659 (ExReleaseResourceLite (Resource))
663 ExReleaseResourceLite (
668 ExReleaseResourceForThread (
670 ERESOURCE_THREAD ResourceThreadId
674 ExReleaseResourceForThreadLite (
676 ERESOURCE_THREAD ResourceThreadId
680 ExReleaseRundownProtection (
681 IN PEX_RUNDOWN_REF RunRef
685 ExReleaseRundownProtectionEx (
686 IN PEX_RUNDOWN_REF RunRef
,
692 IN PEX_RUNDOWN_REF RunRef
696 ExSetResourceOwnerPointer (
697 IN PERESOURCE Resource
,
698 IN PVOID OwnerPointer
703 ExSetTimerResolution (
704 IN ULONG DesiredTime
,
705 IN BOOLEAN SetResolution
716 ExSystemExceptionFilter();
720 ExSystemTimeToLocalTime (
721 PLARGE_INTEGER SystemTime
,
722 PLARGE_INTEGER LocalTime
727 ExTryToAcquireFastMutex (
728 PFAST_MUTEX FastMutex
733 ExTryToAcquireResourceExclusiveLite (
739 ExUnregisterCallback (
740 IN PVOID CallbackRegistration
753 ExWaitForRundownProtectionRelease (
754 IN PEX_RUNDOWN_REF RunRef
759 InterlockedPopEntrySList (
760 IN PSLIST_HEADER ListHead
765 InterlockedPushEntrySList(
766 IN PSLIST_HEADER ListHead
,
767 IN PSLIST_ENTRY ListEntry
772 * ExAllocateFromNPagedLookasideList (
773 * PNPAGED_LOOKASIDE_LIST LookSide
777 * Removes (pops) the first entry from the specified nonpaged
781 * Lookaside = Pointer to a nonpaged lookaside list
784 * Address of the allocated list entry
789 ExAllocateFromNPagedLookasideList (
790 IN PNPAGED_LOOKASIDE_LIST Lookaside
795 Lookaside
->TotalAllocates
++;
796 Entry
= ExInterlockedPopEntrySList (&Lookaside
->ListHead
,
797 &Lookaside
->Obsoleted
);
800 Lookaside
->AllocateMisses
++;
801 Entry
= (Lookaside
->Allocate
)(Lookaside
->Type
,
810 ExAllocateFromPagedLookasideList(
811 IN PPAGED_LOOKASIDE_LIST Lookaside
)
815 Lookaside
->TotalAllocates
++;
816 Entry
= InterlockedPopEntrySList(&Lookaside
->ListHead
);
818 Lookaside
->AllocateMisses
++;
819 Entry
= (Lookaside
->Allocate
)(Lookaside
->Type
,
820 Lookaside
->Size
, Lookaside
->Tag
);
827 ExDeleteNPagedLookasideList (
828 PNPAGED_LOOKASIDE_LIST Lookaside
833 ExDeletePagedLookasideList (
834 PPAGED_LOOKASIDE_LIST Lookaside
840 * ExFreeToNPagedLookasideList (
841 * PNPAGED_LOOKASIDE_LIST Lookaside,
846 * Inserts (pushes) the specified entry into the specified
847 * nonpaged lookaside list.
850 * Lookaside = Pointer to the nonpaged lookaside list
851 * Entry = Pointer to the entry that is inserted in the lookaside list
856 ExFreeToNPagedLookasideList (
857 IN PNPAGED_LOOKASIDE_LIST Lookaside
,
861 Lookaside
->TotalFrees
++;
862 if (ExQueryDepthSList (&Lookaside
->ListHead
) >= Lookaside
->Depth
)
864 Lookaside
->FreeMisses
++;
865 (Lookaside
->Free
)(Entry
);
869 ExInterlockedPushEntrySList (&Lookaside
->ListHead
,
870 (PSINGLE_LIST_ENTRY
)Entry
,
871 &Lookaside
->Obsoleted
);
876 ExFreeToPagedLookasideList(
877 IN PPAGED_LOOKASIDE_LIST Lookaside
,
880 Lookaside
->TotalFrees
++;
881 if (ExQueryDepthSList(&Lookaside
->ListHead
) >= Lookaside
->Depth
) {
882 Lookaside
->FreeMisses
++;
883 (Lookaside
->Free
)(Entry
);
885 InterlockedPushEntrySList(&Lookaside
->ListHead
, (PSLIST_ENTRY
)Entry
);
891 ExInitializeNPagedLookasideList (
892 PNPAGED_LOOKASIDE_LIST Lookaside
,
893 PALLOCATE_FUNCTION Allocate
,
903 ExInitializePagedLookasideList (
904 PPAGED_LOOKASIDE_LIST Lookaside
,
905 PALLOCATE_FUNCTION Allocate
,
914 ExfInterlockedAddUlong(IN PULONG Addend
,
916 IN PKSPIN_LOCK Lock
);
919 ExfInterlockedInsertHeadList(IN PLIST_ENTRY ListHead
,
920 IN PLIST_ENTRY ListEntry
,
921 IN PKSPIN_LOCK Lock
);
924 ExfInterlockedInsertTailList(IN PLIST_ENTRY ListHead
,
925 IN PLIST_ENTRY ListEntry
,
926 IN PKSPIN_LOCK Lock
);
928 PSINGLE_LIST_ENTRY FASTCALL
929 ExfInterlockedPopEntryList(IN PSINGLE_LIST_ENTRY ListHead
,
930 IN PKSPIN_LOCK Lock
);
932 PSINGLE_LIST_ENTRY FASTCALL
933 ExfInterlockedPushEntryList(IN PSINGLE_LIST_ENTRY ListHead
,
934 IN PSINGLE_LIST_ENTRY ListEntry
,
935 IN PKSPIN_LOCK Lock
);
938 ExfInterlockedRemoveHeadList(IN PLIST_ENTRY Head
,
939 IN PKSPIN_LOCK Lock
);
941 INTERLOCKED_RESULT FASTCALL
942 Exfi386InterlockedIncrementLong(IN PLONG Addend
);
944 INTERLOCKED_RESULT FASTCALL
945 Exfi386InterlockedDecrementLong(IN PLONG Addend
);
948 Exfi386InterlockedExchangeUlong(IN PULONG Target
,
951 INTERLOCKED_RESULT STDCALL
952 Exi386InterlockedIncrementLong(IN PLONG Addend
);
954 INTERLOCKED_RESULT STDCALL
955 Exi386InterlockedDecrementLong(IN PLONG Addend
);
958 Exi386InterlockedExchangeUlong(IN PULONG Target
,
964 InterlockedCompareExchange (
970 #ifdef _GNU_H_WINDOWS_H
971 #ifdef InterlockedDecrement
972 #undef InterlockedDecrement
973 #undef InterlockedExchange
974 #undef InterlockedExchangeAdd
975 #undef InterlockedIncrement
976 #endif /* def InterlockedDecrement */
977 #endif /* def _GNU_H_WINDOWS_H */
980 InterlockedDecrement (
985 InterlockedExchange (
991 InterlockedExchangeAdd (
997 InterlockedIncrement (
1001 #ifndef InterlockedExchangePointer
1002 #define InterlockedExchangePointer(__T__, __V__) \
1003 (PVOID)InterlockedExchange((PLONG)(__T__), (LONG)(__V__))
1020 #endif /* ndef _NTOS_EXFUNCS_H */