ExInitializeWorkItem: synch with Windows (only NULL the Flink)
[reactos.git] / reactos / include / ddk / exfuncs.h
index f133a55..3557b5d 100644 (file)
@@ -3,6 +3,20 @@
 
 /* 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 (
@@ -32,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,
@@ -44,53 +84,6 @@ ExAcquireSharedWaitForExclusive (
        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 (
@@ -152,21 +145,31 @@ ExAllocatePoolWithTag (
        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 (
@@ -177,6 +180,22 @@ STDCALL
 ExDeleteResourceLite (
        PERESOURCE      Resource
        );
+
+VOID
+STDCALL
+ExDisableResourceBoostLite (
+       PERESOURCE      Resource
+       );
+
+VOID
+STDCALL
+ExEnumHandleTable (
+       PULONG  HandleTable,
+       PVOID   Callback,
+       PVOID   Param,
+       PHANDLE Handle OPTIONAL
+       );
+
 NTSTATUS
 STDCALL
 ExExtendZone (
@@ -196,52 +215,6 @@ ExFreePool (
        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 (
@@ -268,7 +241,29 @@ ExFreeToPagedLookasideList (
  *     );
  */
 #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
@@ -276,6 +271,12 @@ ExGetExclusiveWaiterCount (
        PERESOURCE      Resource
        );
 
+KPROCESSOR_MODE
+STDCALL
+ExGetPreviousMode (
+       VOID
+       );
+
 ULONG
 STDCALL
 ExGetSharedWaiterCount (
@@ -289,35 +290,13 @@ 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 (
@@ -329,6 +308,12 @@ ExInitializeResourceLite (
        PERESOURCE      Resource
        );
 
+VOID
+FASTCALL
+ExInitializeRundownProtection (
+    IN PEX_RUNDOWN_REF RunRef
+    );
+
 /*
  * VOID
  * ExInitializeSListHead (
@@ -355,12 +340,11 @@ ExInitializeResourceLite (
  *     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
@@ -370,6 +354,7 @@ ExInitializeZone (
        PVOID           InitialSegment,
        ULONG           InitialSegmentSize
        );
+
 LARGE_INTEGER
 STDCALL
 ExInterlockedAddLargeInteger (
@@ -377,6 +362,14 @@ ExInterlockedAddLargeInteger (
        LARGE_INTEGER   Increment,
        PKSPIN_LOCK     Lock
        );
+
+VOID
+FASTCALL
+ExInterlockedAddLargeStatistic (
+       IN      PLARGE_INTEGER  Addend,
+       IN      ULONG           Increment
+       );
+
 ULONG
 STDCALL
 ExInterlockedAddUlong (
@@ -396,12 +389,22 @@ 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 (
@@ -409,6 +412,7 @@ ExInterlockedExchangeUlong (
        ULONG           Value,
        PKSPIN_LOCK     Lock
        );
+
 NTSTATUS
 STDCALL
 ExInterlockedExtendZone (
@@ -418,6 +422,12 @@ ExInterlockedExtendZone (
        PKSPIN_LOCK     Lock
        );
 
+PSLIST_ENTRY
+FASTCALL
+ExInterlockedFlushSList (
+    IN PSLIST_HEADER ListHead
+    );
+
 /*
  * PVOID
  * ExInterlockedFreeToZone (
@@ -456,7 +466,7 @@ ExInterlockedPopEntryList (
        PKSPIN_LOCK             Lock
        );
 PSINGLE_LIST_ENTRY
-STDCALL
+FASTCALL
 ExInterlockedPopEntrySList (
        PSLIST_HEADER   ListHead,
        PKSPIN_LOCK     Lock
@@ -469,20 +479,12 @@ ExInterlockedPushEntryList (
        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 (
@@ -510,16 +512,25 @@ 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 (
@@ -527,13 +538,29 @@ 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
@@ -542,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 (
@@ -559,9 +594,39 @@ ExRaiseStatus (
        );
 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
@@ -585,7 +650,7 @@ ExReleaseResource (
        (ExReleaseResourceLite (Resource))
 
 VOID
-STDCALL
+FASTCALL
 ExReleaseResourceLite (
        PERESOURCE      Resource
        );
@@ -601,38 +666,308 @@ 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 (
+       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
@@ -664,11 +999,31 @@ InterlockedIncrement (
        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
        );