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 PULONG ThreadKernelTime
,
259 PULONG ProcessorNumber
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;
354 PVOID InitialSegment
,
355 ULONG InitialSegmentSize
360 ExInterlockedAddLargeInteger (
361 PLARGE_INTEGER Addend
,
362 LARGE_INTEGER Increment
,
368 ExInterlockedAddLargeStatistic (
369 IN PLARGE_INTEGER Addend
,
375 ExInterlockedAddUlong (
384 * ExInterlockedAllocateFromZone (
389 #define ExInterlockedAllocateFromZone(Zone,Lock) \
390 (PVOID)ExInterlockedPopEntryList(&(Zone)->FreeList,Lock)
394 ExInterlockedCompareExchange64 (
395 IN OUT PLONGLONG Destination
,
396 IN PLONGLONG Exchange
,
397 IN PLONGLONG Comparand
,
403 ExInterlockedDecrementLong (
410 ExInterlockedExchangeUlong (
418 ExInterlockedExtendZone (
427 ExInterlockedFlushSList (
428 IN PSLIST_HEADER ListHead
433 * ExInterlockedFreeToZone (
439 #define ExInterlockedFreeToZone(Zone,Block,Lock) \
440 ExInterlockedPushEntryList(&(Zone)->FreeList,((PSINGLE_LIST_ENTRY)(Block)),(Lock))
444 ExInterlockedIncrementLong (
450 ExInterlockedInsertHeadList (
451 PLIST_ENTRY ListHead
,
452 PLIST_ENTRY ListEntry
,
457 ExInterlockedInsertTailList (
458 PLIST_ENTRY ListHead
,
459 PLIST_ENTRY ListEntry
,
464 ExInterlockedPopEntryList (
465 PSINGLE_LIST_ENTRY ListHead
,
470 ExInterlockedPopEntrySList (
471 PSLIST_HEADER ListHead
,
476 ExInterlockedPushEntryList (
477 PSINGLE_LIST_ENTRY ListHead
,
478 PSINGLE_LIST_ENTRY ListEntry
,
483 ExInterlockedPushEntrySList (
484 PSLIST_HEADER ListHead
,
485 PSINGLE_LIST_ENTRY ListEntry
,
490 ExInterlockedRemoveHeadList (
501 #define ExIsFullZone(Zone) \
502 ((Zone)->FreeList.Next==(PSINGLE_LIST_ENTRY)NULL)
506 * ExIsObjectInFirstZoneSegment (
511 #define ExIsObjectInFirstZoneSegment(Zone,Object) \
512 (((PUCHAR)(Object)>=(PUCHAR)(Zone)->SegmentList.Next) && \
513 ((PUCHAR)(Object)<(PUCHAR)(Zone)->SegmentList.Next+(Zone)->TotalSegmentSize))
517 ExIsProcessorFeaturePresent (
518 IN ULONG ProcessorFeature
523 ExIsResourceAcquiredExclusiveLite (
530 ExIsResourceAcquiredSharedLite (
536 ExLocalTimeToSystemTime (
537 PLARGE_INTEGER LocalTime
,
538 PLARGE_INTEGER SystemTime
544 IN PCALLBACK_OBJECT CallbackObject
,
559 * ExQueryDepthSList (
560 * PSLIST_HEADER SListHead
563 #define ExQueryDepthSList(ListHead) \
564 (USHORT)(ListHead)->Depth
569 PWORK_QUEUE_ITEM WorkItem
,
570 WORK_QUEUE_TYPE QueueType
575 ExQueryPoolBlockSize (
577 OUT PBOOLEAN QuotaCharged
582 ExRaiseAccessViolation (
587 ExRaiseDatatypeMisalignment (
598 PEXCEPTION_RECORD pExcptRec
603 IN NTSTATUS ErrorStatus
,
604 IN ULONG NumberOfParameters
,
605 IN PUNICODE_STRING UnicodeStringParameterMask OPTIONAL
,
606 IN PVOID
*Parameters
,
607 IN HARDERROR_RESPONSE_OPTION ResponseOption
,
608 OUT PHARDERROR_RESPONSE Response
614 IN PCALLBACK_OBJECT CallbackObject
,
615 IN PCALLBACK_FUNCTION CallbackFunction
,
616 IN PVOID CallbackContext
621 ExReinitializeResourceLite (
626 ExReInitializeRundownProtection (
627 IN PEX_RUNDOWN_REF RunRef
630 /* ReactOS Specific: begin */
636 /* ReactOS Specific: end */
639 ExReleaseFastMutexUnsafe (
649 #define ExReleaseResource(Resource) \
650 (ExReleaseResourceLite (Resource))
654 ExReleaseResourceLite (
659 ExReleaseResourceForThread (
661 ERESOURCE_THREAD ResourceThreadId
665 ExReleaseResourceForThreadLite (
667 ERESOURCE_THREAD ResourceThreadId
671 ExReleaseRundownProtection (
672 IN PEX_RUNDOWN_REF RunRef
676 ExReleaseRundownProtectionEx (
677 IN PEX_RUNDOWN_REF RunRef
,
680 /* ReactOS Specific: begin */
682 ExRosDumpPagedPoolByTag (
689 /* ReactOS Specific: end */
693 IN PEX_RUNDOWN_REF RunRef
697 ExSetResourceOwnerPointer (
698 IN PERESOURCE Resource
,
699 IN PVOID OwnerPointer
704 ExSetTimerResolution (
705 IN ULONG DesiredTime
,
706 IN BOOLEAN SetResolution
717 ExSystemExceptionFilter();
721 ExSystemTimeToLocalTime (
722 PLARGE_INTEGER SystemTime
,
723 PLARGE_INTEGER LocalTime
728 ExTryToAcquireFastMutex (
729 PFAST_MUTEX FastMutex
734 ExTryToAcquireResourceExclusiveLite (
740 ExUnregisterCallback (
741 IN PVOID CallbackRegistration
754 ExWaitForRundownProtectionRelease (
755 IN PEX_RUNDOWN_REF RunRef
760 InterlockedPopEntrySList (
761 IN PSLIST_HEADER ListHead
766 InterlockedPushEntrySList(
767 IN PSLIST_HEADER ListHead
,
768 IN PSLIST_ENTRY ListEntry
773 * ExAllocateFromNPagedLookasideList (
774 * PNPAGED_LOOKASIDE_LIST LookSide
778 * Removes (pops) the first entry from the specified nonpaged
782 * Lookaside = Pointer to a nonpaged lookaside list
785 * Address of the allocated list entry
790 ExAllocateFromNPagedLookasideList (
791 IN PNPAGED_LOOKASIDE_LIST Lookaside
796 Lookaside
->TotalAllocates
++;
797 Entry
= ExInterlockedPopEntrySList (&Lookaside
->ListHead
,
798 &Lookaside
->Obsoleted
);
801 Lookaside
->AllocateMisses
++;
802 Entry
= (Lookaside
->Allocate
)(Lookaside
->Type
,
811 ExAllocateFromPagedLookasideList(
812 IN PPAGED_LOOKASIDE_LIST Lookaside
)
816 Lookaside
->TotalAllocates
++;
817 Entry
= InterlockedPopEntrySList(&Lookaside
->ListHead
);
819 Lookaside
->AllocateMisses
++;
820 Entry
= (Lookaside
->Allocate
)(Lookaside
->Type
,
821 Lookaside
->Size
, Lookaside
->Tag
);
828 ExDeleteNPagedLookasideList (
829 PNPAGED_LOOKASIDE_LIST Lookaside
834 ExDeletePagedLookasideList (
835 PPAGED_LOOKASIDE_LIST Lookaside
841 * ExFreeToNPagedLookasideList (
842 * PNPAGED_LOOKASIDE_LIST Lookaside,
847 * Inserts (pushes) the specified entry into the specified
848 * nonpaged lookaside list.
851 * Lookaside = Pointer to the nonpaged lookaside list
852 * Entry = Pointer to the entry that is inserted in the lookaside list
857 ExFreeToNPagedLookasideList (
858 IN PNPAGED_LOOKASIDE_LIST Lookaside
,
862 Lookaside
->TotalFrees
++;
863 if (ExQueryDepthSList (&Lookaside
->ListHead
) >= Lookaside
->Depth
)
865 Lookaside
->FreeMisses
++;
866 (Lookaside
->Free
)(Entry
);
870 ExInterlockedPushEntrySList (&Lookaside
->ListHead
,
871 (PSINGLE_LIST_ENTRY
)Entry
,
872 &Lookaside
->Obsoleted
);
877 ExFreeToPagedLookasideList(
878 IN PPAGED_LOOKASIDE_LIST Lookaside
,
881 Lookaside
->TotalFrees
++;
882 if (ExQueryDepthSList(&Lookaside
->ListHead
) >= Lookaside
->Depth
) {
883 Lookaside
->FreeMisses
++;
884 (Lookaside
->Free
)(Entry
);
886 InterlockedPushEntrySList(&Lookaside
->ListHead
, (PSLIST_ENTRY
)Entry
);
892 ExInitializeNPagedLookasideList (
893 PNPAGED_LOOKASIDE_LIST Lookaside
,
894 PALLOCATE_FUNCTION Allocate
,
904 ExInitializePagedLookasideList (
905 PPAGED_LOOKASIDE_LIST Lookaside
,
906 PALLOCATE_FUNCTION Allocate
,
915 ExfInterlockedAddUlong(IN PULONG Addend
,
917 IN PKSPIN_LOCK Lock
);
920 ExfInterlockedInsertHeadList(IN PLIST_ENTRY ListHead
,
921 IN PLIST_ENTRY ListEntry
,
922 IN PKSPIN_LOCK Lock
);
925 ExfInterlockedInsertTailList(IN PLIST_ENTRY ListHead
,
926 IN PLIST_ENTRY ListEntry
,
927 IN PKSPIN_LOCK Lock
);
929 PSINGLE_LIST_ENTRY FASTCALL
930 ExfInterlockedPopEntryList(IN PSINGLE_LIST_ENTRY ListHead
,
931 IN PKSPIN_LOCK Lock
);
933 PSINGLE_LIST_ENTRY FASTCALL
934 ExfInterlockedPushEntryList(IN PSINGLE_LIST_ENTRY ListHead
,
935 IN PSINGLE_LIST_ENTRY ListEntry
,
936 IN PKSPIN_LOCK Lock
);
939 ExfInterlockedRemoveHeadList(IN PLIST_ENTRY Head
,
940 IN PKSPIN_LOCK Lock
);
942 INTERLOCKED_RESULT FASTCALL
943 Exfi386InterlockedIncrementLong(IN PLONG Addend
);
945 INTERLOCKED_RESULT FASTCALL
946 Exfi386InterlockedDecrementLong(IN PLONG Addend
);
949 Exfi386InterlockedExchangeUlong(IN PULONG Target
,
952 INTERLOCKED_RESULT STDCALL
953 Exi386InterlockedIncrementLong(IN PLONG Addend
);
955 INTERLOCKED_RESULT STDCALL
956 Exi386InterlockedDecrementLong(IN PLONG Addend
);
959 Exi386InterlockedExchangeUlong(IN PULONG Target
,
965 InterlockedCompareExchange (
971 #ifdef _GNU_H_WINDOWS_H
972 #ifdef InterlockedDecrement
973 #undef InterlockedDecrement
974 #undef InterlockedExchange
975 #undef InterlockedExchangeAdd
976 #undef InterlockedIncrement
977 #endif /* def InterlockedDecrement */
978 #endif /* def _GNU_H_WINDOWS_H */
981 InterlockedDecrement (
986 InterlockedExchange (
992 InterlockedExchangeAdd (
998 InterlockedIncrement (
1002 #ifndef InterlockedExchangePointer
1004 # define InterlockedExchangePointer(__T__, __V__) \
1005 (PVOID)InterlockedExchange64((PLONGLONG)(__T__), (LONGLONG)(__V__))
1007 # define InterlockedExchangePointer(__T__, __V__) \
1008 (PVOID)InterlockedExchange((PLONG)(__T__), (LONG)(__V__))
1012 #ifndef InterlockedCompareExchangePointer
1014 # define InterlockedCompareExchangePointer(__T__, __V__, __C__) \
1015 (PVOID)InterlockedCompareExchange64((PLONGLONG)(__T__), (LONGLONG)(__V__), (LONGLONG)(__C__))
1017 # define InterlockedCompareExchangePointer(__T__, __V__, __C__) \
1018 (PVOID)InterlockedCompareExchange((PLONG)(__T__), (LONG)(__V__), (LONG)(__C__))
1036 #endif /* ndef _NTOS_EXFUNCS_H */