ExInitializeWorkItem: synch with Windows (only NULL the Flink)
[reactos.git] / reactos / include / ddk / exfuncs.h
index 026f90c..3557b5d 100644 (file)
@@ -3,6 +3,18 @@
 
 /* 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
@@ -34,6 +46,32 @@ ExAcquireResourceSharedLite (
        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,
@@ -108,6 +146,15 @@ ExAllocatePoolWithTag (
        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 (
@@ -140,6 +187,15 @@ ExDisableResourceBoostLite (
        PERESOURCE      Resource
        );
 
+VOID
+STDCALL
+ExEnumHandleTable (
+       PULONG  HandleTable,
+       PVOID   Callback,
+       PVOID   Param,
+       PHANDLE Handle OPTIONAL
+       );
+
 NTSTATUS
 STDCALL
 ExExtendZone (
@@ -187,13 +243,35 @@ ExFreePool (
 #define ExGetCurrentResourceThread() \
        ((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
 ExGetExclusiveWaiterCount (
        PERESOURCE      Resource
        );
 
-ULONG
+KPROCESSOR_MODE
 STDCALL
 ExGetPreviousMode (
        VOID
@@ -230,6 +308,12 @@ ExInitializeResourceLite (
        PERESOURCE      Resource
        );
 
+VOID
+FASTCALL
+ExInitializeRundownProtection (
+    IN PEX_RUNDOWN_REF RunRef
+    );
+
 /*
  * VOID
  * ExInitializeSListHead (
@@ -256,12 +340,11 @@ ExInitializeResourceLite (
  *     Routine = Routine to be called by the worker thread
  *     Context = Parameter to be passed to the callback
  */
-#define ExInitializeWorkItem(Item, WorkerRoutine, RoutineContext) \
+#define ExInitializeWorkItem(Item, Routine, RoutineContext) \
        ASSERT_IRQL(DISPATCH_LEVEL); \
-       (Item)->Routine = (WorkerRoutine); \
-       (Item)->Context = (RoutineContext); \
-       (Item)->Entry.Flink = NULL; \
-       (Item)->Entry.Blink = NULL;
+       (Item)->WorkerRoutine = (Routine); \
+       (Item)->Parameter = (RoutineContext); \
+       (Item)->List.Flink = NULL;
 
 NTSTATUS
 STDCALL
@@ -321,6 +404,7 @@ ExInterlockedDecrementLong (
        PLONG           Addend,
        PKSPIN_LOCK     Lock
        );
+
 ULONG
 STDCALL
 ExInterlockedExchangeUlong (
@@ -328,6 +412,7 @@ ExInterlockedExchangeUlong (
        ULONG           Value,
        PKSPIN_LOCK     Lock
        );
+
 NTSTATUS
 STDCALL
 ExInterlockedExtendZone (
@@ -337,6 +422,12 @@ ExInterlockedExtendZone (
        PKSPIN_LOCK     Lock
        );
 
+PSLIST_ENTRY
+FASTCALL
+ExInterlockedFlushSList (
+    IN PSLIST_HEADER ListHead
+    );
+
 /*
  * PVOID
  * ExInterlockedFreeToZone (
@@ -394,14 +485,6 @@ ExInterlockedPushEntrySList (
        PSINGLE_LIST_ENTRY      ListEntry,
        PKSPIN_LOCK             Lock
        );
-
-VOID
-ExInterlockedRemoveEntryList (
-       PLIST_ENTRY     ListHead,
-       PLIST_ENTRY     Entry,
-       PKSPIN_LOCK     Lock
-       );
-
 PLIST_ENTRY
 STDCALL
 ExInterlockedRemoveHeadList (
@@ -441,7 +524,8 @@ ExIsResourceAcquiredExclusiveLite (
        PERESOURCE      Resource
        );
 
-ULONG
+/* was ULONG */
+USHORT
 STDCALL
 ExIsResourceAcquiredSharedLite (
        PERESOURCE      Resource
@@ -457,7 +541,7 @@ ExLocalTimeToSystemTime (
 VOID
 STDCALL
 ExNotifyCallback (
-       IN      PVOID   CallbackObject,
+       IN      PCALLBACK_OBJECT        CallbackObject,
        IN      PVOID   Argument1,
        IN      PVOID   Argument2
        );
@@ -477,7 +561,7 @@ ExPostSystemEvent (
  *     );
  */
 #define ExQueryDepthSList(ListHead) \
-       (USHORT)(ListHead)->s.Depth
+       (USHORT)(ListHead)->Depth
 
 VOID
 STDCALL
@@ -485,6 +569,14 @@ ExQueueWorkItem (
        PWORK_QUEUE_ITEM        WorkItem,
        WORK_QUEUE_TYPE         QueueType
        );
+
+SIZE_T
+STDCALL
+ExQueryPoolBlockSize (                          
+    IN PVOID PoolBlock,                         
+    OUT PBOOLEAN QuotaCharged                   
+    );  
+
 VOID
 STDCALL
 ExRaiseAccessViolation (
@@ -500,6 +592,21 @@ STDCALL
 ExRaiseStatus (
        NTSTATUS        Status
        );
+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
@@ -514,6 +621,12 @@ STDCALL
 ExReinitializeResourceLite (
        PERESOURCE      Resource
        );
+VOID
+FASTCALL
+ExReInitializeRundownProtection (
+    IN PEX_RUNDOWN_REF RunRef
+    );
+
 /* ReactOS Specific: begin */
 VOID
 FASTCALL
@@ -553,7 +666,32 @@ ExReleaseResourceForThreadLite (
        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 (
@@ -561,6 +699,23 @@ ExSetResourceOwnerPointer (
        IN      PVOID           OwnerPointer
        );
 
+VOID
+STDCALL
+ExSetTimerResolution (
+    IN ULONG DesiredTime,
+    IN BOOLEAN SetResolution
+    );
+
+BOOLEAN
+STDCALL
+ExVerifySuite(
+    SUITE_TYPE SuiteType
+    );
+
+BOOLEAN
+STDCALL
+ExSystemExceptionFilter();
+
 VOID
 STDCALL
 ExSystemTimeToLocalTime (
@@ -586,6 +741,32 @@ 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
@@ -614,7 +795,7 @@ ExAllocateFromNPagedLookasideList (
 
        Lookaside->TotalAllocates++;
        Entry = ExInterlockedPopEntrySList (&Lookaside->ListHead,
-                                           &Lookaside->Lock);
+                                           &Lookaside->Obsoleted);
        if (Entry == NULL)
        {
                Lookaside->AllocateMisses++;
@@ -626,11 +807,21 @@ ExAllocateFromNPagedLookasideList (
   return Entry;
 }
 
-PVOID
-STDCALL
-ExAllocateFromPagedLookasideList (
-       PPAGED_LOOKASIDE_LIST   LookSide
-       );
+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
@@ -669,7 +860,7 @@ ExFreeToNPagedLookasideList (
        )
 {
        Lookaside->TotalFrees++;
-       if (ExQueryDepthSList (&Lookaside->ListHead) >= Lookaside->MinimumDepth)
+       if (ExQueryDepthSList (&Lookaside->ListHead) >= Lookaside->Depth)
        {
                Lookaside->FreeMisses++;
                (Lookaside->Free)(Entry);
@@ -678,16 +869,23 @@ ExFreeToNPagedLookasideList (
        {
                ExInterlockedPushEntrySList (&Lookaside->ListHead,
                                             (PSINGLE_LIST_ENTRY)Entry,
-                                            &Lookaside->Lock);
+                                            &Lookaside->Obsoleted);
        }
 }
 
-VOID
-STDCALL
-ExFreeToPagedLookasideList (
-       PPAGED_LOOKASIDE_LIST   Lookaside,
-       PVOID                   Entry
-       );
+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
@@ -801,14 +999,31 @@ InterlockedIncrement (
        PLONG   Addend
        );
 
-#define InterlockedExchangePointer(__T__, __V__) \
- (PVOID)InterlockedExchange((PLONG)(__T__), (LONG)(__V__))
+#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
        );
@@ -818,98 +1033,4 @@ ExHookException (
        unsigned int    exp
        );
 
-/* BEGIN REACTOS ONLY */
-
-BOOLEAN STDCALL
-ExInitializeBinaryTree(IN PBINARY_TREE  Tree,
-  IN PKEY_COMPARATOR  Compare,
-  IN BOOLEAN  UseNonPagedPool);
-
-VOID STDCALL
-ExDeleteBinaryTree(IN PBINARY_TREE  Tree);
-
-VOID STDCALL
-ExInsertBinaryTree(IN PBINARY_TREE  Tree,
-  IN PVOID  Key,
-  IN PVOID  Value);
-
-BOOLEAN STDCALL
-ExSearchBinaryTree(IN PBINARY_TREE  Tree,
-  IN PVOID  Key,
-  OUT PVOID  * Value);
-
-BOOLEAN STDCALL
-ExRemoveBinaryTree(IN PBINARY_TREE  Tree,
-  IN PVOID  Key,
-  IN PVOID  * Value);
-
-BOOLEAN STDCALL
-ExTraverseBinaryTree(IN PBINARY_TREE  Tree,
-  IN TRAVERSE_METHOD  Method,
-  IN PTRAVERSE_ROUTINE  Routine,
-  IN PVOID  Context);
-
-BOOLEAN STDCALL
-ExInitializeSplayTree(IN PSPLAY_TREE  Tree,
-  IN PKEY_COMPARATOR  Compare,
-  IN BOOLEAN  Weighted,
-  IN BOOLEAN  UseNonPagedPool);
-
-VOID STDCALL
-ExDeleteSplayTree(IN PSPLAY_TREE  Tree);
-
-VOID STDCALL
-ExInsertSplayTree(IN PSPLAY_TREE  Tree,
-  IN PVOID  Key,
-  IN PVOID  Value);
-
-BOOLEAN STDCALL
-ExSearchSplayTree(IN PSPLAY_TREE  Tree,
-  IN PVOID  Key,
-  OUT PVOID  * Value);
-
-BOOLEAN STDCALL
-ExRemoveSplayTree(IN PSPLAY_TREE  Tree,
-  IN PVOID  Key,
-  IN PVOID  * Value);
-
-BOOLEAN STDCALL
-ExWeightOfSplayTree(IN PSPLAY_TREE  Tree,
-  OUT PULONG  Weight);
-
-BOOLEAN STDCALL
-ExTraverseSplayTree(IN PSPLAY_TREE  Tree,
-  IN TRAVERSE_METHOD  Method,
-  IN PTRAVERSE_ROUTINE  Routine,
-  IN PVOID  Context);
-
-BOOLEAN STDCALL
-ExInitializeHashTable(IN PHASH_TABLE  HashTable,
-  IN ULONG  HashTableSize,
-  IN PKEY_COMPARATOR  Compare  OPTIONAL,
-  IN BOOLEAN  UseNonPagedPool);
-
-VOID STDCALL
-ExDeleteHashTable(IN PHASH_TABLE  HashTable);
-
-VOID STDCALL
-ExInsertHashTable(IN PHASH_TABLE  HashTable,
-  IN PVOID  Key,
-  IN ULONG  KeyLength,
-  IN PVOID  Value);
-
-BOOLEAN STDCALL
-ExSearchHashTable(IN PHASH_TABLE  HashTable,
-  IN PVOID  Key,
-  IN ULONG  KeyLength,
-  OUT PVOID  * Value);
-
-BOOLEAN STDCALL
-ExRemoveHashTable(IN PHASH_TABLE  HashTable,
-  IN PVOID  Key,
-  IN ULONG  KeyLength,
-  IN PVOID  * Value);
-
-/* END REACTOS ONLY */
-
 #endif /* ndef _NTOS_EXFUNCS_H */