/* EXECUTIVE ROUTINES ******************************************************/
+#ifdef __NTOSKRNL__
+extern POBJECT_TYPE EXPORTED ExDesktopObjectType;
+extern POBJECT_TYPE EXPORTED ExEventObjectType;
+extern POBJECT_TYPE EXPORTED ExWindowStationObjectType;
+extern POBJECT_TYPE EXPORTED ExIoCompletionType;
+#else
+extern POBJECT_TYPE IMPORTED ExDesktopObjectType;
+extern POBJECT_TYPE IMPORTED ExEventObjectType;
+extern POBJECT_TYPE IMPORTED ExWindowStationObjectType;
+extern POBJECT_TYPE IMPORTED ExIoCompletionType;
+#endif
+
+#define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24))
+
VOID
FASTCALL
ExAcquireFastMutex (
BOOLEAN Wait
);
BOOLEAN
+FASTCALL
+ExAcquireRundownProtection (
+ IN PEX_RUNDOWN_REF RunRef
+ );
+BOOLEAN
+FASTCALL
+ExAcquireRundownProtectionEx (
+ IN PEX_RUNDOWN_REF RunRef,
+ IN ULONG Count
+ );
+PVOID
+FASTCALL
+ExfAcquirePushLockExclusive (
+ PVOID Lock
+ );
+PVOID
+FASTCALL
+ExfAcquirePushLockShared (
+ PVOID Lock
+ );
+PVOID
+FASTCALL
+ExfReleasePushLock (
+ PVOID Lock
+ );
+BOOLEAN
STDCALL
ExAcquireSharedStarveExclusive (
PERESOURCE Resource,
BOOLEAN Wait
);
-/*
- * PVOID
- * ExAllocateFromNPagedLookasideList (
- * PNPAGED_LOOKASIDE_LIST LookSide
- * );
- *
- * FUNCTION:
- * Removes (pops) the first entry from the specified nonpaged
- * lookaside list.
- *
- * ARGUMENTS:
- * Lookaside = Pointer to a nonpaged lookaside list
- *
- * RETURNS:
- * Address of the allocated list entry
- */
-static
-inline
-PVOID
-ExAllocateFromNPagedLookasideList (
- IN PNPAGED_LOOKASIDE_LIST Lookaside
- )
-{
-#if 0
- PVOID Entry;
-
- Lookaside->TotalAllocates++;
- Entry = ExInterlockedPopEntrySList (&Lookaside->ListHead,
- &Lookaside->Lock);
- if (Entry == NULL)
- {
- Lookaside->AllocateMisses++;
- Entry = (Lookaside->Allocate)(Lookaside->Type,
- Lookaside->Size,
- Lookaside->Tag);
- }
-
- return Entry;
-#endif
- return NULL;
-}
-
-PVOID
-STDCALL
-ExAllocateFromPagedLookasideList (
- PPAGED_LOOKASIDE_LIST LookSide
- );
PVOID
STDCALL
ExAllocateFromZone (
IN ULONG NumberOfBytes,
IN ULONG Tag
);
+
+PVOID
+NTAPI
+ExAllocatePoolWithTagPriority(
+ IN POOL_TYPE PoolType,
+ IN SIZE_T NumberOfBytes,
+ IN ULONG Tag,
+ IN EX_POOL_PRIORITY Priority
+ );
+
VOID
STDCALL
ExConvertExclusiveToSharedLite (
PERESOURCE Resource
);
-VOID
-STDCALL
-ExDeleteNPagedLookasideList (
- PNPAGED_LOOKASIDE_LIST Lookaside
- );
-VOID
+
+NTSTATUS
STDCALL
-ExDeletePagedLookasideList (
- PPAGED_LOOKASIDE_LIST Lookaside
+ExCreateCallback (
+ OUT PCALLBACK_OBJECT * CallbackObject,
+ IN POBJECT_ATTRIBUTES ObjectAttributes,
+ IN BOOLEAN Create,
+ IN BOOLEAN AllowMultipleCallbacks
);
+
NTSTATUS
STDCALL
ExDeleteResource (
ExDeleteResourceLite (
PERESOURCE Resource
);
+
+VOID
+STDCALL
+ExDisableResourceBoostLite (
+ PERESOURCE Resource
+ );
+
+VOID
+STDCALL
+ExEnumHandleTable (
+ PULONG HandleTable,
+ PVOID Callback,
+ PVOID Param,
+ PHANDLE Handle OPTIONAL
+ );
+
NTSTATUS
STDCALL
ExExtendZone (
PVOID block
);
-/*
- * VOID
- * ExFreeToNPagedLookasideList (
- * PNPAGED_LOOKASIDE_LIST Lookaside,
- * PVOID Entry
- * );
- *
- * FUNCTION:
- * Inserts (pushes) the specified entry into the specified
- * nonpaged lookaside list.
- *
- * ARGUMENTS:
- * Lookaside = Pointer to the nonpaged lookaside list
- * Entry = Pointer to the entry that is inserted in the lookaside list
- */
-static
-inline
-VOID
-ExFreeToNPagedLookasideList (
- IN PNPAGED_LOOKASIDE_LIST Lookaside,
- IN PVOID Entry
- )
-{
-#if 0
- Lookaside->TotalFrees++;
- if (ExQueryDepthSList (&Lookaside->ListHead) >= Lookaside->Depth)
- {
- Lookaside->FreeMisses++;
- (Lookaside->Free)(Entry);
- }
- else
- {
- ExInterlockedPushEntrySList (&Lookaside->ListHead,
- (PSINGLE_LIST_ENTRY)Entry,
- &Lookaside->Lock);
- }
-#endif
-}
-
-VOID
-STDCALL
-ExFreeToPagedLookasideList (
- PPAGED_LOOKASIDE_LIST Lookaside,
- PVOID Entry
- );
-
/*
* PVOID
* ExFreeToZone (
* );
*/
#define ExGetCurrentResourceThread() \
- ((ERESOURCE_THREAD)PsGetCurrentThread())
+ ((ERESOURCE_THREAD)KeGetCurrentThread())
+
+LONGLONG
+FASTCALL
+ExfInterlockedCompareExchange64(
+ IN OUT LONGLONG volatile *Destination,
+ IN PLONGLONG ExChange,
+ IN PLONGLONG Comperand
+ );
+
+VOID
+STDCALL
+ExGetCurrentProcessorCounts (
+ PULONG ThreadKernelTime,
+ PULONG TotalCpuTime,
+ PULONG ProcessorNumber
+);
+
+VOID
+STDCALL
+ExGetCurrentProcessorCpuUsage (
+ PULONG CpuUsage
+ );
ULONG
STDCALL
PERESOURCE Resource
);
+KPROCESSOR_MODE
+STDCALL
+ExGetPreviousMode (
+ VOID
+ );
+
ULONG
STDCALL
ExGetSharedWaiterCount (
* );
*/
#define ExInitializeFastMutex(_FastMutex) \
- (_FastMutex)->Count = 1; \
- (_FastMutex)->Owner = NULL; \
- (_FastMutex)->Contention = 0; \
- KeInitializeEvent(&(_FastMutex)->Event, \
+ ((PFAST_MUTEX)_FastMutex)->Count = 1; \
+ ((PFAST_MUTEX)_FastMutex)->Owner = NULL; \
+ ((PFAST_MUTEX)_FastMutex)->Contention = 0; \
+ KeInitializeEvent(&((PFAST_MUTEX)_FastMutex)->Event, \
SynchronizationEvent, \
FALSE);
-VOID
-STDCALL
-ExInitializeNPagedLookasideList (
- PNPAGED_LOOKASIDE_LIST Lookaside,
- PALLOCATE_FUNCTION Allocate,
- PFREE_FUNCTION Free,
- ULONG Flags,
- ULONG Size,
- ULONG Tag,
- USHORT Depth
- );
-VOID
-STDCALL
-ExInitializePagedLookasideList (
- PPAGED_LOOKASIDE_LIST Lookaside,
- PALLOCATE_FUNCTION Allocate,
- PFREE_FUNCTION Free,
- ULONG Flags,
- ULONG Size,
- ULONG Tag,
- USHORT Depth
- );
NTSTATUS
STDCALL
ExInitializeResource (
PERESOURCE Resource
);
+VOID
+FASTCALL
+ExInitializeRundownProtection (
+ IN PEX_RUNDOWN_REF RunRef
+ );
+
/*
* VOID
* ExInitializeSListHead (
* Routine = Routine to be called by the worker thread
* Context = Parameter to be passed to the callback
*/
-#define ExInitializeWorkItem(Item, Routine, Context) \
+#define ExInitializeWorkItem(Item, Routine, RoutineContext) \
ASSERT_IRQL(DISPATCH_LEVEL); \
(Item)->WorkerRoutine = (Routine); \
- (Item)->Parameter = (Context); \
- (Item)->List.Flink = NULL; \
- (Item)->List.Blink = NULL;
+ (Item)->Parameter = (RoutineContext); \
+ (Item)->List.Flink = NULL;
NTSTATUS
STDCALL
PVOID InitialSegment,
ULONG InitialSegmentSize
);
+
LARGE_INTEGER
STDCALL
ExInterlockedAddLargeInteger (
LARGE_INTEGER Increment,
PKSPIN_LOCK Lock
);
+
+VOID
+FASTCALL
+ExInterlockedAddLargeStatistic (
+ IN PLARGE_INTEGER Addend,
+ IN ULONG Increment
+ );
+
ULONG
STDCALL
ExInterlockedAddUlong (
#define ExInterlockedAllocateFromZone(Zone,Lock) \
(PVOID)ExInterlockedPopEntryList(&(Zone)->FreeList,Lock)
+LONGLONG
+FASTCALL
+ExInterlockedCompareExchange64 (
+ IN OUT PLONGLONG Destination,
+ IN PLONGLONG Exchange,
+ IN PLONGLONG Comparand,
+ IN PKSPIN_LOCK Lock
+ );
+
INTERLOCKED_RESULT
STDCALL
ExInterlockedDecrementLong (
PLONG Addend,
PKSPIN_LOCK Lock
);
+
ULONG
STDCALL
ExInterlockedExchangeUlong (
ULONG Value,
PKSPIN_LOCK Lock
);
+
NTSTATUS
STDCALL
ExInterlockedExtendZone (
PKSPIN_LOCK Lock
);
+PSLIST_ENTRY
+FASTCALL
+ExInterlockedFlushSList (
+ IN PSLIST_HEADER ListHead
+ );
+
/*
* PVOID
* ExInterlockedFreeToZone (
PKSPIN_LOCK Lock
);
PSINGLE_LIST_ENTRY
-STDCALL
+FASTCALL
ExInterlockedPopEntrySList (
PSLIST_HEADER ListHead,
PKSPIN_LOCK Lock
PKSPIN_LOCK Lock
);
PSINGLE_LIST_ENTRY
-STDCALL
+FASTCALL
ExInterlockedPushEntrySList (
PSLIST_HEADER ListHead,
PSINGLE_LIST_ENTRY ListEntry,
PKSPIN_LOCK Lock
);
-
-VOID
-ExInterlockedRemoveEntryList (
- PLIST_ENTRY ListHead,
- PLIST_ENTRY Entry,
- PKSPIN_LOCK Lock
- );
-
PLIST_ENTRY
STDCALL
ExInterlockedRemoveHeadList (
(((PUCHAR)(Object)>=(PUCHAR)(Zone)->SegmentList.Next) && \
((PUCHAR)(Object)<(PUCHAR)(Zone)->SegmentList.Next+(Zone)->TotalSegmentSize))
+BOOLEAN
+STDCALL
+ExIsProcessorFeaturePresent (
+ IN ULONG ProcessorFeature
+ );
+
BOOLEAN
STDCALL
ExIsResourceAcquiredExclusiveLite (
PERESOURCE Resource
);
-ULONG
+
+/* was ULONG */
+USHORT
STDCALL
ExIsResourceAcquiredSharedLite (
PERESOURCE Resource
);
+
VOID
STDCALL
ExLocalTimeToSystemTime (
PLARGE_INTEGER SystemTime
);
+VOID
+STDCALL
+ExNotifyCallback (
+ IN PCALLBACK_OBJECT CallbackObject,
+ IN PVOID Argument1,
+ IN PVOID Argument2
+ );
+
+VOID
+STDCALL
+ExPostSystemEvent (
+ ULONG Unknown1,
+ ULONG Unknown2,
+ ULONG Unknown3
+ );
+
/*
* USHORT
- * ExQueryDepthSListHead (
+ * ExQueryDepthSList (
* PSLIST_HEADER SListHead
* );
-*/
-#define ExQueryDepthSListHead(ListHead) \
+ */
+#define ExQueryDepthSList(ListHead) \
(USHORT)(ListHead)->Depth
VOID
PWORK_QUEUE_ITEM WorkItem,
WORK_QUEUE_TYPE QueueType
);
+
+SIZE_T
+STDCALL
+ExQueryPoolBlockSize (
+ IN PVOID PoolBlock,
+ OUT PBOOLEAN QuotaCharged
+ );
+
VOID
STDCALL
ExRaiseAccessViolation (
);
VOID
STDCALL
+ExRaiseException (
+ PEXCEPTION_RECORD pExcptRec
+ );
+VOID
+STDCALL
+ExRaiseHardError (
+ IN NTSTATUS ErrorStatus,
+ IN ULONG NumberOfParameters,
+ IN PUNICODE_STRING UnicodeStringParameterMask OPTIONAL,
+ IN PVOID *Parameters,
+ IN HARDERROR_RESPONSE_OPTION ResponseOption,
+ OUT PHARDERROR_RESPONSE Response
+ );
+
+PVOID
+STDCALL
+ExRegisterCallback (
+ IN PCALLBACK_OBJECT CallbackObject,
+ IN PCALLBACK_FUNCTION CallbackFunction,
+ IN PVOID CallbackContext
+ );
+
+VOID
+STDCALL
ExReinitializeResourceLite (
PERESOURCE Resource
);
+VOID
+FASTCALL
+ExReInitializeRundownProtection (
+ IN PEX_RUNDOWN_REF RunRef
+ );
+
/* ReactOS Specific: begin */
VOID
FASTCALL
(ExReleaseResourceLite (Resource))
VOID
-STDCALL
+FASTCALL
ExReleaseResourceLite (
PERESOURCE Resource
);
PERESOURCE Resource,
ERESOURCE_THREAD ResourceThreadId
);
+VOID
+FASTCALL
+ExReleaseRundownProtection (
+ IN PEX_RUNDOWN_REF RunRef
+ );
+VOID
+FASTCALL
+ExReleaseRundownProtectionEx (
+ IN PEX_RUNDOWN_REF RunRef,
+ IN ULONG Count
+ );
+/* ReactOS Specific: begin */
+VOID STDCALL
+ExRosDumpPagedPoolByTag (
+ IN ULONG Tag
+ );
+ULONG STDCALL
+ExRosQueryPoolTag (
+ IN PVOID Block
+ );
+/* ReactOS Specific: end */
+VOID
+FASTCALL
+ExRundownCompleted (
+ IN PEX_RUNDOWN_REF RunRef
+ );
+VOID
+STDCALL
+ExSetResourceOwnerPointer (
+ IN PERESOURCE Resource,
+ IN PVOID OwnerPointer
+ );
+
+VOID
+STDCALL
+ExSetTimerResolution (
+ IN ULONG DesiredTime,
+ IN BOOLEAN SetResolution
+ );
+
+BOOLEAN
+STDCALL
+ExVerifySuite(
+ SUITE_TYPE SuiteType
+ );
+
+BOOLEAN
+STDCALL
+ExSystemExceptionFilter();
+
VOID
STDCALL
ExSystemTimeToLocalTime (
PLARGE_INTEGER SystemTime,
PLARGE_INTEGER LocalTime
);
+
BOOLEAN
FASTCALL
ExTryToAcquireFastMutex (
PFAST_MUTEX FastMutex
);
+
BOOLEAN
STDCALL
ExTryToAcquireResourceExclusiveLite (
PERESOURCE Resource
);
-/*
-LONG
-FASTCALL
-InterlockedCompareExchange (
- PLONG Target,
- LONG Value,
- LONG Reference
+
+VOID
+STDCALL
+ExUnregisterCallback (
+ IN PVOID CallbackRegistration
);
-*/
+
+typedef GUID UUID;
+
+NTSTATUS
+STDCALL
+ExUuidCreate(
+ OUT UUID *Uuid
+ );
+
+VOID
+FASTCALL
+ExWaitForRundownProtectionRelease (
+ IN PEX_RUNDOWN_REF RunRef
+ );
+
+PSLIST_ENTRY
+FASTCALL
+InterlockedPopEntrySList (
+ IN PSLIST_HEADER ListHead
+ );
+
+PSLIST_ENTRY
+FASTCALL
+InterlockedPushEntrySList(
+ IN PSLIST_HEADER ListHead,
+ IN PSLIST_ENTRY ListEntry
+ );
+
+/*
+ * PVOID
+ * ExAllocateFromNPagedLookasideList (
+ * PNPAGED_LOOKASIDE_LIST LookSide
+ * );
+ *
+ * FUNCTION:
+ * Removes (pops) the first entry from the specified nonpaged
+ * lookaside list.
+ *
+ * ARGUMENTS:
+ * Lookaside = Pointer to a nonpaged lookaside list
+ *
+ * RETURNS:
+ * Address of the allocated list entry
+ */
+static
+inline
PVOID
+ExAllocateFromNPagedLookasideList (
+ IN PNPAGED_LOOKASIDE_LIST Lookaside
+ )
+{
+ PVOID Entry;
+
+ Lookaside->TotalAllocates++;
+ Entry = ExInterlockedPopEntrySList (&Lookaside->ListHead,
+ &Lookaside->Obsoleted);
+ if (Entry == NULL)
+ {
+ Lookaside->AllocateMisses++;
+ Entry = (Lookaside->Allocate)(Lookaside->Type,
+ Lookaside->Size,
+ Lookaside->Tag);
+ }
+
+ return Entry;
+}
+
+static inline PVOID
+ExAllocateFromPagedLookasideList(
+ IN PPAGED_LOOKASIDE_LIST Lookaside)
+{
+ PVOID Entry;
+
+ Lookaside->TotalAllocates++;
+ Entry = InterlockedPopEntrySList(&Lookaside->ListHead);
+ if (Entry == NULL) {
+ Lookaside->AllocateMisses++;
+ Entry = (Lookaside->Allocate)(Lookaside->Type,
+ Lookaside->Size, Lookaside->Tag);
+ }
+ return Entry;
+}
+
+VOID
+STDCALL
+ExDeleteNPagedLookasideList (
+ PNPAGED_LOOKASIDE_LIST Lookaside
+ );
+
+VOID
+STDCALL
+ExDeletePagedLookasideList (
+ PPAGED_LOOKASIDE_LIST Lookaside
+ );
+
+
+/*
+ * VOID
+ * ExFreeToNPagedLookasideList (
+ * PNPAGED_LOOKASIDE_LIST Lookaside,
+ * PVOID Entry
+ * );
+ *
+ * FUNCTION:
+ * Inserts (pushes) the specified entry into the specified
+ * nonpaged lookaside list.
+ *
+ * ARGUMENTS:
+ * Lookaside = Pointer to the nonpaged lookaside list
+ * Entry = Pointer to the entry that is inserted in the lookaside list
+ */
+static
+inline
+VOID
+ExFreeToNPagedLookasideList (
+ IN PNPAGED_LOOKASIDE_LIST Lookaside,
+ IN PVOID Entry
+ )
+{
+ Lookaside->TotalFrees++;
+ if (ExQueryDepthSList (&Lookaside->ListHead) >= Lookaside->Depth)
+ {
+ Lookaside->FreeMisses++;
+ (Lookaside->Free)(Entry);
+ }
+ else
+ {
+ ExInterlockedPushEntrySList (&Lookaside->ListHead,
+ (PSINGLE_LIST_ENTRY)Entry,
+ &Lookaside->Obsoleted);
+ }
+}
+
+static inline VOID
+ExFreeToPagedLookasideList(
+ IN PPAGED_LOOKASIDE_LIST Lookaside,
+ IN PVOID Entry)
+{
+ Lookaside->TotalFrees++;
+ if (ExQueryDepthSList(&Lookaside->ListHead) >= Lookaside->Depth) {
+ Lookaside->FreeMisses++;
+ (Lookaside->Free)(Entry);
+ } else {
+ InterlockedPushEntrySList(&Lookaside->ListHead, (PSLIST_ENTRY)Entry);
+ }
+}
+
+VOID
+STDCALL
+ExInitializeNPagedLookasideList (
+ PNPAGED_LOOKASIDE_LIST Lookaside,
+ PALLOCATE_FUNCTION Allocate,
+ PFREE_FUNCTION Free,
+ ULONG Flags,
+ ULONG Size,
+ ULONG Tag,
+ USHORT Depth
+ );
+
+VOID
+STDCALL
+ExInitializePagedLookasideList (
+ PPAGED_LOOKASIDE_LIST Lookaside,
+ PALLOCATE_FUNCTION Allocate,
+ PFREE_FUNCTION Free,
+ ULONG Flags,
+ ULONG Size,
+ ULONG Tag,
+ USHORT Depth
+ );
+
+ULONG FASTCALL
+ExfInterlockedAddUlong(IN PULONG Addend,
+ IN ULONG Increment,
+ IN PKSPIN_LOCK Lock);
+
+PLIST_ENTRY FASTCALL
+ExfInterlockedInsertHeadList(IN PLIST_ENTRY ListHead,
+ IN PLIST_ENTRY ListEntry,
+ IN PKSPIN_LOCK Lock);
+
+PLIST_ENTRY FASTCALL
+ExfInterlockedInsertTailList(IN PLIST_ENTRY ListHead,
+ IN PLIST_ENTRY ListEntry,
+ IN PKSPIN_LOCK Lock);
+
+PSINGLE_LIST_ENTRY FASTCALL
+ExfInterlockedPopEntryList(IN PSINGLE_LIST_ENTRY ListHead,
+ IN PKSPIN_LOCK Lock);
+
+PSINGLE_LIST_ENTRY FASTCALL
+ExfInterlockedPushEntryList(IN PSINGLE_LIST_ENTRY ListHead,
+ IN PSINGLE_LIST_ENTRY ListEntry,
+ IN PKSPIN_LOCK Lock);
+
+PLIST_ENTRY FASTCALL
+ExfInterlockedRemoveHeadList(IN PLIST_ENTRY Head,
+ IN PKSPIN_LOCK Lock);
+
+INTERLOCKED_RESULT FASTCALL
+Exfi386InterlockedIncrementLong(IN PLONG Addend);
+
+INTERLOCKED_RESULT FASTCALL
+Exfi386InterlockedDecrementLong(IN PLONG Addend);
+
+ULONG FASTCALL
+Exfi386InterlockedExchangeUlong(IN PULONG Target,
+ IN ULONG Value);
+
+INTERLOCKED_RESULT STDCALL
+Exi386InterlockedIncrementLong(IN PLONG Addend);
+
+INTERLOCKED_RESULT STDCALL
+Exi386InterlockedDecrementLong(IN PLONG Addend);
+
+ULONG STDCALL
+Exi386InterlockedExchangeUlong(IN PULONG Target,
+ IN ULONG Value);
+
+
+LONG
FASTCALL
InterlockedCompareExchange (
- PVOID * Destination,
- PVOID Exchange,
- PVOID Comperand
+ PLONG Destination,
+ LONG Exchange,
+ LONG Comperand
);
+
#ifdef _GNU_H_WINDOWS_H
#ifdef InterlockedDecrement
#undef InterlockedDecrement
PLONG Addend
);
+#ifndef InterlockedExchangePointer
+# ifdef _WIN64
+# define InterlockedExchangePointer(__T__, __V__) \
+ (PVOID)InterlockedExchange64((PLONGLONG)(__T__), (LONGLONG)(__V__))
+# else
+# define InterlockedExchangePointer(__T__, __V__) \
+ (PVOID)InterlockedExchange((PLONG)(__T__), (LONG)(__V__))
+# endif
+#endif
+
+#ifndef InterlockedCompareExchangePointer
+# ifdef _WIN64
+# define InterlockedCompareExchangePointer(__T__, __V__, __C__) \
+ (PVOID)InterlockedCompareExchange64((PLONGLONG)(__T__), (LONGLONG)(__V__), (LONGLONG)(__C__))
+# else
+# define InterlockedCompareExchangePointer(__T__, __V__, __C__) \
+ (PVOID)InterlockedCompareExchange((PLONG)(__T__), (LONG)(__V__), (LONG)(__C__))
+# endif
+#endif
+
/*---*/
typedef
unsigned int
-(exception_hook) (
+(*exception_hook) (
CONTEXT * c,
unsigned int exp
);